perlのDBIからmysqlにINSERTINTOをやっても追加されない

このQ&Aのポイント
  • DBIを組み込んだCGIを実行してみてもエラーはでないのですが、DBへの追加ができていません。
  • 色々とやってみたのですが、どうしても追加ができません。考えられる要因があれば教えてください、お願いします。
  • 本当に困っています。どうかお助けください。
回答を見る
  • ベストアンサー

perlのDBIからmysqlにINSERTINTOをやっても追加されない。help!!

助けてください、お願いします。 phpadminで管理しているmysqlのDBへ、perlのDBIモジュールを使ってレコードの追加(INSERTINTO)をやっても、phpadminでDBをみてみると追加されていません。 DBIを組み込んだCGIを実行してみてもエラーはでないのですが、DBへの追加ができていません。 色々とやってみたのですが、どうしても追加ができません。考えられる要因があれば教えてください、お願いします。ソースは以下の通りです。 use DBI; $dbh=DBI->connect('DBI:mysql:データベース名:サーバホスト','ユーザ名','パスワード') or die $DBI::errstr; $sthandler = $dbh->prepare("INSERT INTO `table名` (`姓`, `名`, `メールアドレス`, `年齢`) VALUES ('名字', '名前', 'mailaddress', '0')"); $sthandler->execute; $sthandler->finish(); $dbh->commit; $dbh->rollback; $dbh->disconnect; 本当に困っています。どうかお助けください。

  • MySQL
  • 回答数4
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

こんにちは。 1.データベースとの接続はちゃんとできている。 2.SQL文ではこけていない。 という前提で・・・、 # DBIモジュールの読み込み use DBI; # 接続 $dbh=DBI->connect('DBI:mysql: 略'); # INSERT文発行 $sth = $dbh->prepare("INSERT INTO 略"); # SQL実行 $sth->execute; # 開放 $sth->finish; # AUTO COMMITがOFFの場合はCOMMITが必要 $dbh->commit; # 切断 $dbh->disconnect; の順番でいいはずですよ。 (^^ゞ

logicalpinky
質問者

補足

お返事ありがとうございますtaka451213さん。 言われてとうりにやってみたのですが、やはりテーブルへの追加ができません。追加だけでなく削除などもやってみましたが、やはりDBに変化はありませんでした。接続がうまくいってないのでしょうか? use DBI; $dbh=DBI->connect('DBI:mysql: 略'); $sth = $dbh->prepare("INSERT INTO 略"); $sth->execute; $sth->finish; $dbh->commit; $dbh->disconnect; の下に print "成功"; と書いていて、それはちゃんとブラウザで表示されます。エラーメッセージは出てきません。 それでもCGIを実行してもDBには全く変化ありません。 本当に何がいけないのかわかりません。どんな初歩的なものでもかまいませんので、考えられるミスを教えてください。徹底的に検証してみたいと思います。 それと僕はレンタルサーバで提供されてるphpmyadminというDB管理ツールを使っているわけですが、「リレーション機能を動かすためのリンクテーブルが有効になっていません。」と出てきました。何か関係があるのでしょうか? perlでのDB操作は初めてで、わからないことが多く迷惑をおかけします。 僕はHTMLフォームから受け取った名前などDBのテーブルに追加するというのが、今の所の目標です。 どうかお助けください。お願いします。

その他の回答 (3)

回答No.4

こんばんは。 うーん、おかしいところは特にないですねぇ。 SQLは怪しそうですが・・・。 INSERT文自体は問題ないんですよね? (ダブルコーテーションの内側だけをコンソールから流したら、INSERTされますよね?) 後はエラーですが、「500Internal Server Error」なんですよね? これもちょっと変かなぁ・・・。 >>データベースをperlから操作するために、学ぶべきいいサイトがあればぜひ教えてください。お願いします。 これがなかなか・・・。 どこも似たような内容ですよ。 logicalpinkyさんの場合は、記述は間違ってないので、ほかの所を疑った方がいですよ。 あんまりアドバイスできなくてすみません・・・。 (^^ゞ

logicalpinky
質問者

お礼

こんにちはtaka451213さん。 解決しました!! しかし、これが不思議なんです!! 「追加はされないが、エラーがでない」ソースを、エディタにコピペして、SELECTなどにソースを変更してエラーが出たら、その変更したソースを全部消して、エディタから「追加されないが、エラーがでない」ソースを持ってきて全文貼り付けしてから、「よし、一応エラーは出ないが、追加はされない状態に戻したぞ。さてまた考えるか。」といった作業を、ここ2週間繰り返していたのです。 そして今日、またエラーが出るようになり、いつもどうり「また、エラーは出ないが、追加もされない状態に一応戻しとくか。」とエディタからソースをもってきて貼り付けたのです。(僕はエラーが出る状態のままにして、眠りにつくのが嫌なんです。) すると!!画面確認のためCGIを実行したら、DBに値が追加されたのです。 もう何がなんだかわかりません。今だにどうして追加されなかったかわかりません。原因不明です。 ともあれCGIがちゃんと働いてくれるようになったので、感謝の言葉をお伝えします。 ありがとうございました。 初心者である僕に、何度もアドバイスをくれたことを感謝します。 またわからないことが出てきたときは、またよろしくお願いします。 本当にありがとうございました。

回答No.3

こんにちは。 >>接続がうまくいってないのでしょうか? SELECT文で、データの取得はできているのでしょうか? CGIで取得したデータ(1つでいい)をHTMLに書き出してみてください。 後は変数の中を書き出して、その時に何が入っているかを見てみましょう。 どこがおかしいかは、切り分けないとわからないので・・・。 手間がかかりますが、やってみてください。 (^^ゞ

logicalpinky
質問者

補足

こんにちはtaka451213さん。 あるサイトのソースコードをみて下のようにやってみました。 use DBI; print "Content-type: text/html\n\n"; print "<html><body>test => "; $dbh=DBI->connect("DBI:mysql:データベース名:ホスト名", "ユーザ名", "パス") || die $DBI::errstr; if(!$dbh){ print "接続失敗\n"; }else{ print "接続成功\n"; # INSERT文発行 $sth = $dbh->prepare("INSERT INTO '顧客リスト' ('姓','名','メールアドレス','購入回数') VALUE ('田中','太郎','mailaddress','0')"); #実行 $sth->execute; # 開放 $sth->finish; # AUTO COMMITがOFFの場合はCOMMITが必要 $dbh->commit; # 切断 $dbh->disconnect; } print "</body></html>\n"; とやってみると、接続成功とでました。接続はうまくいってるということですかね??いぜんDBに追加はされませんが・・・。 INSERTの部分をSELECTに変えてやってみたのですが、500Internal Server Errorになります。多分SELECTの文法が間違っているのだと思います。色々なサイトを見てやってみたのですが、SELECTは、いまいちよくわかりません。 今はフォームから値を受け取るのではなく、はじめからCGIの中に上のソースのように値をいれて状態で、ブラウザ上(アドレスのところにURLを入れて)から実行しています。 SELECT自体、自信がないので何とも言えません。 データベースをperlから操作するために、学ぶべきいいサイトがあればぜひ教えてください。お願いします。

回答No.1

こんにちは。 finishしてからcommitしてrollbackしてるんですか??? (^^ゞ

logicalpinky
質問者

補足

お返事ありがとうございます。 データベースへのDBI操作がはじめてで、うまくいきません。上のソースをcommitしてrollbackして、finishしても、テーブルに追加されませんでした。 色々なwebページの通りにやってみたのですが、どうしてもできなくて本当に困っています。 だれかよろしければ、DBIを使ったデータベース接続から、レコード追加して、接続遮断までの方法を教えてください。お願いします。

関連するQ&A

  • perlとDBIについて

    use DBI; #ユーザー名 $DBusr = 'ユーザー名'; #パスワード $DBpass = 'パスワード'; #DB名 $DB = 'DBI:mysql:データベース名:localhost'; #テーブル名 $DBtable = 'テーブル名; $dbh = DBI->connect($DB, $DBusr, $DBpass); if($syoujyou ne "" && $geninn ne "" && $taisyo ne ""){ $INSERT = $dbh -> prepare("INSERT INTO $DBtable (syurui,syoujyou,geninn,taisyo) VALUES ('$syurui','$syoujyou','$geninn','$taisyo')"); $INSERT -> execute(); $INSERT -> finish; } $dbh->disconnect; としているのですが、データ内容がデータベースに受けわたりません。 データベースに直接 INSERT INTO $DBtable (syurui,syoujyou,geninn,taisyo) VALUES ('aaaa','bbbb','cccc','dddd'); とすればデータは入ります。 DBI構文の書き方が可笑しいのでしょうか? 詳しい方ご教授お願い致します。

  • MySQLのトランザクションについて

    初めて質問します。 今、PerlのDBIを使ってMySQLのトランザクション処理にチャレンジしています。 ところが、rollback処理がうまくできません。 具体的には、 table2 がある状態で下のプログラムを動かすと、 エラーの表示が出るのに、 table1 は作成されました。 何らかのエラーがあれば、どちらも作成されないようにしたいです。 ======================================================= my %sql; $sql{db_name} = "database"; $sql{host} = "localhost"; $sql{user_name} = "user_name"; $sql{password} = "password"; use DBI; my $dbh = DBI->connect('DBI:mysql:'.$sql{db_name}.':'.$sql{host}, $sql{user_name}, $sql{password} ,{RaiseError => 1, PrintError => 0, AutoCommit => 0 }) || &Err(); my $sth; my $re; eval { my $sql_string1 = "create table table1(`id` int);"; my $sql_string2 = "create table table2(`id` int);"; $sth = $dbh->prepare($sql_string1); $re = $sth->execute; $sth = $dbh->prepare($sql_string2); $re = $sth->execute; }; if ($@) { $tag="Err:".$@."\n"; $sth = $dbh->rollback; }else{ $sth = $dbh->commit; } $sth->finish; $dbh->disconnect; ======================================================= 検索して、いろいろいじっても解決しませんでした。 どうかよろしくお願いします。

    • ベストアンサー
    • Perl
  • perlからmysqlに接続できない

    #! c:/perl/bin/perl  use DBI; $user = 'root'; $passwd = 'パスワード'; $db = DBI->connect('DBI:mysql:db1:localhost', $user, $passwd); $sth = $db->prepare("INSERT INTO bunrui VALUES (1,'1st','memo')"); $sth->execute; $sth->finish; $db->disconnect; perlからmysql二接続するためDBIをインストールして、上のようなサンプルコードを実行してみたのですが Internal Server Error になってしまいます。どこかコードが違っているのでしょうか?

    • ベストアンサー
    • Perl
  • perl+mysqlで変数が使えなくて困ってます。

    use DBI; $id=1; $nm="gootarou"; $mm="friend"; $user = '***'; $passwd = '***'; $db = 'DBI:mysql:***'; $dbh = DBI->connect($db, $user, $passwd); $sth = $dbh->prepare("INSERT INTO list (id,name,memo) VALUES ($id,$nm,$mm)"); $sth -> execute; $sth -> finish; $dbh -> disconnect; exit; mysqlの勉強を始めたところでいきなり壁にぶちあたってしまいました^^; googleその他で検索かけてみましたが解決に至りませんでしたので 質問させてください。 >$sth = $dbh->prepare("INSERT INTO list (id,name,memo) VALUES ($id,$nm,$mm)"); ↑ここの部分を >$sth = $dbh->prepare("INSERT INTO list (id,name,memo) VALUES ('1','gootarou','friend')"); と直接入力してやれば問題なく登録されるのですが、変数を使うと正常に処理がされません。 数字を変数に代入したものは大丈夫なのですが 英字や二バイト文字を変数に代入したものが問題あるようです。 それぞれのフォームの型はvarchar(100)で設定しています。 ループで一括処理したいのですが変数が使えないことには・・と困ってます。 よろしくお願いします。

  • perlを使ってレコード件数を取り出してみると、すごい数が・・・。

    perlのDBIモジュールを使って、mysqlのレコード件数を表示させてみると、すごい数が表示されました。ソースは以下の通りです。 use DBI; $dbh=DBI->connect("DBI:mysql:データベース名:サーバ名", "ユーザ名", "パスワード") || die $DBI::errstr; if(!$dbh){ print "エラーです。入力を確認してください。"; exit; }else{ #接続成功 # SELECT文発行 $sth=$dbh->prepare("SELECT sei, mei, mail FROM table"); #実行 $sth->execute; $num_rows = $sth->rows; print "該当 $num_rows, 件\n"; # 開放 $sth->finish; # AUTO COMMITがOFFの場合はCOMMITが必要 $dbh->commit; # 切断 $dbh->disconnect; } 実行すると該当 4294967294, 件 とブラウザに表示されました。僕はレンタルサーバを使っているわけですが、僕のデータベースにはレコードは3件しかないのです。これはレンタルサーバのデータベースすべての件数が表示されているのでしょうか? なんだかSQLを実行するのが怖いので、考えられる原因を教えてください。よろしくお願いします。 プログラムを初めてまだ、数ヶ月しか経ってない初心者なので、みなさんの知恵を貸していただけると幸いです。

    • ベストアンサー
    • MySQL
  • Mysqlの接続について

    現在、以下のようなperlのスクリプトを作っているのですが、mysqlへの接続,切断は以下の場合、どちらにした方がいいのでしょうか? (1)の場合 use DBI; $dsn="DBI:mysql:database=dbname:host=localhost"; $dbh=DBI->connect($dsn,'user','pass'); $sth = $dbh->prepare("SELECT no,title,name,date,host From `table1` where no='1'"); $sth->execute; $sth->fetchrow_array; $sth->finish; $sth2 = $dbh->prepare("SELECT no,title,name,date,host From `table2` where no='1'"); $sth2->execute; $sth2->fetchrow_array; $sth2->finish; $dbh->disconnect; (2)の場合 use DBI; $dsn="DBI:mysql:database=dbname:host=localhost"; $dbh=DBI->connect($dsn,'user','pass'); $sth = $dbh->prepare("SELECT no,title,name,date,host From `table1` where no='1'"); $sth->execute; $sth->fetchrow_array; $sth->finish; $dbh->disconnect; $dsn="DBI:mysql:database=dbname:host=localhost"; $dbh=DBI->connect($dsn,'user','pass'); $sth2 = $dbh->prepare("SELECT no,title,name,date,host From `table2` where no='1'"); $sth2->execute; $sth2->fetchrow_array; $sth2->finish; $dbh->disconnect; (1)の場合と(2)の場合の違いは、(1)の場合、最初にデータベースに接続して、一番最後に切断する事で、(2)の場合、毎回データベースへの接続と切断を行う事が違います。 (2)の場合、毎回接続と切断を行うので、2回ほどではあまり変わらないかもしれないのですが、もし10回とか接続と切断を行うとかなり負荷が高くなるような気がするのですが、他のHPなどを拝見すると接続をしたら切断を行うように癖をつけるようにした方がいいと書かれていたりします。 どちらの方が正しいやり方というか、負荷がすくなく使えるのでしょうか?

    • ベストアンサー
    • Perl
  • perlでdb(mysql)に接続

    perlでdb(mysql)に接続し、取得したデータを 表示させるというようなことをしたいのですが、うまく いきません。 ファイル名test.cgi mysqlのバージョンは 5.0.45で 記述は以下です。 #!/usr/bin/perl use DBI; my $dbh = DBI->connect("DBI:mysql:database, "userid", "password"); my $sth = $dbh->prepare('SELECT * FROM tablename'); $sth->execute; print "Content-Type: text/plain\n\n"; print "\n"; while(my @row = $sth->fetchrow_array) { print "$row[0]:$row[1]\n"; } $sth->finish(); $dbh->disconnect(); exit; ブラウザで確認すると何も表示されず、ログとして 以下のエラーが確認できます。 DBD::mysql::st execute failed: Table 'database.tablename' doesn't exist at test.cgi line 8. DBD::mysql::st fetchrow_array failed: fetch() without execute() at test.cgi line 11. my $sth = $dbh->prepare('SELECT * FROM tablename'); で指定したテーブルは存在しておりますし、SQL文の記述も 問題ないと思われます。 また、ファイルのパーミッションは705(755でも同様の結果)です。 perl初心者のため、どこが問題なのか検討がつきません。 ご助言いただきたく存じます。 よろしくお願いいたします!

    • ベストアンサー
    • Perl
  • MYSQL 4.1 の余計なエスケープ処理

    おはようございます。PERL 5.8.5 からMYSQL4.1 サーバーへのデータINSERT 時の文字変換処理について教えてください。 MYSQL 4.1 の文字コードは次の通りです。 SHOW VARIABLES LIKE 'character?_set?_%'; の結果 character_set_client :binary character_set_connection:binary character_set_database:utf8 character_set_results:binary character_set_server:utf8 character_set_system:utf8 MYSQL 4.1 サーバーが上記のような状態で、PERL で次の処理をします。なお、PERL ソース自体はEUC で書かれています。 #!/usr/bin/perl use Jcode; use DBI; $string = "あああ"; Jcode::convert( ?$string, 'utf8', 'euc' ); $dbh = DBI->connect( 'DBI:mysql:DB名:ホスト名:3306', 'ユーザー名', 'パスワード' ,{AutoCommit => 0} ); $sth = $dbh->prepare( "set names utf8" ); $sth->execute; $sth->finish; $sth = $dbh->prepare( "insert into test values( ? )" ); $sth->bind_param( 1, $string ); $sth->execute; $sth->finish; $dbh->commit; $dbh->disconnect; 上記のソースを実行すると、MYSQL 4.1 サーバーには [あ?あ?あ] のような、余計なエスケープが掛かった状態で文字がINSERT されているのです。 私としては、set names utf8 で、MYSQL 4.1 サーバーとクライアントで同様の文字コードを使うようにしているので、MYSQL 4.1 における余計な文字コード変換はないものと思っています。余計な文字コード変換がないにもかかわらずエスケープ文字が入る理由が分かりません。 この現象についてお分かりの方がいらっしゃいましたら教えて頂きたく思います。なお、ネットでも調べたのですが、どの方も未解決でしたので質問さえて頂きました。 お願いします。

  • mysql 最大値 取得 

    mysqlのデータベースから、列の最大値を取り出したいのですが、 以下のように書いているのですが、取得される値が1しか返ってこないです。 間違っているところはあるでしょうか? perlで書いています。 my $dbh = DBI->connect("DBI:mysql:host=${db_host};database=${db_name}", $db_user, $db_pass); my $sth = $dbh->prepare("SELECT MAX(列名) FROM テーブル名"); my $rv = $sth->execute(); print "$rv";

    • ベストアンサー
    • MySQL
  • PerlからMysqlに接続してデータを昇順?降順に並べる方法

    こんばんは。 現在、PerlからMysqlに接続してデータを昇順?降順に並べようと思っております。 しかし、降順に並べる場合、うまく動きません。 詳細を以下に明記しますので、どなたか宜しくお願いします。 テーブル名:test テーブル内のデータ:100個 まず、昇順の場合 少し省略しますが、まず接続します。 $dbh = DBI->connect($dsn,$user,$password); $sth = $dbh->prepare("SELECT * From test Order by no limit 5,2"); $sth->execute; $sth->finish; $dbh->disconnect; これで、no5から二つ(つまり、no5とno6のみ)が抽出されると思います。 降順の場合 $dbh = DBI->connect($dsn,$user,$password); $sth = $dbh->prepare("SELECT * From test Order by no desc limit 5,2"); $sth->execute; $sth->finish; $dbh->disconnect; こうすると、no6,no5という順に抽出されます。ちなみに、limit 5,2をlimit 5,3とすると、no6,no5,no4と抽出されます。なぜここでlimit 5,2の際にno5,no4でlimit 5,3の際にno5,no4,no3という順に抽出されないのか分かりません。 私がしたいのは、noを降順(no5,no4,no3・・・)という順に表示させたいのです。ただ、降順に表示させるのではなく、例えば上記でlimitで指定したように、あるnoから3つとかしたいのです。 質問が長くなり分かりにくいかも知れないのですが、どなたか力を貸していただけないでしょうか。 宜しくお願いします。

    • ベストアンサー
    • Perl