MySQLi多个prepare语句


MySQLi multiple prepare statements

我已经彻底检查了所有地方,并尽一切可能找到答案。除了说"代码不起作用"这显然是不够的,我还没有找到任何接近这一点的东西。我可能会被否决,但让我们看看情况如何。

我正在学习如何从用户端为搜索查询做准备好的语句,并且我必须为多个查询做这件事。我必须将参数绑定到这些多个查询,然后执行它们并使用它们并接收多行。这是我的大部分代码,我目前拥有的是而不是报告任何错误。它只是返回一个空白的白色页面。

我是从一个简单的test.php文件中完成这项工作的,这些就是我得到的结果。

现在是代码。

$prep1 = $test->prepare("SELECT * FROM sb__bans WHERE sb__bans.authid=? ORDER BY sb__bans.bid DESC");
$prep2 = $test->prepare("SELECT * FROM sb__bans AS bans INNER JOIN sb__admins AS admins ON bans.aid = admins.aid WHERE bans.authid=? ORDER BY bans.bid DESC");
$prep3 = $test->prepare("SELECT * FROM sb__bans AS bans INNER JOIN sb__servers AS servers ON bans.sid = servers.sid WHERE bans.authid=? ORDER BY bans.bid DESC");
$search = "steam";
$prep1->bind_param("s", $search);
$prep2->bind_param("s", $search);
$prep3->bind_param("s", $search);
$prep1->execute();
$prep2->execute();
$prep3->execute();
while($row = $prep1->fetch() && $admin = $prep2->fetch() && $sv = $prep3->fetch()) {
echo $row['test'];
echo $admin['test'];
echo $sv['test'];
}

数据库在此之上初始化为$test = new mysqli("localhost", "test", "test", "test");

当然,$search = "steam"蒸汽将被post变量取代,但出于测试原因,我现在已经删除了它,只使用一个简单的变量进行测试。

这里好像出了什么问题?

提前谢谢。

关于您提出的一般问题。

准备多个查询没有一个问题。在谈到从准备好的查询中获取结果时,确实存在由结果缓冲引起的问题。为了能够执行另一个查询,您必须在执行之后立即调用store_result()/get_result)。

关于你遇到的特定问题。

  1. 要得到错误,你必须向PHP索取它们
  2. 做三个查询绝对没有意义,你只需要做一个。如果您在创建一个时遇到问题,请询问另一个问题,用mysql标记它,并带来您的3个查询
  3. 即使对于多个查询,在一个循环中进行多次获取也是错误的。逐个获取查询结果
  4. 即使是单个查询的mysqli语法也是不完整的。您需要重新阅读教程,并首先对单个查询进行练习

两点:

  1. 根据个人经验,你一次只能有一个事先准备好的陈述。我怀疑这是因为数据库要求每个PS都有一个会话唯一的名称,而PHP层正在传递一些常见的默认名称,而不是为每个PS生成一个唯一的名称。相比之下,PostgreSQL驱动程序允许每个PS有一个可选名称,但仍然只允许存在一个未命名的PS。从本质上讲,这意味着您必须preparebindexecutefetch一个PS完全,然后才能prepare下一个PS。

  2. 你滥用mysqli_stmt::fetch()fetch()仅返回truefalse,用于更新先前与mysqli_stmt::bind_result()绑定的变量。要将值检索到$row数组中,必须首先调用mysqli_stmt::get_result()以返回mysqli_result,然后调用mysqli_result::fetch_array()