#24977 [Asn->Csd]: mysql_select_db returns 'true' when select failed
| From: | iliaa@php.net | Date: | Fri, 08 Aug 2003 13:40:38 +0000 |
| Subject: | #24977 [Asn->Csd]: mysql_select_db returns 'true' when select failed | ||
| References: | 1 | Groups: | php.bugs |
| Request: | Send a blank email to php-bugs+get-45582@lists.php.net to get a copy of this message | ||
ID: 24977
Updated by: iliaa@php.net
Reported By: jmat at shutdown dot net
-Status: Assigned
+Status: Closed
Bug Type: MySQL related
Operating System: Linux 2.4.18/Redhat 7.2
PHP Version: 4CVS-2003-08-07 (stable)
Assigned To: iliaa
New Comment:
This bug has been fixed in CVS.
In case this was a PHP problem, snapshots of the sources are packaged
every three hours; this change will be in the next snapshot. You can
grab the snapshot at http://snaps.php.net/.
In case this was a documentation problem, the fix will show up soon at
http://www.php.net/manual/.
In case this was a PHP.net website problem, the change will show
up on the PHP.net site and on the mirror sites in short time.
Thank you for the report, and for helping us make PHP better.
Previous Comments:
------------------------------------------------------------------------
[2003-08-07 20:53:49] jmat at shutdown dot net
That patch appears to have fixed the problem..
It's been running for the past two hours -- I used a load tester and
pushed 56,000+ pages through it -- before the patch, about 1/3 failed
-- after the patch, they all worked: not a single failure.
I'm going to push this updated version out to my other servers now.
------------------------------------------------------------------------
[2003-08-07 18:47:42] iliaa@php.net
Try the following patch and see if it fixes the problem (be sure to
remove your workaround before you start testing it).
http://bb.prohost.org/my.txt
------------------------------------------------------------------------
[2003-08-07 16:48:59] jmat at shutdown dot net
Yet some more info:
I just had a 3rd server start throwing "No Database Selected".
Instead of restarting it, I added a small piece of code into my
abstract library for running queries.
if (mysql_error() == "No Database Selected") {
mysql_select_db(SITE_DB,$db_handle);
$retry_query = true;
}
I basically have this enclosed in a while($retry_query == true) loop
around my queries...
When I do this, it works fine -- the database gets 'reselected', and it
works.
I'm going to leave this in there for now, although it's not very
elegant, it will keep me up for now. :)
------------------------------------------------------------------------
[2003-08-07 16:39:15] jmat at shutdown dot net
It appears that restarting the webserver will 'fix' the problem, for at
least a few hours.
While the server in question is working fine now, a second server
(semi-production) just started throwing "No Database Selected" about 5
minutes ago -- it's been up for 4 hours. It's running the same
versions (except Redhat 8) of Apache/PHP.
Restarting it fixed the problem on it, as well.
For now, I'll just cron a server restart every 3 hours. :)
------------------------------------------------------------------------
[2003-08-07 16:29:52] jmat at shutdown dot net
Description:
------------
When trying to select a database, about every 5 times, the database
will not get selected, and future queries will fail. To make matters
worse, mysql_select_db is returning 'true' even when the database isn't
selected. This code has worked since PHP 4.0, and has never changed;
this problem just started appearing on the latest CVS (had to upgrade
to fix ErrorDocument under Apache/2).
Attached code is pieced together from my database abstraction library;
it produces the same problems as my full code does.
I have verified there are no problems with the database server.
When I push this code back on to 4.3.2, I can't make it fail.
PHP Version 4.3.3RC3-dev
Apache 2.0.47
MySQL Support Client API version 4.0.14
MYSQL_MODULE_TYPE external
for full phpinfo: http://shutdown.net/~web/index.php
Reproduce code:
---------------
/* DEFINE's for server, server port, username, passwd */
define("SITE_DB","test");
$db_handle = mysql_pconnect(DB_SERVER.":".DB_PORT,DB_USER,DB_PASS))
$RETRY = 0;
while (!mysql_select_db(SITE_DB,$db_handle)) {
logger("ERROR: Cannot select ".SITE_DB." database! ATTEMPT
$RETRY".mysql_error(),0);
sleep(1);
if ($RETRY++ > 5) {
trigger_error("Couldn't select ".SITE_DB." on ".DB_SERVER,2);
return false;
}
}
$result = mysql_query("select count(*) from user");
if (mysql_error()) die("FAIL: ".mysql_error());
$value = mysql_result($result,0);
echo $value;
Expected result:
----------------
5
Actual result:
--------------
about 1/3 the time:
"FAIL: No Database Selected"
the other 2/3:
"5"
------------------------------------------------------------------------
--
Edit this bug report at http://bugs.php.net/?id=24977&edit=1