2013-03-14 75 views
0

如果我正确读取PHP文档,我想使用mysqli_stmt_init来创建适合stmt操作的变量是否正确?我以为我做得正确,但似乎没有正常工作。当我这样做的文件说,它给了我一个错误:MySQLI语句(stmt)初始化错误

警告:mysqli_stmt_bind_param()[function.mysqli-语句绑定 - 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); 

你能看见?

? and and CPid 

因此返回:我做了什么错在这里

+2

'和和CPid>?'太多了'和'。 – 2013-03-14 00:51:20

+0

使用'if(!$ get_posts)echo mysqli_error($ db)进行错误检查;' – 2013-03-14 00:52:16

+0

好吧,它看起来是太多了,谢谢! – Rujikin 2013-03-14 00:54:34

回答

2

查询是因为那些双and and中失败作为mysqli_statement。然后将 FALSE插入导致该错误的mysqli_stmt_bind_param函数(因为它只接受有效的mysqli_stmt)。 只需删除一个and即可,你会没事的。

从mysqli_prepare:

mysqli_prepare() returns a statement object or FALSE if an error occurred.

这是很好的做法,不过,要经常检查查询错误和这样的。你应该至少检查准备好的语句与价值:

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。它具有良好的异常处理功能,让事情变得更加容易,特别是在出现问题时。