Получение наборов множественного результата с хранимой процедурой в php / mysqli

У меня есть хранимая процедура с несколькими наборами результатов. Как мне перейти на второй результат в mysqli, чтобы получить эти результаты?

Допустим, это хранимая процедура вроде:

create procedure multiples( param1 INT, param2 INT ) BEGIN SELECT * FROM table1 WHERE id = param1; SELECT * FROM table2 WHERE id = param2; END $$ 

PHP выглядит примерно так:

 $stmt = mysqli_prepare($db, 'CALL multiples(?, ?)'); mysqli_stmt_bind_param( $stmt, 'ii', $param1, $param2 ); mysqli_stmt_execute( $stmt ); mysqli_stmt_bind_result( $stmt, $id ); 

Тогда это та часть, с которой я не могу работать. Я попытался использовать mysqli_next_result для перехода к следующему набору результатов, но не могу заставить его работать. Мы получили его для работы с mysqli_store_result и mysqli_fetch_assoc / array / row, но по какой-то причине все ints возвращаются в виде пустых строк.

Кто-нибудь другой сталкивается с этим и имеет решение?

    Related of "Получение наборов множественного результата с хранимой процедурой в php / mysqli"

    Я думаю, что вам что-то не хватает (следующее не было протестировано):

     $stmt = mysqli_prepare($db, 'CALL multiples(?, ?)'); mysqli_stmt_bind_param($stmt, 'ii', $param1, $param2); mysqli_stmt_execute($stmt); // fetch the first result set $result1 = mysqli_use_result($db); // you have to read the result set here while ($row = $result1->fetch_assoc()) { printf("%d\n", $row['id']); } // now we're at the end of our first result set. mysqli_free_result($result1); //move to next result set mysqli_next_result($db); $result2 = mysqli_use_result($db); // you have to read the result set here while ($row = $result2->fetch_assoc()) { printf("%d\n", $row['id']); } // now we're at the end of our second result set. mysqli_free_result($result2); // close statement mysqli_stmt_close($stmt); 

    Используя PDO ваш код будет выглядеть так:

     $stmt = $db->prepare('CALL multiples(:param1, :param2)'); $stmt->execute(array(':param1' => $param1, ':param2' => $param2)); // read first result set while ($row = $stmt->fetch()) { printf("%d\n", $row['id']); } $stmt->nextRowset(); // read second result set while ($row = $stmt->fetch()) { printf("%d\n", $row['id']); } 

    Но я слышал, что PDOStatement::nextRowset() не реализован с драйвером MySQL PDO, что делает невозможным получение нескольких наборов результатов:

    • PDO nextRowset не работает с MySQL
    • pdo_mysql: вызов хранимой процедуры, возвращающий отдельные блоки строк, задает будущие запросы
    • Невозможно использовать хранимые процедуры из PDO в Windows

    Поэтому, в зависимости от вашей версии PHP, вам придется придерживаться своего решения mysqli . Кстати: вы намеренно используете процедурный стиль? Использование объектно-ориентированного стиля с mysqli сделает ваш код более привлекательным (мое личное мнение).

    Похоже, MySQLi может поддерживать только несколько наборов результатов через mysqli_multi_query() , поскольку объекты MySQLi_STMT работают иначе, MySQLi_Result объекты MySQLi_Result .

    PDO представляется несколько более абстрактным, при этом объекты PDOStatement могут обрабатывать множество наборов результатов как для обычных запросов ( PDO::query ), так и для подготовленных операторов ( PDO:prepare ).