|
php.net | support | documentation | report a bug | advanced search | search howto | statistics | random bug | login |
[2015-06-19 14:19 UTC] phpbugs at olemartin dot org
Description:
------------
It seems that the \mysqli->connect_error and \mysqli->connect_errno values (when using mysqli in the object-oriented mode) shares state between all connections. This is not documented (it should at least have a warning in the documentation).
When running the example code (make sure you point the first and last connection to a valid MySQL server) i found that all connections reported no errors, although the second one failed. Sometimes (although I'm having a hard time reliably reproducing this) i'm pretty sure i've also seen all three connections report errors (although the third and last connection succeeded). Maybe this value is not overwritten when a successful connection is done, in all code paths?
Either way, i think this should be either documented or fixed - as one would not expect this information to be shared between instances when the syntax doesn't indicate that. If this is a static property, i would expect the documentation said to use \mysqli::$connect_error, but that doesn't even work.
Test script:
---------------
$connections = array(
'Valid connection' => new mysqli('127.0.0.1', 'root', '', 'test', 3306),
'Invalid connection' => @new mysqli('127.0.0.1', 'root', '', 'test', 3307),
'Valid connection 2' => new mysqli('127.0.0.1', 'root', '', 'test', 3306),
);
foreach($connections as $desc => $conn) {
echo "$desc:\n".
"connect_error = ".$conn->connect_error."\n".
"connect_errno = ".$conn->connect_errno."\n".
"ping = ".@$conn->ping()."\n\n".
}
Expected result:
----------------
Valid connection:
connect_error =
connect_errno = 0
ping = 1
Invalid connection:
connect_error = Connection refused
connect_errno = 2002
ping =
Valid connection 2:
connect_error =
connect_errno = 0
ping = 1
Actual result:
--------------
Valid connection:
connect_error =
connect_errno = 0
ping = 1
Invalid connection:
connect_error =
connect_errno = 0
ping =
Valid connection 2:
connect_error =
connect_errno = 0
ping = 1
PatchesPull RequestsHistoryAllCommentsChangesGit/SVN commits
|
|||||||||||||||||||||||||||||||||||||
Copyright © 2001-2025 The PHP GroupAll rights reserved. |
Last updated: Tue Nov 04 20:00:01 2025 UTC |
Hi, this behaviour is the same in php8+. A warning in the docs would've been really helpful, as it's a pain to debug. A very brief testcase: $db1 = new MySQLi("localhost", "root", "", "mysql", 3306); var_dump("1: ".$db1->connect_error); // not error, db exist $db2 = new MySQLi("localhost", "root", "", "some_non_existing_db", 3306); var_dump("2: ".$db2->connect_error); // error, db not exist // db2 shared error to db1 which is wrong, db1 is still valid var_dump("3: ".$db1->connect_error); // not error, db exist