| 
        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 13:00:02 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