多个预准备语句的问题

时间:2011-02-18 08:38:14

标签: mysql mysqli prepared-statement

这是问题所在。我有一份准备好的声明,如下:

$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),我只是觉得重复代码是不必要的。

谢谢!

1 个答案:

答案 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()