0

如果我正确阅读了 PHP 文档,我想使用 mysqli_stmt_init 创建一个适合 stmt 操作的变量,对吗?我以为我做得对,但它似乎不能正常工作。当我按照文档说的那样做时,它给了我一个错误:

警告:mysqli_stmt_bind_param() [function.mysqli-stmt-bind-param]:无效对象或资源 mysqli_stm"

$get_posts = mysqli_stmt_init($db);
mysqli_stmt_prepare($get_posts, 'select * from Chatposts where Chatid = ? and and CPid > ? and Deleted = ? order by CPid desc limit ?');
mysqli_stmt_bind_param($get_posts, 'iiii', $chatroomid, $lastpost, $deleted, $limit);
mysqli_stmt_execute($get_posts);
mysqli_stmt_bind_result($get_posts, $newposts);
mysqli_stmt_fetch($get_posts);
mysqli_stmt_close($get_posts);

你能看到我在这里做错了吗?

4

1 回答 1

2

查询失败,因为那些双重and and

? and and CPid

因此FALSE作为 mysqli_statement 返回。 FALSE然后插入到mysqli_stmt_bind_param导致该错误的函数中(因为它只接受 valid mysqli_stmt)。删掉一个and就好了

从 mysqli_prepare:

如果发生错误,mysqli_prepare() 返回一个语句对象或 FALSE。

但是,始终检查查询错误等是一种很好的做法。您至少应该检查准备好的语句的值:

mysqli_stmt_prepare($get_posts, 'select * from Chatposts where Chatid = ? and and CPid > ? and Deleted = ? order by CPid desc limit ?');
if (!empty(mysqli_error())) // exit or trigger error

我强烈建议转到 PDO。它具有良好的异常处理能力,使一切变得更加容易,尤其是在出现故障时。

于 2013-03-14T00:52:46.783 回答