Как выполнить два запроса mysql как один в PHP/MYSQL?
У меня есть два следующих запроса:
SELECT SQL_CALC_FOUND_ROWS Id, Name FROM my_table WHERE Name LIKE '%prashant%' LIMIT 0, 10;
SELECT FOUND_ROWS();
Я хочу выполнить оба этих запроса с одной попытки.
$result = mysql_query($query);
Но тогда скажите мне, как я буду обрабатывать каждый набор таблиц отдельно. На самом деле в ASP.NET мы используем набор данных, который обрабатывает два запроса как
ds.Tables[0];
ds.Tables[1]; .. etc
Как я могу сделать то же самое с помощью PHP/MYSQL?
8 answers
Обновление: , По-видимому, возможно, передав флаг mysql_connect()
. См. Выполнение нескольких SQL-запросов в одном операторе с помощью PHP Тем не менее, любому текущему читателю следует избегать использования mysql_
-класса функций и отдавать предпочтение PDO.
Вы не можете сделать это, используя обычный mysql-api в PHP. Просто выполните два запроса. Второй будет настолько быстрым, что это не будет иметь значения. Это типичный пример микрооптимизации. Не беспокойтесь об этом.
Для справки, это может быть сделано с помощью mysqli и функции mysqli_multi_query-.
Как уже отвечали другие, API mysqli может выполнять несколько запросов с помощью функции 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;
Вам придется использовать расширение 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);
}
Вот так:
$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);
Вы должны использовать 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();
?>
На сайте PHP говорится, что несколько запросов НЕ разрешены (ПРАВКА: Это верно только для расширения mysql. mysqli и PDO позволяют выполнять несколько запросов) .Таким образом, вы не можете сделать это на PHP, НО почему вы не можете просто выполнить этот запрос в другом вызове mysql_query (например, в примере Джона)? Это все равно должно дать вам правильный результат, если вы используете одно и то же соединение. Кроме того, mysql_num_rows также может помочь.
Да, это возможно без использования расширения MySQLi.
Просто используйте CLIENT_MULTI_STATEMENTS
в 5-м аргументе mysql_connect
.
Обратитесь к комментариям ниже Сообщение Хусни для получения дополнительной информации.