- ベストアンサー
PHPとMySQLで複数行のクエリをまとめて実行する方法
- PHPとMySQLの環境で複数行のクエリをまとめて実行したい場合、mysqli_multi_query()関数を使用することができます。
- mysqli_multi_query()関数を使用することで、複数のクエリを一度に送信し、結果を取得することができます。
- また、同じPHPファイル内で複数回の接続や切断をする必要はありません。一度の接続で複数のクエリを実行することができます。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
>2回目のときの$resで上書きされてしまいそうに思うのですが、 上書きさせています。 実際には、 $link=mysql_connect($host,$user,$pass); $query = "INSERT INTO `table_a` VALUES 10"; $res=mysql_query($query,$link); mysql_free_result($res); $query = "SELECT arrayset FROM `table_a` ORDER BY id DESC LIMIT 1"; $res=mysql_query($query,$link); mysql_free_result($res); mysql_close($link); とするのですが、そこは手抜きです。 再利用する予定がない結果=$resはとっておいても仕方ないので 上書してもいいんじゃないですか? (とくに今回の1回目の$resは出力があるわけでもないし)
その他の回答 (2)
- yambejp
- ベストアンサー率51% (3827/7415)
>複数行処理ができるのでしょうか。 原則できません。 別に2回投げるだけですがそれではだめなのでしょうか? 工夫すればユーザー関数つくって複数クエリーを分割して 実行するなり、ライブラリでちゃっちゃとやるなりすればいいでしょ? $link=mysql_connect($host,$user,$pass); $query = "INSERT INTO `table_a` VALUES 10"; $res=mysql_query($query,$link); $query = "SELECT arrayset FROM `table_a` ORDER BY id DESC LIMIT 1"; $res=mysql_query($query,$link); mysql_free_result($res); mysql_close($link);
補足
ありがとうございます! 頂いたサンプルですと、 $resを2回使っていて、 2回目のときの$resで上書きされてしまいそうに思うのですが、 この$resを2回使うとエラーになりませんでした。 これは一体、なぜなんでしょうか。。。?
- yambejp
- ベストアンサー率51% (3827/7415)
>わざわざ、一度DBにコネクトして、切断、そしてまたコネクトして、切断ということを繰り返さないとダメなのでしょうか。。? いえ、コネクションは切断する必要はありません。 流れ的には [DBにアクセス]→[クエリの実行]→[データ取得]→[クエリの実行]→[データ取得]→[DBをクローズ] という感じでしょうか クエリの結果を毎回得るのは実行後データ取得をしないと いけないですから、結局こうなるんじゃないですか? また旧来のPHPのシステムではSQLを複数実行する際に インジェクションの危険が大きかったこともあり、 複数のSQLを投げないという仕組みになっていたのかもしれません。 実際には、データベースに複数SQLをなげるPEARなどのライブラリ もありますし、プリペアド系の技術も実装されてきているので 以前ほど脅威は少なくなっていますが、結局人間のやること なので、なにがあるかわかりません。一つ一つSQLをなげるほうが 確実だと思いますよ
お礼
ありがとうございます。 コネクションはつなげたまま クエリとデータ取得をセットに繰り返していけばいいわけですね。 単純にデータ取得をしないと駄目な場合はクエリを二回発行しないと駄目だというのはわかったのですが、 それでは一度目のクエリがINSERTで、 2度目のクエリがSELECTだった場合は、 複数行処理ができるのでしょうか。 質問の意図としては以下のようなクエリの書き方が可能なのかということです、 $query = "INSERT INTO `table_a` count(*) VALUES 10; SELECT arrayset FROM `table_a` ORDER BY id DESC LIMIT 1"; よろしくお願い致します
補足
クエリの書き方が間違っていました・・・。こちらです。 $query = "INSERT INTO `table_a` VALUES 10; SELECT arrayset FROM `table_a` ORDER BY id DESC LIMIT 1";
お礼
ありがとうございます。 上書きさせている理由がわかってすっきりいたしました。 ご丁寧にありがとうございました。 これでいろいろテストしながら勉強させていただきます!