#31668 [Fbk->Asn]: multi_query works exactly every other time
| From: | andrey@php.net | Date: | Wed, 27 Apr 2005 09:58:18 +0000 |
| Subject: | #31668 [Fbk->Asn]: multi_query works exactly every other time | ||
| References: | 1 | Groups: | php.bugs |
| Request: | Send a blank email to php-bugs+get-78259@lists.php.net to get a copy of this message | ||
ID: 31668
Updated by: andrey@php.net
Reported By: exaton at free dot fr
-Status: Feedback
+Status: Assigned
Bug Type: MySQLi related
Operating System: WinXP
PHP Version: 5CVS-2005-04-26
Assigned To: georg
Previous Comments:
------------------------------------------------------------------------
[2005-04-27 11:57:42] andrey@php.net
Please try using this CVS snapshot:
http://snaps.php.net/php5-STABLE-latest.tar.gz
For Windows:
http://snaps.php.net/win32/php5.0-win32-latest.zip
Produces an error in CLI with :
<?php
$SQL = new mysqli("localhost", "andrey", "", "test");
$res = $SQL->multi_query('
SELECT indx FROM faq;
SELECT question, answer FROM faq
');
var_dump($res, $SQL -> error, __LINE__);
do {
$res = $SQL->store_result();
var_dump($SQL -> error, __LINE__);
if ($SQL->errno == 0) {
while ($arr = $res->fetch_assoc())
print_r($arr);
$res->free();
}
} while ($SQL->next_result());
var_dump($SQL -> error, __LINE__);
$SQL->close();
var_dump($SQL->error, __LINE__);
$SQL2 = new mysqli("localhost", "andrey", "", "test");
$res = $SQL2->multi_query('
SELECT indx FROM faq;
SELECT question, answer FROM faq
');
var_dump($res, $SQL2->error, __LINE__);
do {
$res2 = $SQL2->store_result();
var_dump($SQL2->error, __LINE__);
if ($SQL2->errno == 0) {
while ($arr = $res2->fetch_assoc())
print_r($arr);
$res2->free();
}
} while ($SQL2->next_result());
var_dump($SQL2->error, __LINE__);
$SQL->close();
var_dump($SQL2->error, __LINE__);
?>
------------------------------------------------------------------------
[2005-02-22 12:09:28] camka at email dot ee
setting query_cache_type to OFF didn't change anything. still the same
error.
------------------------------------------------------------------------
[2005-02-11 16:15:00] georg@php.net
Does this problem still occur when you disable MySQL's
query cache?
------------------------------------------------------------------------
[2005-01-23 16:39:31] exaton at free dot fr
Hilarity continues :
First off I copy-pasted a second iteration of the code above right
after it, and I constate as expected that the first run through the
code does not work, whereas the second one does (alternation).
The FUN thing is, that if I continue my copy-pasting until I have n
copies of that code block in succession, then the first one still fails
9 times out of 10, with the same error, and then all subsequent blocks
work correctly.
Next up, I decided to give up on resultsets and do other things in my
multi queries ; consider the following block of code :
if (!$SQL -> multi_query('
INSERT faq SET question = "q1", answer = "a1";
INSERT faq SET question = "q2", answer = "a2";
INSERT faq SET question = "q3", answer = "a3"
'))
echo 'ERR i : #'.$SQL -> errno.' : '.$SQL -> error.'<br
/>'; (*)
The i on line (*) is hard-coded to correspond to the i-th block in a
new copy-paste sequence. Indeed, the minimum number of times you want
to copy-paste that block of code is twice, for a total a three blocks.
Then :
The first block fails with the same specious concatenation problem as
before :
"ERR 1 : #1064 : You have an error in your SQL syntax; check the manual
that corresponds to your MySQL server version for the right syntax to
use near '; INSERT faq SET question = "q2", answer = "a2"; INSERT faq
SET question =' at line 1"
Then the second block executes correctly, no error reported.
Then the third block manifestedly executes correctly (I do end up with
TWO sets of [q1,a1 ; q2,a2 ; q3,a3] in my table), BUT multi_query()
must return FALSE because I get :
"ERR 3 : #2013 : Lost connection to MySQL server during query"
And THEN, if I try to do anything else SQL-related, like for example a
simple :
$SQL -> query('DELETE FROM faq WHERE question = "q1"');
Then I log a very hilarious error for that query (which does not get
executed) :
"#2006 : MySQL server has gone away"
I love that.
OK, so I thought, let's look for a simple way of stopping a FIRST
multi_query from failing. Well all it takes is a very simple query to
"give the mysqli connection confidence" as I see it. If I add :
$SQL -> query('SELECT 1');
just after $SQL = new mysqli(...), then not only does that query not
fail, but there is no longer the problem of the first multi_query
failing :
- in my initial description @ 2:26pm CET, the multi_query() always
works, never mind how many browser reloads.
- in this new situation with the INSERT multi_queries, the situation is
TRANSLATED by 1 :
- The first multi_query executes correctly
- The second one executes correctly but I get the 'connection lost
during query' error
- The third one fails, because 'MySQL has gone away'.
In the place of the third multi_query, a simple query() also fails in
the same manner, and so does a prepare(). $SQL -> host_info gave me
correct info, however, so the $SQL object still appears to be partially
valid, it just can't query the server anymore.
---------------------------------------------
---------------------------------------------
RECAP :
* A MySQLi connection appears to need to execute a simple query()
before it will reliably execute multi_queries. If multi_queries are
asked for immediately, the first one of them will fail.
* Whereas this problem did not appear with SELECT multi_queries, INSERT
multi_queries present the following effect : the first one is fine, the
second one works but makes the MySQLi object lose it's ability to
further query the database server.
I hope you have as much fun solving this as I appear to be having
researching it. Good luck and thank you again.
------------------------------------------------------------------------
[2005-01-23 14:39:33] exaton at free dot fr
OK, realised that of course the $SQL -> error is set (when it is set)
right after multi_query() is called. So that should be :
if ($SQL -> multi_query(...))
{
do { ... } while (...);
}
else
echo $SQL -> error; // (*)
But it works out to exactly the same thing. I understand I would notice
a difference only if I were looking out for SQL errors in intermediate
queries sent by multi_query(), making those errors accessible with
next_result() calls. Whatever -- N/A here as far as I can see.
------------------------------------------------------------------------
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/31668
--
Edit this bug report at http://bugs.php.net/?id=31668&edit=1