Как выполнить два запроса 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?
Решение
Обновлять: Очевидно, это возможно, передав флаг 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);
}
Вам нужно использовать 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 (как в примере Джона)?Он все равно должен дать правильный результат, если вы используете то же соединение.Также, mysql_num_rows тоже может помочь.
Да, это возможно без использования расширения MySQLi.
Просто используйте CLIENT_MULTI_STATEMENTS
в mysql_connect
5-й аргумент.
См. комментарии ниже Сообщение Хусни Чтобы получить больше информации.