Как выполнить два запроса 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?

Author: Luiggi Mendoza, 2009-04-29

8 answers

Обновление: , По-видимому, возможно, передав флаг mysql_connect(). См. Выполнение нескольких SQL-запросов в одном операторе с помощью PHP Тем не менее, любому текущему читателю следует избегать использования mysql_-класса функций и отдавать предпочтение PDO.

Вы не можете сделать это, используя обычный mysql-api в PHP. Просто выполните два запроса. Второй будет настолько быстрым, что это не будет иметь значения. Это типичный пример микрооптимизации. Не беспокойтесь об этом.

Для справки, это может быть сделано с помощью mysqli и функции mysqli_multi_query-.

 32
Author: Emil H, 2017-05-23 11:55:04

Как уже отвечали другие, 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, который ограничивает вас одним запросом, этого не может произойти.

 7
Author: Bill Karwin, 2013-04-04 05:48:40

Используя 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;
 3
Author: tpdi, 2009-04-29 14:03:40

Вам придется использовать расширение 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);
}
 3
Author: Jon Benedicto, 2009-04-29 14:09:24

Вот так:

$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);
 2
Author: Jon Benedicto, 2009-04-29 13:51:50

Вы должны использовать 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();
?>
 2
Author: , 2013-04-04 05:11:57

На сайте PHP говорится, что несколько запросов НЕ разрешены (ПРАВКА: Это верно только для расширения mysql. mysqli и PDO позволяют выполнять несколько запросов) .Таким образом, вы не можете сделать это на PHP, НО почему вы не можете просто выполнить этот запрос в другом вызове mysql_query (например, в примере Джона)? Это все равно должно дать вам правильный результат, если вы используете одно и то же соединение. Кроме того, mysql_num_rows также может помочь.

 0
Author: Michael Pryor, 2009-04-29 20:32:03

Да, это возможно без использования расширения MySQLi.

Просто используйте CLIENT_MULTI_STATEMENTS в 5-м аргументе mysql_connect.

Обратитесь к комментариям ниже Сообщение Хусни для получения дополнительной информации.

 0
Author: Pacerier, 2017-05-23 11:47:23