繁体   English   中英

MySQLi 多条准备语句

[英]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" steam 当然会被 post 变量替换,但出于测试原因,我现在已经删除了它,并且只使用一个简单的变量进行测试。

这里似乎有什么问题?

提前致谢。

关于你问的一般问题。

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

关于您遇到的特定问题。

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

两点:

  1. 根据个人经验,您一次只能有一个准备好的语句。 我怀疑这是因为 db 要求每个 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()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM