这是问题所在。我有一份准备好的声明,如下:
$select_something = $db->stmt_init();
$select_something->prepare ("
SELECT whatever
FROM table
");
$select_something->execute();
$select_something->bind_result($whatever);
独自一人 - 它有效。当我在执行后添加另一个它也可以。 但是,当我试图首先准备它们时:
$select_something = $db->stmt_init();
$select_something->prepare ("
SELECT whatever
FROM table
");
稍后执行它们:
$select_something->execute();
$select_something->bind_result($whatever);
第一个语句被执行,第二个语句为上面的两行引发了这个错误:
*警告:mysqli_stmt :: execute()[mysqli-stmt.execute]:无效的对象或资源mysqli_stmt *
注意,语句的命名方式不同($ select_something和$ select_something_else),我只是觉得重复代码是不必要的。
谢谢!
答案 0 :(得分:1)
请注意,mysqli扩展已被PDO取代,它更易于使用且性能更佳。你应该使用它而不是mysqli。如果您需要PDO教程,请尝试“Writing MySQL Scripts with PHP and PDO”。即使你换了,你仍然可能想知道出了什么问题,在这种情况下请继续阅读。
该特定错误仅表示您未处理mysqli_stmt
或$select_something
中的$select_something_else
。许多扩展(特别是数据库扩展)中的函数在失败时返回false
,而不是资源或对象。这可能就是这里发生的事情。通过测试可能失败的函数的返回值,遵循正确的错误处理过程。使用mysqli::error
来描述MySQLi函数/方法失败的原因。
您可能遇到mysqli和MySQL驱动程序的限制:必须在结果上调用较低级别mysql_use_result()
或mysql_store_result()
才能使用它们。默认情况下,mysqli_stmt::execute
可能会调用mysql_use_result
,这意味着旧结果必须为closed before a new query is run(在mysqli::query()
的文档中提到)。正确应用mysqli_stmt::store_result
可能会解决问题。
请注意,您不需要调用mysqli::stmt_init()
,它存在(作为mysqli_stmt_init
)以支持程序编程。相反,您可以使用mysqli::prepare()
。