PHP / MYSQLで2つのmysqlクエリを1つとして実行するにはどうすればよいですか?
質問
次の2つのクエリがあります:
SELECT SQL_CALC_FOUND_ROWS Id, Name FROM my_table WHERE Name LIKE '%prashant%' LIMIT 0, 10;
SELECT FOUND_ROWS();
これらの両方のクエリを1回で実行したい。
$result = mysql_query($query);
しかし、各テーブルセットを個別に処理する方法を教えてください。実際にASP.NETでは、2つのクエリを次のように処理するデータセットを使用します
ds.Tables[0];
ds.Tables[1]; .. etc
PHP / MYSQLを使用して同じことを行うにはどうすればよいですか
解決
更新: mysql_connect()
にフラグを渡すことにより、明らかに可能です。 PHPを使用して1つのステートメントで複数のSQLクエリを実行するそれにもかかわらず、現在の読者は mysql _
クラスの関数の使用を避け、PDOを好むべきです。
PHPの通常のmysql-apiを使用してそれを行うことはできません。 2つのクエリを実行するだけです。 2番目のものは非常に高速なので、問題にはなりません。これは、マイクロ最適化の典型的な例です。心配しないでください。
レコードについては、mysqliおよび mysqli_multi_queryを使用して実行できます。 -関数。
他のヒント
他の人が答えたように、mysqli APIはmsyqli_multi_query()関数で複数クエリを実行できます。
デフォルトでは、PDOは複数のクエリをサポートしています。複数のクエリの複数の結果セットを反復処理できます。
$stmt = $dbh->prepare("
select sql_calc_found_rows * from foo limit 1 ;
select found_rows()");
$stmt->execute();
do {
while ($row = $stmt->fetch()) {
print_r($row);
}
} while ($stmt->nextRowset());
ただし、マルチクエリはセキュリティ上の理由から悪いアイデアとかなり広く考えられています。クエリ文字列の作成方法に注意を払わない場合、実際にに示されている正確なタイプのSQLインジェクションの脆弱性を取得できます。古典的な「リトルボビーテーブル」 XKCD漫画。単一クエリに制限するAPIを使用する場合、それは起こり得ません。
SQL_CALC_FOUND_ROWS
を使用することはできません。
FOUND_ROWS()を介して使用可能な行カウントは一時的なものであり、SELECT SQL_CALC_FOUND_ROWSステートメントに続くステートメントを超えて使用できるようには意図されていません。
前の質問で誰かが指摘したように、 SQL_CALC_FOUND_ROWS
を使用すると、単にカウントを取得するよりも遅くなることがよくあります。
おそらく、サブクエリとしてこれを行うのが最善でしょう:
SELECT
(select count(*) from my_table WHERE Name LIKE '%prashant%')
as total_rows,
Id, Name FROM my_table WHERE Name LIKE '%prashant%' LIMIT 0, 10;
クエリを2回実行したくない場合は、MySQLi拡張機能を使用する必要があります。
if (mysqli_multi_query($link, $query))
{
$result1 = mysqli_store_result($link);
$result2 = null;
if (mysqli_more_results($link))
{
mysqli_next_result($link);
$result2 = mysqli_store_result($link);
}
// do something with both result sets.
if ($result1)
mysqli_free_result($result1);
if ($result2)
mysqli_free_result($result2);
}
MySQLiを使用する必要があります。以下のコードは問題なく動作します
<?php
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");
/* check connection */
if (mysqli_connect_errno()) {
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
$query = "SELECT CURRENT_USER();";
$query .= "SELECT Name FROM City ORDER BY ID LIMIT 20, 5";
/* execute multi query */
if ($mysqli->multi_query($query)) {
do {
/* store first result set */
if ($result = $mysqli->store_result()) {
while ($row = $result->fetch_row()) {
printf("%s\n", $row[0]);
}
$result->free();
}
/* print divider */
if ($mysqli->more_results()) {
printf("-----------------\n");
}
} while ($mysqli->next_result());
}
/* close connection */
$mysqli->close();
?>
これに似ています:
$result1 = mysql_query($query1);
$result2 = mysql_query($query2);
// do something with the 2 result sets...
if ($result1)
mysql_free_result($result1);
if ($result2)
mysql_free_result($result2);
PHPサイトで、複数のクエリは許可されていません(編集:これはmysql拡張機能にのみ当てはまります。mysqliとPDOは複数のクエリを許可します) 。ですから、PHPではできませんが、別のmysql_query呼び出しでそのクエリを実行できないのはなぜですか(Jonの例のように)?同じ接続を使用する場合でも、正しい結果が得られます。また、 mysql_num_rows も役立つ場合があります。
はい、MySQLi拡張機能を使用しなくても可能です。
mysql_connect
の5番目の引数で CLIENT_MULTI_STATEMENTS
を使用するだけです。
詳細については、以下のコメント Husniの投稿を参照してください。