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();
}

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:2008/04/07 16:05:01
  • 終了:2008/04/08 17:46:00

回答(3件)

id:Youshi No.1

Youshi回答回数30ベストアンサー獲得回数32008/04/07 16:56:35

ポイント6pt

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

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

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

id:disca

ありがとうございます、 

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

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

$db->freePrepared($sth);

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

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

 

2008/04/08 17:39:45
id:pahoo No.2

pahoo回答回数5960ベストアンサー獲得回数6332008/04/07 17:11:24

ポイント35pt

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

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

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

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


参考サイト

id:disca

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

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

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

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

2008/04/08 17:44:17
id:ken33jp No.3

ken33jp回答回数928ベストアンサー獲得回数132008/04/07 17:28:23

ポイント39pt

$db->autoCommit( false );

$db->commit();

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

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

id:disca

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

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

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

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

2008/04/08 17:45:09

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません