From 85a04b3ee2306bbe6a36548efe788a18bfd08d43 Mon Sep 17 00:00:00 2001 From: Bruno Moreira <5393+pocketarc@users.noreply.github.com> Date: Tue, 10 Nov 2026 08:07:33 -0500 Subject: [PATCH 1/3] fix: Check mysqli connections with DO 1 instead of the deprecated ping(). --- .../database/drivers/mysqli/mysqli_driver.php | 2 +- .../database/Mysqli_reconnect_test.php | 44 +++++++++++++++++++ 2 files changed, 45 insertions(+), 1 deletion(-) create mode 100644 tests/codeigniter/database/Mysqli_reconnect_test.php diff --git a/system/database/drivers/mysqli/mysqli_driver.php b/system/database/drivers/mysqli/mysqli_driver.php index 61e7adee3c7..1427425b5d0 100644 --- a/system/database/drivers/mysqli/mysqli_driver.php +++ b/system/database/drivers/mysqli/mysqli_driver.php @@ -248,7 +248,7 @@ public function db_connect($persistent = FALSE) */ public function reconnect() { - if ($this->conn_id !== FALSE && $this->conn_id->ping() === FALSE) + if ($this->conn_id !== FALSE && $this->conn_id->query('DO 1') === FALSE) { $this->conn_id = FALSE; } diff --git a/tests/codeigniter/database/Mysqli_reconnect_test.php b/tests/codeigniter/database/Mysqli_reconnect_test.php new file mode 100644 index 00000000000..805902fcb1d --- /dev/null +++ b/tests/codeigniter/database/Mysqli_reconnect_test.php @@ -0,0 +1,44 @@ +markTestSkipped('Requires the mysqli driver.'); + } + + $db = Mock_Database_Schema_Skeleton::init(DB_DRIVER); + $db->initialize(); + + $notices = array(); + set_error_handler(function ($severity, $message) use (&$notices) { + $notices[] = $message; + return TRUE; + }); + + $db->reconnect(); + $alive_after_live_check = ($db->conn_id !== FALSE); + + $config = Mock_Database_DB::config(DB_DRIVER); + $config = $config[DB_DRIVER]; + $admin = new mysqli($config['hostname'], $config['username'], $config['password'], $config['database']); + $admin->query('KILL '.$db->conn_id->thread_id); + $admin->close(); + usleep(200000); + + $db->reconnect(); + $dropped_after_dead_check = ($db->conn_id === FALSE); + + $query = $db->query('SELECT 1 AS one'); + + restore_error_handler(); + + $this->assertSame(array(), $notices); + $this->assertTrue($alive_after_live_check); + $this->assertTrue($dropped_after_dead_check); + $this->assertEquals(1, $query->row()->one); + } + +} From a39c8f0afd5e8201e5ec01d617f58073a00a3f54 Mon Sep 17 00:00:00 2001 From: Bruno Moreira <5393+pocketarc@users.noreply.github.com> Date: Tue, 10 Nov 2026 08:07:47 -0500 Subject: [PATCH 2/3] chore: Bump version to 3.4.9. --- system/core/CodeIgniter.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/core/CodeIgniter.php b/system/core/CodeIgniter.php index e3a6f44b200..b90602ff37f 100644 --- a/system/core/CodeIgniter.php +++ b/system/core/CodeIgniter.php @@ -56,7 +56,7 @@ * @var string * */ - const CI_VERSION = '3.4.8'; + const CI_VERSION = '3.4.9'; /* * ------------------------------------------------------ From 6240d14aa2d0c7f1bb9f8410b1aa59eda94d3a2f Mon Sep 17 00:00:00 2001 From: Bruno Moreira <5393+pocketarc@users.noreply.github.com> Date: Tue, 10 Nov 2026 08:17:07 -0500 Subject: [PATCH 3/3] test: Only fail the mysqli reconnect test on deprecation notices. --- tests/codeigniter/database/Mysqli_reconnect_test.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/codeigniter/database/Mysqli_reconnect_test.php b/tests/codeigniter/database/Mysqli_reconnect_test.php index 805902fcb1d..514961a0488 100644 --- a/tests/codeigniter/database/Mysqli_reconnect_test.php +++ b/tests/codeigniter/database/Mysqli_reconnect_test.php @@ -12,9 +12,9 @@ public function test_reconnect_detects_dropped_connection() $db = Mock_Database_Schema_Skeleton::init(DB_DRIVER); $db->initialize(); - $notices = array(); - set_error_handler(function ($severity, $message) use (&$notices) { - $notices[] = $message; + $deprecations = array(); + set_error_handler(function ($severity, $message) use (&$deprecations) { + $severity === E_DEPRECATED && $deprecations[] = $message; return TRUE; }); @@ -35,7 +35,7 @@ public function test_reconnect_detects_dropped_connection() restore_error_handler(); - $this->assertSame(array(), $notices); + $this->assertSame(array(), $deprecations); $this->assertTrue($alive_after_live_check); $this->assertTrue($dropped_after_dead_check); $this->assertEquals(1, $query->row()->one);