プロが教えるわが家の防犯対策術!

助けてください、お願いします。
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;

本当に困っています。どうかお助けください。

A 回答 (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;

の順番でいいはずですよ。
(^^ゞ

この回答への補足

お返事ありがとうございます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のテーブルに追加するというのが、今の所の目標です。
どうかお助けください。お願いします。

補足日時:2004/11/15 18:03
    • good
    • 0

こんばんは。



うーん、おかしいところは特にないですねぇ。
SQLは怪しそうですが・・・。
INSERT文自体は問題ないんですよね?
(ダブルコーテーションの内側だけをコンソールから流したら、INSERTされますよね?)
後はエラーですが、「500Internal Server Error」なんですよね?
これもちょっと変かなぁ・・・。

>>データベースをperlから操作するために、学ぶべきいいサイトがあればぜひ教えてください。お願いします。
これがなかなか・・・。
どこも似たような内容ですよ。
logicalpinkyさんの場合は、記述は間違ってないので、ほかの所を疑った方がいですよ。

あんまりアドバイスできなくてすみません・・・。
(^^ゞ
    • good
    • 0
この回答へのお礼

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

お礼日時:2004/11/18 19:18

こんにちは。



>>接続がうまくいってないのでしょうか?
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から操作するために、学ぶべきいいサイトがあればぜひ教えてください。お願いします。

補足日時:2004/11/16 21:58
    • good
    • 0

こんにちは。



finishしてからcommitしてrollbackしてるんですか???
(^^ゞ

この回答への補足

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

補足日時:2004/11/13 19:18
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!