Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/258.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php MySQLi多个prepare语句_Php_Mysql_Mysqli - Fatal编程技术网

Php MySQLi多个prepare语句

Php MySQLi多个prepare语句,php,mysql,mysqli,Php,Mysql,Mysqli,我已经彻底检查了所有地方,并尽一切可能找到了答案。除了说“代码不起作用”,这显然是不够的,我还没有找到任何接近这一点的东西。我可能会得到落选票,但让我们看看情况如何 我正在学习如何从用户端为搜索查询准备语句,并且我必须为多个查询准备语句。我必须将参数绑定到这些多个查询,然后执行它们并使用它们并接收多行。这是我的大部分代码,我目前没有报告任何错误。它只返回一个空白的白页 我是从一个简单的test.php文件中完成这项工作的,这些就是我得到的结果 现在是代码 $prep1 = $test->p

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

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

我是从一个简单的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=newmysqli(“localhost”、“test”、“test”、“test”)

$search=“steam”
steam当然会被post变量替换,但出于测试原因,我现在已经删除了它,并且只使用一个简单的变量进行测试

这里有什么问题吗

提前感谢。

两点:

  • 根据个人经验,您一次只能有一份准备好的声明。我怀疑这是因为db要求每个PS都有一个会话唯一的名称,而PHP层正在传递一些常见的默认名称,而不是为每个PS生成一个唯一的名称。相比之下,PostgreSQL驱动程序允许每个PS有一个可选名称,但仍然只允许存在一个未命名的PS。本质上,这意味着您必须
    准备
    绑定
    执行
    提取
    一个PS,然后才能
    准备
    下一个PS

  • 您误用了mysqli\u stmt::fetch()
  • fetch()
    仅返回
    true
    false
    ,用于更新以前与
    mysqli\u stmt::bind\u result()绑定的变量。要将值检索到
    $row
    数组中,必须首先调用
    mysqli\u stmt::get\u result()
    返回
    mysqli\u结果
    ,然后调用
    mysqli\u result::fetch\u数组()


    关于你提出的一般性问题

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

    关于你的特殊问题

  • 获取错误
  • 提出三个问题是毫无意义的,你只需要提出一个问题。如果你在做一个问题上有困难,可以问另一个问题,用mysql标记并带上你的3个查询
  • 即使对于多个查询,在一个循环中执行多个回迁也是错误的。逐个获取查询结果
  • 即使对于单个查询,您的mysqli语法也不完整。您需要重新阅读教程,并首先在单个查询上进行练习

  • 我对它们进行了排序,以便一次准备一个,然后绑定结果(因为我没有mysqlnd,所以无法使用get_result),然后使用fetch_array,但在它能够获取array
    PHP警告:mysqli_stmt::bind_result()之前,我收到了这个错误:绑定变量的数量与准备语句中的字段数量不匹配
    如果您正在执行
    SELECT*
    操作,则必须
    bind\u result()
    表中有多少列就有多少个变量。事实上,你可能会发现用电脑做这些事情更容易。我不知道。谢谢我接受了你的建议,决定重写它以使用PDO,现在一切似乎都正常了。我现在唯一剩下的问题是,出于某种原因,empty()无法处理一个明显为空的数组。不过我会把这个留到另一个问题上来。谢谢你的帮助。@YourCommonSense你有什么有用的补充吗?为什么是3个问题?你可以只做一个。