Den*_*alj 4 php mysql prepared-statement
我在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";
?>
Run Code Online (Sandbox Code Playgroud)
数据库只有2列,2行有虚拟数据:
现在,当我运行代码时,我期望输出如下:
foo
1
Run Code Online (Sandbox Code Playgroud)
我得到的是:
foo
didn't prepare second
Run Code Online (Sandbox Code Playgroud)
现在我做了一些测试,发现当我交换它时:
$stmt->fetch();
echo '</br>'.$clmn;
Run Code Online (Sandbox Code Playgroud)
为了这:
while($stmt->fetch())
echo '</br>'.$clmn;
Run Code Online (Sandbox Code Playgroud)
我得到这个结果:
foo
bar
1
2
Run Code Online (Sandbox Code Playgroud)
我的想法是,在获取前一个行的所有行之前,不能更改预准备语句.注意,fetch()需要返回false而不仅仅是最后一行,以便第二个语句准备好.
有人对此有更深入的了解吗?我只用XAMPP测试过它.
这很可能是因为仍有结果等待从您的第一个查询中获取.在执行第二个查询之前,请尝试:
$stmt->close();
Run Code Online (Sandbox Code Playgroud)
这应该清除缓冲区,允许进一步运行查询.
| 归档时间: |
|
| 查看次数: |
559 次 |
| 最近记录: |