我正在尝试了解multi queries如何在mysqli中工作。但是我承认这并不容易理解。
基本上,我如何在多查询中执行这些查询?该页面没有讨论多查询中的准备好的语句。
($sql = $db -> prepare("INSERT INTO users (username, email, password) VALUES (?, ?, ?)"));
$sql -> bind_param('sss', $name, $email, $hash);
$sql -> execute();
($sq = $db -> prepare("INSERT INTO activation_link_password_reset (activation_link) VALUES (?)"));
$sq -> bind_param('s', $linkHash);
$sq -> execute();
您不能在此处使用准备好的语句,并且加速也可以忽略不计,因此请更轻松地调试单独的查询。
如果您真的想在1次调用中使用预准备语句来执行此操作,请创建一个PROCEDURE
(甚至更难以调试...,然后准备PROCEDURE
。
我实际上是几天前才想到的。迁移到MySQLi并不是一件容易的事,但不妨继续向您展示准备好的语句的查询循环。
CALL(:param1,:param2);
这里的所有工作都类似于非oo格式,方法是用_替换->并将返回的值传递到新函数中,但是在此过程中,您几乎应该对每个语句都这样做。您也可以使用mysqli包装器类将其抽象。
在$db = new mysqli(...)
$statement = $db->prepare('SELECT count(*) as [hitchhikers] FROM `T_Users` WHERE `id` > ? AND `signin` like ?');
$statement->bind_param("ss", 42, '%adams');
if ($statement->execute())
{
$statement->store_result();
$statement->bind_result($hitchhikers);
$statement->fetch();
// do something with hitchhikers here
}
else
{
// there was a problem with the execution, check $db->error
}
$statement->close();
$db->next_result();
调用之后,您可以再次重复该过程。这种变化与MySQLi处理MySQL连接和结果的方式有关。当然,您可以切换回mysql_查询和资源,从而完全避免此问题。
特别是对于multi_query,您可以在单个字符串中用分号分隔查询。链接到的示例显示了如何处理结果。
$db->next_result()