[php-src] Issue #11550: MySQL Statement has a empty query result when the response field has changed, also Segmentation fault
| From: | Yurunsoft | Date: | Wed, 28 Jun 2023 08:21:17 +0000 |
| Subject: | [php-src] Issue #11550: MySQL Statement has a empty query result when the response field has changed, also Segmentation fault | ||
| Groups: | php.bugs | ||
| Request: | Send a blank email to php-bugs+get-244829@lists.php.net to get a copy of this message | ||
Issue: https://github.com/php/php-src/issues/11550
Author: Yurunsoft
### Description
The following code:
```php
<?php
declare(strict_types=1);
function getPDO(): PDO
{
return new PDO('mysql:host=127.0.0.1;dbname=test', 'root', 'root',
[
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_EMULATE_PREPARES => false,
]);
}
function testPDO(): void
{
$pdo = getPDO();
$pdo->exec(<<<'SQL'
DROP TABLE IF EXISTS
test
SQL);
$pdo->exec(<<<'SQL'
CREATE TABLE test (
id int(10) UNSIGNED NOT NULL AUTO_INCREMENT,
name varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,
PRIMARY KEY (id) USING BTREE,
INDEX name(name) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = Dynamic;
SQL);
$pdo->exec(<<<'SQL'
INSERT INTO test (name) VALUES ('test1');
SQL);
$pdo2 = getPDO();
$stmt = $pdo2->prepare('select * from test');
var_dump('PDO-1:', $stmt->execute(), $stmt->fetchAll());
$stmt->closeCursor(); // Optional. Segmentation fault (core dumped)
$pdo->exec(<<<'SQL'
ALTER TABLE test
ADD COLUMN a varchar(255) NOT NULL DEFAULT '';
SQL);
var_dump('PDO-2:', $stmt->execute(), $stmt->fetchAll());
}
function getMysqli(): mysqli
{
return new mysqli('127.0.0.1', 'root', 'root', 'test');
}
function testMysqli(): void
{
$mysqli = getMysqli();
$mysqli->query(<<<'SQL'
DROP TABLE IF EXISTS test
SQL);
$mysqli->query(<<<'SQL'
CREATE TABLE test (
id int(10) UNSIGNED NOT NULL AUTO_INCREMENT,
name varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,
PRIMARY KEY (id) USING BTREE,
INDEX name(name) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = Dynamic;
SQL);
$mysqli->query(<<<'SQL'
INSERT INTO test (name) VALUES ('test1');
SQL);
$mysqli2 = getMysqli();
$stmt = $mysqli2->prepare('select * from test');
var_dump('mysqli-1:', $stmt->execute(), $stmt->get_result()->fetch_all());
$mysqli->query(<<<'SQL'
ALTER TABLE test
ADD COLUMN a varchar(255) NOT NULL DEFAULT '';
SQL);
var_dump('mysqli-2:', $stmt->execute(), $stmt->get_result()->fetch_all());
}
testMysqli();
testPDO();
```
Resulted in this output:
```
string(9) "mysqli-1:"
bool(true)
array(1) {
[0]=>
array(2) {
[0]=>
int(1)
[1]=>
string(5) "test1"
}
}
string(9) "mysqli-2:"
bool(true)
array(0) {
}
string(6) "PDO-1:"
bool(true)
array(1) {
[0]=>
array(4) {
["id"]=>
int(1)
[0]=>
int(1)
["name"]=>
string(5) "test1"
[1]=>
string(5) "test1"
}
}
Segmentation fault (core dumped)
```
But I expected this output instead:
```
string(9) "mysqli-1:"
bool(true)
array(1) {
[0]=>
array(2) {
[0]=>
int(1)
[1]=>
string(5) "test1"
}
}
string(9) "mysqli-2:"
bool(true)
array(1) {
[0]=>
array(3) {
[0]=>
int(1)
[1]=>
string(5) "test1"
[2]=>
string(0) ""
}
}
string(6) "PDO-1:"
bool(true)
array(1) {
[0]=>
array(4) {
["id"]=>
int(1)
[0]=>
int(1)
["name"]=>
string(5) "test1"
[1]=>
string(5) "test1"
}
}
string(6) "PDO-2:"
bool(true)
array(1) {
[0]=>
array(6) {
["id"]=>
int(1)
[0]=>
int(1)
["name"]=>
string(5) "test1"
[1]=>
string(5) "test1"
["a"]=>
string(0) ""
[2]=>
string(0) ""
}
}
```
This bug affects mysqli, pdo_mysql.
I will fix this issue later.
### PHP Version
PHP 8.1.21
### Operating System
_No response_