• ベストアンサー
  • 困ってます

複数行のクエリを、まとめて実行するには?mysqli_multi_query()?

PHPとMySQLの環境です。 複数行のクエリを、まとめて送って取得したいと考えています。 ですが、今試行錯誤しているのですが、うまく行かない状態で、クエリをきちんと実行できません。 処理の流れとしては、 [DBにアクセス]→[2つのクエリの実行]→[データ取得]→[DBをクローズ] でいいのではないかと思ってやっているのですが、 2つのクエリを実行するのはなにやら無理なような記述もウェブ上で拝見しました。 その場合、同じDBの同じテーブル内の異なるデータを取得したいだけなのに、 わざわざ、一度DBにコネクトして、切断、そしてまたコネクトして、切断ということを繰り返さないとダメなのでしょうか。。? そもそも同一PHPファイル内で二度も接続、切断はすべきではないですか? ちなみに、 一つ目のクエリでは、テーブル(table_a)のレコード数をカウントしてPHP側で取得するという流れの処理です。 $query = "SELECT count(*) FROM `table_a`"; もう一つのクエリは、テーブル(table_a)の最新のレコードの、idカラムのidを取得するだけのものです。 $query = "SELECT arrayset FROM `table_a` ORDER BY id DESC LIMIT 1"; この処理を一度のクエリで入れ込むことは可能でしょうか。 それぞれ単独では実行できます。 PHPでこのような関数 mysqli_multi_query() を見つけて色々調べているのですが、 いまだに使用方法がきちんとつかめない状況です。 これで複数のクエリを送ることは可能でしょうか。 アドバイス宜しくお願いします。

共感・応援の気持ちを伝えよう!

  • MySQL
  • 回答数3
  • 閲覧数12451
  • ありがとう数2

質問者が選んだベストアンサー

  • ベストアンサー
  • 回答No.3
  • yambejp
  • ベストアンサー率51% (3827/7415)

>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)

  • 回答No.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回使うとエラーになりませんでした。 これは一体、なぜなんでしょうか。。。?

  • 回答No.1
  • 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";

関連するQ&A

  • DB検索について

    (1)PHPにてSQLをコールしてテーブルから情報の取得を行いたいのです。  $cmnd = "select * from table_a where id=01";を実行し(fetch使用)  仮に15件セレクトされたとすると、抽出された15件は  プログラム内のどこに格納されるのですか? (2)また、そのレコードを順じ処理する場合において、終了条件はどの様に  判定したら良いでしょうか?  DB:oracle

    • 締切済み
    • PHP
  • ある条件を含まないというクエリがうまく書けません。

    ある条件を含まないというクエリがうまく書けません。 test_table ID,name ----------- 1,aaa 2,bbb 3,ccc 4,ddd 5,eee test_table2 ID,value ----------- 1,100 1,200 1,300 1,400 2,100 2,200 3,900 3,800 4,400 4,500 4,600 5,100 今まで下記クエリのように、test_tableのIDとtest_table2のIDでジョインして、 test_table2のvalueに"200"を含んでいるtest_tableのレコードを取得していました。 SELECT DISTINCT test_table.* LEFT JOIN test_table2 ON test_table.ID = test_table2.ID WHERE test_table2.value = 200; (test_tableのID:1と2のレコードが返ってきます。) これを、test_table2のvalueに"200"を含まないものを返すようにしたいのです。 (test_tableのID:3と4と5のレコードを返したい) 下記クエリを作ってみましたが、ID:1と2も返ってきてしまいます。 ID:1のvalueの"100","300","400"、ID:2のvalueの"100"に条件が合ってしまうようです。。 SELECT DISTINCT test_table.* LEFT JOIN test_table2 ON test_table.ID = test_table2.ID WHERE test_table2.value != 200; なにが良い方法があればご教授下さい。

    • ベストアンサー
    • MySQL
  • SQLクエリ

    以下のようなAccessのテーブルがあったとします。   time  -------------- (1) 200207050545 (2) 200207050546 (3) 200207050733 そこで、以下のようなクエリを実行したとします。 SELECT time from table WHERE time <= '200207050546' 当然、得られる結果は(1)(2)です。 しかし、条件を『time <= 'a'』にすると、(1)(2)(3)の結果が得られてしまいます。 条件が『time <= 'a'』のときはレコードなしにしたいのですが、 どうすればよいでしょうか?

  • mysqliについて

    PHP初心者です PHP 5.2.5 MySQL 5.1.22 レンタルサーバーのphpのバージョンが php5.2.5ではpdoがバグで使えないらしいのでmysqliを使おうとしています。PHP 5.2.5でもmysqliはバグありますか? mysqliでMYSQLに接続するにはどうすればいいのでしょうか? いままではこんな感じでしたがmysqliにするとどんなコードになるのでしょうか? $link=mysql_connect('localhost', 'user', 'pass')or die(mysql_error()); mysql_select_db(user'); mysql_query('SET NAMES UTF8'); $start=1; $hyouji=10; $recordSet = mysql_query(sprintf('SELECT * FROM hoge2 ORDER BY id LIMIT %d, %d' , ',$start,$hyouji)); <?php while ($table = mysql_fetch_assoc($recordSet)) { ?> <tr> <td><?php print($table['id']); ?></td> <td><?php print($table['name']); ?></td> </tr> <?php } ?>

    • ベストアンサー
    • PHP
  • find_or_createのようなクエリを出したい

    お疲れ様です。 お世話になります。 データベースにあるキーを基にSELECTを出して、該当レコードがあればそのレコードのIDを取得、 なければ、そのキーをINSERTして、INSERT_IDを取得する。 これをひとつのクエリでできないかと悩んでいます。 perlだとfind_or_createというメソッドがあるらしいのですが、 私はPHP書きです。 DBはMySQL5を使っています。 PHPも5xです。 ググってもあまりいい案はなく、ムリならムリと突きつけていただければ 2つのクエリでがんばります。 よろしくお願いします。

    • ベストアンサー
    • MySQL
  • コマンドラインで実行

    DB2でコマンドラインから実行していますがうまくいきません。 select文で a   b ----------- 1   2 をテーブルが存在しない状態で出したいのですが db2 "select a,b from values(1,2) as table" としてもうまくいきません。 どのようにしたらいいでしょうか?

  • PHP / MySQL / クエリ実行

    【概要】 PHPからMySQLへのクエリを実行したいのですが、結果が返りません。 【環境】 CentOS5 [PHP5] sakuraインターネット レンタルサーバ スタンダートプランです。 参考:http://www.sakura.ne.jp/rentalserver/matrix.html 【ソース PHP】 ------------------------------------------------------------ $query =  mysql_query(' SET @i := 0; SET @ii := 0; SET @iii := 0; SET @iiii := 0; select `sys_no`,`day`,`counter`,(@iiii := @iiii +1)as `counter2` from (select `sys_no`,`name`,`day`,(@i := @i +1) as `counter` from TBL名 ORDER BY `day` DESC ) as aa where counter BETWEEN (select a.counter from (select `sys_no`,`day`,(@ii := @ii +1) as `counter` from TBL名 ORDER BY day DESC ) as a where sys_no =5) - 1 AND (select a.counter from (select `sys_no`,`day`,(@iii := @iii +1) as `counter` from TBL名 ORDER BY day DESC ) as a where sys_no =5) + 1 '); while ($row = mysql_fetch_array($query)) { 結果取得処理 } ------------------------------------------------------------ ・上記をPHPより実行しますと、「while~」の部分で結果が無いとエラーが返ります。 ・phpMyAdminから直接クエリの部分のみを実行しますと、問題無く結果が返ります。 ・なお、クエリを簡単な一行程度の内容にしますと問題無く実行され、結果が返ります。例:select * from TBL名 ・また、上部にセットしている4つのSETを試しに削除した状態でPHPより実行しますと、結果は返りませんがエラーにはなりません。 以上、アドバイス頂戴できますでしょうか。 よろしくお願い致します。

    • ベストアンサー
    • PHP
  • 別テーブルからSELECTした値を持つ行を削除するSQLは?

    削除 SQL がわかりません。 SQL-1 SELECT id FROM table2 WHERE date_in IS NULL; これで取得したidを持つレコード(別テーブル)を削除したいのですが、 どうすれば組み合わさるのでしょうか? DELETE FROM table1 WHERE id=???

  • phpからquery実行

    趣味でサーバー構築を楽しんでいます phpからqueryでデータを渡そうとしたところ詰まってしまい、どうにも分からないので質問します //MSSQLQuery// DECLARE @acct varchar(32); SET @acct = 'testname'; INSERT INTO test.dbo.tblInfoA (Number,ID,) SELECT Number,@acct FROM test.dbo.tblinfoB WHERE userId = @acct このクエリをphpフォームからDBに送りたく下記をphpに記述しました */php mssql_query("INSERT INTO test.dbo.tblInfoA (Number,ID) VALUES ('SELECT Number FROM test.dbo.tblinfoB WHERE userId = $login','$login');") エラーメッセージ message: Conversion failed when converting the varchar value 'SELECT Number FROM test.dbo.tblinfoB WHERE userId = name' to data type int. (severity 16) お分かりの方いましたらご返答よろしくお願いします。

  • テーブル上に存在しないデータの一覧を取りたい。

    mysql+phpで開発を行っています。 テーブル id 101 102 104 106 109 110 の様にデータが入っているテーブルaaaがあります。 プログラムで取得したid一覧が上記テーブルにレコードがあるのか確認するSQLは 例)select id from aaa where id in (101,102) で取得できるということは分かっています。 ここで select id from aaa where id in (102,103) とやると102の1件が取得できます。 今回知りたいことは 逆に取得できなかった103という値を取得する方法はないのかという事です。 select id from aaa where id=102; select id from aaa where id=103; 2回SQLを実行して値が戻ってこないSQL=テーブルにそのレコードが無いというプログラムを書けばいい事は分かっています。 しかし、処理が少なくとも数千回発生してしまう予定ですのでできれば別の方法がいいと思っています。 また、in区で使っている一覧はテーブルには入っておらず、また、こちらも数千個あるので、一時テーブルに入れるといってもかなりの時間がかかってしまうと思います。 何か一発で取得できるいい方法などありますでしょうか? ちなみにaaaテーブルは5万件ほどなので全件php側でメモリに展開してサーチも避けたいです よろしくお願いいたします。