在 PHP-7.4 中更改了 mysqli_stmt::bind_result 的行为

Changed behaviour of mysqli_stmt::bind_result in PHP-7.4

我不知道在这里问这个问题是否合适,但我想这个网站上的一些专家可能会给我一个有价值的答案。

我最近从 PHP-7.3 更新到 PHP-7.4 并注意到了一个我没有预料到的行为。 以下数据库和脚本是演示我的问题的最小示例:

CREATE TABLE `user` (
  `idUser` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(64) NOT NULL,
  PRIMARY KEY (`idUser`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=latin1;

INSERT INTO `user` VALUES (1,'Alice'),(2,'Eve'),(3,'Bob'),(4,'Rick');

CREATE TABLE `user_data` (
  `idUserData` int(11) NOT NULL AUTO_INCREMENT,
  `idUser` int(11) NOT NULL,
  `data` text NOT NULL,
  PRIMARY KEY (`idUserData`),
  KEY `idUser` (`idUser`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=latin1;

INSERT INTO `user_data` VALUES (1,1,'likes to read'),(2,3,'plays in a band');
<?php
$mysqli = new mysqli (HOST, USER, PASSWORD, DATABASE);

$stmt = $mysqli->prepare('SELECT idUser, name FROM user');
$stmt->execute();
$stmt->store_result();
$stmt->bind_result($idUser, $name);

while ($stmt->fetch())
{
    $stmt2 = $mysqli->prepare('SELECT data FROM user_data WHERE idUser = ?');
    $stmt2->bind_param('i', $idUser);
    $stmt2->execute();
    $stmt2->store_result();
    $stmt2->bind_result($data);
    $stmt2->fetch();

    print $name . ' => ' . $data . '<br>';
}
?>

PHP-7.3 给我以下输出:

Alice =>  likes to read
Eve =>
Bob =>  plays in a band
Rick =>

在 PHP-7.4 中我得到这个输出:

Alice =>  likes to read
Eve =>  likes to read
Bob =>  plays in a band
Rick =>  plays in a band

while 循环中的 bind_result()fetch() 不会清除空 sql 结果集上的 $data。它仍然包含上一次迭代的旧值。在 PHP-7.3 和更低版本中,var 被清除。

这是有意为之的行为还是我偶然发现了错误?

我的猜测是正确的。这是一个错误。

我为这个问题创建了一个错误报告,它被验证为回归: https://bugs.php.net/bug.php?id=80604