人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

PHP(PEAR_DB)の簡単な質問です。

下記PHPにて INSERT INTO 文を数十回、まわす処理を行っていますが、
どうしても、初回のみ実行されデータベースに行追加されますがされ、
二回目以降データが代入されません。クエリー自体は、 $db->last_query
で確認を行ったり、クエリーブラウザ上(phgMyAdmin)でクエリを実行しましたが
特に問題なく動作しました。原因についてご存知の片いらっしゃいましたらご教授お願いします。


foreach(...)
{
$db->autoCommit( false );
$sth = $db->prepare($query);
$ret= $db->execute($sth, $params);
//$ret は DB_OK です
$db->freePrepared($sth);
$db->commit();
}

●質問者: disca
●カテゴリ:コンピュータ ウェブ制作
✍キーワード:DB PHP クエリ データ データベース
○ 状態 :終了
└ 回答数 : 3/3件

▽最新の回答へ

1 ● Youshi
●6ポイント

せっかくprepareしたステートメントハンドルを、freePreparedで開放してしまっては、2回目のqueryが実行されないのは当たり前ですよ。

各メソッドのマニュアルを熟読しましょう。

http://pear.php.net/manual/en/package.database.db.php

◎質問者からの返答

ありがとうございます、

$sth = $db->prepare($query);

$ret= $db->execute($sth, $params);

$db->freePrepared($sth);

上記が連続するソースコードがあるという事をあらわしています。

マニュアルのほうは拝読いたしました、ご指摘ありがとうございます。


2 ● pahoo
●35ポイント

質問文のコードでは commit されていないと思います。

prepare を使うなら、forループの中は execute のみにするのが定石です。下記サイトを参考に、$query の作り方に留意してください。

$sth = $db->prepare($query);
foreach (...) {
$ret= $db->execute($sth, $params);
}
$db->freePrepared($sth);

さらに、executeMultiple を使った方がスマートです。下記サイトを参照ください。


参考サイト

◎質問者からの返答

ご指摘ありがとうございます、

原因はMySQLのほうで、auto_increment が指定されているテーブルに対して

INSERTを行ったときに LAST_INSERT_ID() を指定していたことが、 INSERT できないことが判明しました。

大変ご迷惑をおかけいたしました。


3 ● ken33jp
●39ポイント

$db->autoCommit( false );

$db->commit();

この2行をとりあえず、ループの外側に出すべきです。

http://q.hatena.ne.jp/answer

◎質問者からの返答

ご指摘ありがとうございます、

原因はMySQLのほうで、auto_increment が指定されているテーブルに対して

INSERTを行ったときに LAST_INSERT_ID() を指定していたことが、 INSERT できないことが判明しました。

せっかくご回答いただき、大変恐縮です。ご迷惑をおかけいたしました。

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ