php - 在 PHP-7.4 中改变了 mysqli_stmt::bind_result 的行为
问题描述
我不知道这是否是问这个问题的正确地方,但我认为这个网站上的专家可能会给我一个有价值的答案。
我最近从 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()
orfetch()
不会清除$data
空的 sql 结果集。它仍然包含上一次迭代的旧值。在 PHP-7.3 和更低版本中,var 被清除。
那么这是预期的行为还是我偶然发现了一个错误?
解决方案
我的猜测是正确的。这是一个错误。
我为这个问题创建了一个错误报告,它被验证为回归: https ://bugs.php.net/bug.php?id=80604
推荐阅读
- sql - 动态 sql 数据透视值出现在单独的列中
- c++ - 无法使用 qt 在 imx6 中发送 spi 消息
- javascript - Javascript Date 对象的构造函数返回一个月前的日期
- visual-studio-code - 为什么 vscode pylint 会漏掉明显的错误?
- d3.js - 尽管在选择时调用了中断,但无法删除 d3 转换
- c# - 使用 C# 与 SQL 集成服务对话
- django - django 2.1 上的 select_related 不工作
- batch-file - 使用 Windows ren 命令删除 ! 从文件名
- azure - Azure Logic App 在 Http 查询参数请求中使用 SAS 令牌
- powershell - 在 PowerShell 多行脚本块中传递凭据