【发布时间】:2015-11-12 11:43:44
【问题描述】:
我在 PHP 中遇到了关于准备好的语句的奇怪行为。谷歌搜索这个问题没有任何结果,所以就在这里。
假设你有这个代码:
<?php
$db = new mysqli('localhost','root','','test');
$q = 'SELECT text FROM tests';
if($stmt = $db->prepare($q))
{
$stmt->bind_result($clmn);
$stmt->execute();
$stmt->fetch();
echo '</br>'.$clmn;
}
else echo "</br>didn't prepare first";
$q = 'SELECT id FROM tests';
if($stmt = $db->prepare($q))
{
$stmt->bind_result($clmn);
$stmt->execute();
$stmt->fetch();
echo '</br>'.$clmn;
}
else echo "</br>didn't prepare second";
?>
数据库只有 2 列 2 行的虚拟数据:
现在当我运行代码时,我期望的输出是这样的:
foo
1
我得到的是:
foo
didn't prepare second
现在我做了一些测试,发现当我交换这个时:
$stmt->fetch();
echo '</br>'.$clmn;
为此:
while($stmt->fetch())
echo '</br>'.$clmn;
我得到这个结果:
foo
bar
1
2
我的想法是,在获取前一个语句的所有行之前,无法更改准备好的语句。请注意,fetch() 需要返回 false 而不仅仅是最后一行,以便准备好第二条语句。
有人对此有更深入的了解吗?我只用 XAMPP 测试过。
【问题讨论】:
标签: php mysql prepared-statement