I have a stored procedure that has multiple result sets. How do I advance to the 2nd result set in mysqli to get those results?
Let's say it's a stored proc like:
create procedure multiples( param1 INT, param2 INT )
BEGIN
SELECT * FROM table1 WHERE id = param1;
SELECT * FROM table2 WHERE id = param2;
END $$
The PHP is something like this:
$stmt = mysqli_prepare($db, 'CALL multiples(?, ?)');
mysqli_stmt_bind_param( $stmt, 'ii', $param1, $param2 );
mysqli_stmt_execute( $stmt );
mysqli_stmt_bind_result( $stmt, $id );
Then this is the part I can't get to work. I've tried using mysqli_next_result to move to the next result set, but can't get it to work. We did get it to work with mysqli_store_result and mysqli_fetch_assoc/array/row, but for some reason all the ints get returned as blank strings.
Any one else come across this and have a solution?
I think you're missing something here (the following has not been tested):
Using
PDO
your code would look like:But I have heard that the
PDOStatement::nextRowset()
is not implemented with the MySQL PDO driver making it impossible to retrieve multiple result sets:So, depending on your PHP version, you'd have to stick with your
mysqli
-solution. By the way: do you use the procedural style deliberately? Using object oriented style withmysqli
would make your code look a little bit more appealing (my personal opinion).This has worked really well for me, it will deal with (as an example) as many Select Lists as there are in your SP. Note how you have to close the $call BEFORE you can then get to the OUT parameters from your SP...
And this is what the output from the above code looks like using my test_lists SP...
It looks like MySQLi may only support multiple result sets through
mysqli_multi_query()
, sinceMySQLi_STMT
objects work differently fromMySQLi_Result
objects.PDO seems to be somewhat more abstracted, with the PDOStatement objects being able to handle multiple result sets for both regular queries (
PDO::query
) and prepared statements(PDO:prepare
).