У меня есть хранимая процедура с несколькими наборами результатов. Как мне перейти на второй результат в 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 возвращаются в виде пустых строк.
Кто-нибудь другой сталкивается с этим и имеет решение?
Я думаю, что вам что-то не хватает (следующее не было протестировано):
$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, что делает невозможным получение нескольких наборов результатов:
Поэтому, в зависимости от вашей версии PHP, вам придется придерживаться своего решения mysqli
. Кстати: вы намеренно используете процедурный стиль? Использование объектно-ориентированного стиля с mysqli
сделает ваш код более привлекательным (мое личное мнение).
Похоже, MySQLi может поддерживать только несколько наборов результатов через mysqli_multi_query()
, поскольку объекты MySQLi_STMT
работают иначе, MySQLi_Result
объекты MySQLi_Result
.
PDO представляется несколько более абстрактным, при этом объекты PDOStatement могут обрабатывать множество наборов результатов как для обычных запросов ( PDO::query
), так и для подготовленных операторов ( PDO:prepare
).