アプリ版:「スタンプのみでお礼する」機能のリリースについて

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()
を見つけて色々調べているのですが、
いまだに使用方法がきちんとつかめない状況です。
これで複数のクエリを送ることは可能でしょうか。

アドバイス宜しくお願いします。

A 回答 (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は出力があるわけでもないし)
    • good
    • 0
この回答へのお礼

ありがとうございます。
上書きさせている理由がわかってすっきりいたしました。
ご丁寧にありがとうございました。
これでいろいろテストしながら勉強させていただきます!

お礼日時:2009/06/09 03:15

>複数行処理ができるのでしょうか。



原則できません。
別に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回使うとエラーになりませんでした。

これは一体、なぜなんでしょうか。。。?

補足日時:2009/06/06 02:25
    • good
    • 0

>わざわざ、一度DBにコネクトして、切断、そしてまたコネクトして、切断ということを繰り返さないとダメなのでしょうか。

。?

いえ、コネクションは切断する必要はありません。
流れ的には

[DBにアクセス]→[クエリの実行]→[データ取得]→[クエリの実行]→[データ取得]→[DBをクローズ]

という感じでしょうか
クエリの結果を毎回得るのは実行後データ取得をしないと
いけないですから、結局こうなるんじゃないですか?
また旧来のPHPのシステムではSQLを複数実行する際に
インジェクションの危険が大きかったこともあり、
複数のSQLを投げないという仕組みになっていたのかもしれません。

実際には、データベースに複数SQLをなげるPEARなどのライブラリ
もありますし、プリペアド系の技術も実装されてきているので
以前ほど脅威は少なくなっていますが、結局人間のやること
なので、なにがあるかわかりません。一つ一つSQLをなげるほうが
確実だと思いますよ

この回答への補足

クエリの書き方が間違っていました・・・。こちらです。
$query = "INSERT INTO `table_a` VALUES 10;
SELECT arrayset FROM `table_a` ORDER BY id DESC LIMIT 1";

補足日時:2009/06/05 11:06
    • good
    • 0
この回答へのお礼

ありがとうございます。

コネクションはつなげたまま
クエリとデータ取得をセットに繰り返していけばいいわけですね。

単純にデータ取得をしないと駄目な場合はクエリを二回発行しないと駄目だというのはわかったのですが、
それでは一度目のクエリがINSERTで、
2度目のクエリがSELECTだった場合は、
複数行処理ができるのでしょうか。

質問の意図としては以下のようなクエリの書き方が可能なのかということです、
$query = "INSERT INTO `table_a` count(*) VALUES 10;
SELECT arrayset FROM `table_a` ORDER BY id DESC LIMIT 1";

よろしくお願い致します

お礼日時:2009/06/05 11:06

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

関連するカテゴリからQ&Aを探す