我已经彻底检查了所有地方,并尽可能地找到了答案。除了说"代码不起作用"这显然是不够的,我还没有找到任何甚至接近这一点的东西。我可能会得到一些投票,但让我们看看这是怎么回事。
我正在学习如何从用户端为搜索查询做预备语句,我必须为多个查询执行此操作。我必须将参数绑定到这些多个查询,然后执行它们并使用它们并接收多行。这是我的大多数代码,而我目前所拥有的是 not 报告任何错误。它只返回一个空白页面。
我是从一个简单的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变量,但出于测试原因,我现在已经删除了它,并且仅使用一个简单的变量进行测试。
这里似乎有什么问题?
提前致谢。
答案 0 :(得分:0)
关于您提出的一般性问题。
准备多个查询没有任何问题。在谈到从准备好的查询中获得结果时,确实存在由结果缓冲引起的问题。为了能够执行另一个查询,您必须在执行后立即调用store_result()/ get_result()。
关于你遇到的特殊问题。
答案 1 :(得分:-1)
两点:
根据个人经验,您一次只能有一份准备好的陈述。我怀疑这是因为db要求每个PS都有一个会话唯一的名称,并且PHP层传递一些常见的默认名称,而不是为每个PS生成唯一的名称。相比之下,PostgreSQL驱动程序允许每个PS的可选名称,但仍然只允许存在一个未命名的 PS。基本上这意味着你必须prepare
,bind
,execute
和fetch
一个PS 完全才能prepare
下一个PS
您误用了mysqli_stmt::fetch()
。 fetch()
仅返回 true
或 false
,并用于更新先前已与mysqli_stmt::bind_result()
绑定的变量。要将值检索到$row
数组,您必须先致电mysqli_stmt::get_result()
以返回mysqli_result
,然后致电mysqli_result::fetch_array()
。