1

这可能已经被问过几次了,但是我很难理解如何将数组绑定到 mysqli 准备好的语句。

我正在尝试做的是在消息线程中查询用户 ID 列表,然后插入到消息表中,以便通知用户有新的消息回复。

这是我尝试过的:

//now check which users are in the message thread
$stmt2 = $mysqli->prepare("SELECT DISTINCT user_id_2
FROM uc_user_messages
WHERE thread_id =  ?");
$stmt2->bind_param("i", $this->thread_id_clean);
$stmt2->bind_result($user_2_id);
$stmt2->execute();

$stmt3 = $mysqli->prepare("
INSERT INTO `users`.`uc_user_messages`(
    `id` ,
    `message_id` ,
    `user_id_2` ,
    `read` ,
    `thread_id`
    )
    VALUES (
    NULL , ?, ?, ?, ?
    );
");

//now insert the message into the user_messages table so the user can be notified of a new message
while ($row = $stmt2->fetch()){
    $stmt3->bind_param("iiii", $inserted_id, $user_2_id, $read, $this->thread_id_clean );
    $stmt3->execute();
}   

我究竟做错了什么?我也尝试将准备好的语句放入循环中,但我不断收到此错误:

致命错误:在非对象上调用成员函数 bind_param()

我还使用测试数据手动运行了查询,所以我知道是循环导致值无法正确绑定。

编辑:我应该补充一点,选择查询工作正常,并且它是导致错误的插入查询。

4

3 回答 3

0

一旦 var 绑定到您的 prep 语句,它就会保持绑定。

这意味着 cou 仅调用一次 bind_param(在循环之外),然后重复两步循环“更改 var 值/执行”。

php.net:检查第 3 节 INSERT 准备一次,执行多次

还要确保用于 db 和 table 名称的引号不会干扰 PHP 的反引号运算符。(在这种特定情况下,您可以省略这些引号。)

于 2013-05-16T22:37:54.900 回答
0

致命错误:在非对象上调用成员函数 bind_param()

这意味着 $stmt2 或 $stmt3 不是对象。false如果解析或验证查询有任何问题,prepare() 函数就会返回。但false->bind_param()就是行不通。

这是许多 MySQL 开发人员常犯的错误。解决方案是您必须检查 prepare() 返回成功而不是false.

例子:

$stmt2 = $mysqli->prepare("...");
if ($stmt2 === false) {
  // do something to report $mysqli->error, and return
}

另见http://php.net/manual/en/mysqli.error.php

于 2013-05-16T22:49:41.657 回答
0
  1. 您没有检查错误。按照此处说明的方式进行操作:https ://stackoverflow.com/a/15447204/285587
  2. 最有可能的错误是“命令不同步”之类的错误。您必须store_result()在第一个查询中使用以避免这种情况。奇怪的是,比尔有一个完美的答案,它首先在谷歌搜索- 你可以参考它了解详细信息。

我只是不知道你在说哪些数组。

于 2013-05-17T08:59:02.460 回答