下記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();
}
せっかくprepareしたステートメントハンドルを、freePreparedで開放してしまっては、2回目のqueryが実行されないのは当たり前ですよ。
各メソッドのマニュアルを熟読しましょう。
http://pear.php.net/manual/en/package.database.db.php
質問文のコードでは 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 できないことが判明しました。
大変ご迷惑をおかけいたしました。
$db->autoCommit( false );
$db->commit();
この2行をとりあえず、ループの外側に出すべきです。
ご指摘ありがとうございます、
原因はMySQLのほうで、auto_increment が指定されているテーブルに対して
INSERTを行ったときに LAST_INSERT_ID() を指定していたことが、 INSERT できないことが判明しました。
せっかくご回答いただき、大変恐縮です。ご迷惑をおかけいたしました。
ありがとうございます、
$sth = $db->prepare($query);
$ret= $db->execute($sth, $params);
$db->freePrepared($sth);
上記が連続するソースコードがあるという事をあらわしています。
マニュアルのほうは拝読いたしました、ご指摘ありがとうございます。