ID: 42548
Updated by: [EMAIL PROTECTED]
Reported By: garethjo at usc dot edu
Status: Assigned
Bug Type: MySQLi related
Operating System: Windows XP, Windows 2003
PHP Version: 5.2.4
Assigned To: georg
New Comment:
test case:
--TEST--
Bug #42548 PROCEDURE xxx can't return a result set in the given context
(works in 5.2.3!!)
--SKIPIF--
<?php if (!extension_loaded("mysqli")) print "skip"; ?>
--FILE--
<?php
$mysqli = mysqli_init();
$mysqli->real_connect('localhost', 'root', '', 'test');
if (mysqli_connect_errno())
{
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
$mysqli->query("DROP PROCEDURE IF EXISTS p1") or die($mysqli->error);
$mysqli->query("CREATE PROCEDURE p1() BEGIN SELECT 42; END") or
die($mysqli->error);
if($mysqli->multi_query ("CALL p1();"))
{
do
{
if($objResult = $mysqli->store_result())
{
while($row = $objResult->fetch_assoc())
{
var_dump($row);
}
$objResult->close();
if($mysqli->more_results())
{
print "----- next result -----------\n";
}
}
else
{
print "no results found";
}
}while ( $mysqli->next_result());
}
else
{
print $mysqli->error;
}
$mysqli->query("DROP PROCEDURE p1") or die($mysqli->error);
$mysqli->close();
?>
--EXPECT--
array(1) {
[42]=>
string(2) "42"
}
----- next result -----------
no results found
Previous Comments:
------------------------------------------------------------------------
[2007-11-19 18:22:01] [EMAIL PROTECTED]
See also
http://dev.mysql.com/doc/refman/5.0/en/mysql-set-server-option.html
Enabling multiple-statement support with
MYSQL_OPTION_MULTI_STATEMENTS_ON
does not have quite the same effect as enabling it by passing the
CLIENT_MULTI_STATEMENTS flag to mysql_real_connect():
CLIENT_MULTI_STATEMENTS also enables CLIENT_MULTI_RESULTS.
If you are using the CALL SQL statement in your programs,
multiple-result
support must be enabled; this means that
MYSQL_OPTION_MULTI_STATEMENTS_ON
by itself is insufficient to allow the use of CALL.
------------------------------------------------------------------------
[2007-11-19 18:21:19] [EMAIL PROTECTED]
The change to 5.2.4 was correct, previously the
CLIENT_MULTI_STATEMENTS
flag was actually inverted instead of reset, and as the default value
for flags is
0 it was actually set, not reset, most of the time.
Multiple statements are only temporarily enabled using the
MYSQL_OPTION_MULTI_STATEMENTS_ON and _OFF arguments
to mysql_set_server_option().
The problem here is that CLIENT_MULTI_STATEMENTS in
mysql_real_connects()
implicitly enables CLIENT_MULTI_RESULTS, too, but
MYSQL_OPTION_MULTI_STATEMENTS_ON only enables multiple statements,
*not* multiple results.
So the solution is to always remove CLIENT_MULTI_STATEMENTS on connect
but at the same time to always enable CLIENT_MULTI_RESULTS as this
can't be modified later (patch against latest 5.2 CVS):
$ cvs diff -u mysqli_api.c
Index: mysqli_api.c
===================================================================
RCS file: /repository/php-src/ext/mysqli/mysqli_api.c,v
retrieving revision 1.118.2.22.2.18
diff -u -u -r1.118.2.22.2.18 mysqli_api.c
--- mysqli_api.c 17 Oct 2007 08:19:50 -0000
1.118.2.22.2.18
+++ mysqli_api.c 19 Nov 2007 18:20:28 -0000
@@ -1438,6 +1438,8 @@
MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link,
"mysqli_link", MYSQLI_STATUS_INITIALIZED);
+ /* set some required options */
+ flags |= CLIENT_MULTI_RESULTS; /* needed for
mysql_multi_query() */
/* remove some insecure options */
flags &= ~CLIENT_MULTI_STATEMENTS; /* don't allow
multi_queries via connect parameter */
if ((PG(open_basedir) && PG(open_basedir)[0] != '\0') ||
PG(safe_mode)) {
------------------------------------------------------------------------
[2007-10-21 14:35:13] ajs at ictpro dot ch
Will this bug be fixed in 5.2.5?
Thanks...
------------------------------------------------------------------------
[2007-10-02 20:47:37] Al dot Smith at aeschi dot ch dot eu dot org
Ok, so it turns out that this bug is amazingly easy to figure out. I
just started looking at changes between 5.2.3 and 5.2.4 in ext/mysqli.
It turns out that there really aren't many changes in the mysqli code,
and of course one of them deals with the CLIENT_MULTI_STATEMENTS flag.
Reverting this change between 5.2.3 and 5.2.4 means that 5.2.4 is once
again able to do multi-queries.
Goody gumdrops.
diff -ur php-5.2.4-orig/ext/mysqli/mysqli_api.c
php-5.2.4/ext/mysqli/mysqli_api.c
--- php-5.2.4-orig/ext/mysqli/mysqli_api.c 2007-07-24
11:22:16.000000000 +0200
+++ php-5.2.4/ext/mysqli/mysqli_api.c 2007-10-02 22:43:49.000000000
+0200
@@ -1433,7 +1433,7 @@
MYSQLI_FETCH_RESOURCE(mysql, MY_MYSQL *, &mysql_link,
"mysqli_link", MYSQLI_STATUS_INITIALIZED);
/* remove some insecure options */
- flags &= ~CLIENT_MULTI_STATEMENTS; /* don't allow
multi_queries via connect parameter */
+ flags ^= CLIENT_MULTI_STATEMENTS; /* don't allow multi_queries
via connect parameter */
if ((PG(open_basedir) && PG(open_basedir)[0] != '\0') ||
PG(safe_mode)) {
flags &= ~CLIENT_LOCAL_FILES;
}
------------------------------------------------------------------------
[2007-09-12 16:42:58] garethjo at usc dot edu
This is the example of the code from my initial bug report reworked to
use the multi_query. It uses the same database setup script as the
original script in the first bug report and produces the same error:
//------------ BUG TEST START --------------------------
$mysqli = mysqli_init();
$mysqli->real_connect('localhost', 'root', 'root_pass', 'test');
if (mysqli_connect_errno())
{
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
if($mysqli->multi_query ("CALL spGetProducts();"))
{
do
{
if($objResult = $mysqli->store_result())
{
while($row = $objResult->fetch_assoc())
{
print $row["strProductName"]."
".$row["douProductPrice"]."<br>\r\n";
}
$objResult->close();
if($mysqli->more_results())
{
print "------------------------<BR>";
}
}
else
{
print "no results found";
}
}while ( $mysqli->next_result());
}
else
{
print $mysqli->error;
}
$mysqli->close();
?>
------------------------------------------------------------------------
The remainder of the comments for this report are too long. To view
the rest of the comments, please view the bug report online at
http://bugs.php.net/42548
--
Edit this bug report at http://bugs.php.net/?id=42548&edit=1