我使用的准备方法如下:
$db= new mysqli("localhost","***","***","***");
if ($db->connect_error) {
die('Connection Error');
}
$id = 1;
if($stmt = $db->prepare('SELECT name FROM table WHERE id = ? '))
{
$stmt->bind_param('i', $id);
$stmt->execute();
// $stmt->close();
echo "Success<br>";
}
else {
echo "Something broke :/<br>";
}
$id =2;
if($stmt = $db->prepare('SELECT name FROM table WHERE id = ? '))
{
$stmt->bind_param('i', $id);
$stmt->execute();
echo "Success<br>";
}
else {
echo "Something broke :/<br>";
$error = $db->errno . ' ' . $db->error;
echo $error;
}
如果我执行我得到的脚本
Success
有东西坏了:/
第二次调用后,如何找出准备方法失败的原因?因为某些原因,$db->errno
返回 0,表示没有发生任何错误。但是,准备方法失败并返回 false,因此我无法检查$stmt->error;
我偶然发现当我删除第一个$stmt->execute()
调用,然后再次调用准备方法工作正常(在第一次和第二次调用时)。我在这里缺少什么?
Edit
正如 Maxim Tkach 所建议的,如果我取消注释
// $stmt->close();
然后我得到
Success
Success
但这是为什么呢?我从未在任何地方读到关闭准备语句至关重要。
这是来自 PHP 手册:
关闭准备好的语句。 mysqli_stmt_close() 还取消分配
语句句柄。如果当前语句有待处理或未读
结果,该函数取消它们,以便下一个查询可以
被执行。
我没有看到他们说关闭以执行第二个准备语句至关重要。我错过了什么吗?
您需要阅读以下内容:准备好的报表
准备好的语句执行由两个阶段组成:准备和
执行。在准备阶段,报表模板被发送到
数据库服务器。服务器执行语法检查并初始化
服务器内部资源供以后使用。
and
每个准备好的语句都会占用服务器资源。报表应该
使用后立即明确关闭。如果没有明确完成,
当语句句柄被释放时,该语句将被关闭
PHP。
读完这篇文章后,我得出的结论是:如果不关闭前一个查询,则无法准备查询。执行后始终准备好结束询问.
你的代码应该重写如下:
$db= new mysqli("localhost","***","***","***");
if ($db->connect_error) {
die('Connection Error');
}
$id = 1;
if($stmt = $db->prepare('SELECT name FROM table WHERE id = ? ')) {
$stmt->bind_param('i', $id);
$stmt->execute();
echo "Success<br>";
} else {
echo "Something broke :/<br>";
}
$id = 2;
$stmt->bind_param('i', $id);
$stmt->execute();
$stmt->close();
P.S 如果添加绑定和执行的检查返回值 - 那就太好了
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)