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

【PHP+MySQLi】PHPでmysqli_multi_query()を使って複数テーブルに対してDELETE、INSERTを合計300ほど行うような処理をしているのですが、この処理の後に別にクエリを発行すると「Commands out of sync」というエラーが発生します。

mysqli_multi_query()のあとに

if(mysqli_more_results($link)){
while(mysqli_next_result($link)){ ; }
}

を入れてクエリの結果をすべてはき出させるとエラーが出なくなることはわかったのですが、無限ループを作っていますし、これでは効率が悪い気がしています。

mysqli_multi_query()の結果をすべて1度に消去する、または取得する方法はないでしょうか? よろしくお願いします。

●質問者: heppokoA
●カテゴリ:インターネット ウェブ制作
✍キーワード:DELETE LINK Out PHP エラー
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ●
●20ポイント

消去したいのであれば、mysqli_free_resultで結果に関連付けられたメモリを開放すれば良いはずです。

[参考URL]

◎質問者からの返答

ありがとうございます。

mysqli_multi_query()ではbool値しか返ってこないようなのですが、mysqli_free_result()に渡すmysqli_resultオブジェクトはどこから持ってくればよいのでしょうか? ひょっとして引数なしでも実行できたりするのでしょうか? 一応、時間があるときに試してみたいと思います。

引き続きみなさんからの回答をお待ちしています。

- - 追記 - -

やはり,「PHP Warning: Wrong parameter count for mysql_free_result()」となります。仮にmysql_multi_query()からの返り値を渡しても,返り値がbool値なので,「PHP Warning: mysql_free_result(): supplied argument is not a valid MySQL result resource」となります。


2 ●
●80ポイント ベストアンサー

前回の回答は適切ではありませんでした。申し訳ありません。

調べてみたところ、mysqli_multi_query()で処理を行う場合、質問文中で試していらっしゃる例のように、LOOPで処理をするしかなさそうです。

MySQLのマニュアルを調べたところ、以下のような記述がありました。

If you enable CLIENT_MULTI_STATEMENTS or CLIENT_MULTI_RESULTS, you should process the result for every call to mysql_query() or mysql_real_query() by using a loop that calls mysql_next_result() to determine whether there are more results. For an example, see Section 24.2.9, “C API Handling of Multiple Statement Execution”.

PHPのソースコードを確認していないのですが、 mysqli_multi_query は内部でMySQLのコネクションに CLIENT_MULTI_STATEMENTS オプションを指定していると思われます。

この場合、上記の説明にある通り、すべてのmysql_query()、mysql_real_query()ごとにmysql_next_result()をループで呼ぶ必要があります。

If you enable multiple-statement support, you should process the results from mysql_query() and mysql_real_query() within a loop that checks for more results. This is true even for statements such as DROP TABLE that return a result but not a result set. Failure to process the result this way may result in a dropped connection to the server.

上記にある通り、たとえDROP TABLEのようなresult setは返さなくてもresultを返す場合でも、ループでの処理は必要です。

これは、INSERT、DELETEにも当てはまります。

望んでいた回答ではないかもしれませんが、少しでも参考になれば幸いです。

◎質問者からの返答

なるほど,やはりループが必要ということですね。詳しく引用していただいてありがとうございます。とても参考になりました。

それでは質問を終了しようとおもいます。

関連質問


●質問をもっと探す●



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