Doc #69884 [Ver->Csd]: mysqli->connect_error seems to be shared across objects

From: Date: Fri, 12 Feb 2021 12:09:55 +0000
Subject: Doc #69884 [Ver->Csd]: mysqli->connect_error seems to be shared across objects
References: 1  Groups: php.doc.bugs 
Request: Send a blank email to doc-bugs+get-18530@lists.php.net to get a copy of this message
Edit report at https://bugs.php.net/bug.php?id=69884&edit=1 ID: 69884 Updated by: cmb@php.net Reported by: phpbugs at olemartin dot org Summary: mysqli->connect_error seems to be shared across objects -Status: Verified +Status: Closed Type: Documentation Problem Package: MySQLi related Operating System: Ubuntu PHP Version: 5.5.26 Assigned To: cmb Block user comment: N Private report: N New Comment: Automatic comment on behalf of cmbecker69@gmx.de Revision: http://git.php.net/?p=doc/en.git;a=commit;h=efaedacb533200d9007d704d07e624b27c946036 Log: Fix #69884: mysqli->connect_error seems to be shared across objects Previous Comments: ------------------------------------------------------------------------ [2021-02-12 12:09:08] cmb@php.net These are effectively static properties. ------------------------------------------------------------------------ [2020-10-19 09:58:58] call dot user dot func at gmail dot com 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 ------------------------------------------------------------------------ [2018-08-14 02:54:13] requinix@php.net The values are indeed "shared", meaning the values are not associated with a specific instance but set globally. ------------------------------------------------------------------------ [2018-08-13 21:14:30] brak at gameservers dot com I'm also seeing this same behavior on PHP 7.1.19 running on CentOS 7 ------------------------------------------------------------------------ [2015-06-19 14:19:44] 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 ------------------------------------------------------------------------ -- Edit this bug report at https://bugs.php.net/bug.php?id=69884&edit=1

« previous php.doc.bugs (#18530) next »