- ベストアンサー
perlのDBIからmysqlにINSERTINTOをやっても追加されない
- DBIを組み込んだCGIを実行してみてもエラーはでないのですが、DBへの追加ができていません。
- 色々とやってみたのですが、どうしても追加ができません。考えられる要因があれば教えてください、お願いします。
- 本当に困っています。どうかお助けください。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
こんにちは。 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; の順番でいいはずですよ。 (^^ゞ
その他の回答 (3)
- taka451213
- ベストアンサー率47% (436/922)
こんばんは。 うーん、おかしいところは特にないですねぇ。 SQLは怪しそうですが・・・。 INSERT文自体は問題ないんですよね? (ダブルコーテーションの内側だけをコンソールから流したら、INSERTされますよね?) 後はエラーですが、「500Internal Server Error」なんですよね? これもちょっと変かなぁ・・・。 >>データベースをperlから操作するために、学ぶべきいいサイトがあればぜひ教えてください。お願いします。 これがなかなか・・・。 どこも似たような内容ですよ。 logicalpinkyさんの場合は、記述は間違ってないので、ほかの所を疑った方がいですよ。 あんまりアドバイスできなくてすみません・・・。 (^^ゞ
お礼
こんにちはtaka451213さん。 解決しました!! しかし、これが不思議なんです!! 「追加はされないが、エラーがでない」ソースを、エディタにコピペして、SELECTなどにソースを変更してエラーが出たら、その変更したソースを全部消して、エディタから「追加されないが、エラーがでない」ソースを持ってきて全文貼り付けしてから、「よし、一応エラーは出ないが、追加はされない状態に戻したぞ。さてまた考えるか。」といった作業を、ここ2週間繰り返していたのです。 そして今日、またエラーが出るようになり、いつもどうり「また、エラーは出ないが、追加もされない状態に一応戻しとくか。」とエディタからソースをもってきて貼り付けたのです。(僕はエラーが出る状態のままにして、眠りにつくのが嫌なんです。) すると!!画面確認のためCGIを実行したら、DBに値が追加されたのです。 もう何がなんだかわかりません。今だにどうして追加されなかったかわかりません。原因不明です。 ともあれCGIがちゃんと働いてくれるようになったので、感謝の言葉をお伝えします。 ありがとうございました。 初心者である僕に、何度もアドバイスをくれたことを感謝します。 またわからないことが出てきたときは、またよろしくお願いします。 本当にありがとうございました。
- taka451213
- ベストアンサー率47% (436/922)
こんにちは。 >>接続がうまくいってないのでしょうか? SELECT文で、データの取得はできているのでしょうか? CGIで取得したデータ(1つでいい)をHTMLに書き出してみてください。 後は変数の中を書き出して、その時に何が入っているかを見てみましょう。 どこがおかしいかは、切り分けないとわからないので・・・。 手間がかかりますが、やってみてください。 (^^ゞ
補足
こんにちは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から操作するために、学ぶべきいいサイトがあればぜひ教えてください。お願いします。
- taka451213
- ベストアンサー率47% (436/922)
こんにちは。 finishしてからcommitしてrollbackしてるんですか??? (^^ゞ
補足
お返事ありがとうございます。 データベースへのDBI操作がはじめてで、うまくいきません。上のソースをcommitしてrollbackして、finishしても、テーブルに追加されませんでした。 色々なwebページの通りにやってみたのですが、どうしてもできなくて本当に困っています。 だれかよろしければ、DBIを使ったデータベース接続から、レコード追加して、接続遮断までの方法を教えてください。お願いします。
補足
お返事ありがとうございます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のテーブルに追加するというのが、今の所の目標です。 どうかお助けください。お願いします。