2011-02-18 91 views
1

问题出在这里。我有一个准备好的声明,像这样:多个预处理语句的问题

$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 ::执行()[mysqli的-stmt.execute]:无效的对象或资源mysqli_stmt *

注意,语句被命名为二无论如何($ select_something和$ select_something_else),我只是认为这是不必要的重复代码。

谢谢!

+0

请使[代码示例完整](http://sscce.org/)以及简洁。 – outis 2011-02-18 09:39:11

回答

1

请注意,mysqli扩展名已被替换为PDO,它更易于使用且性能更好。你应该使用它而不是mysqli。如果您需要PDO教程,请尝试“Writing MySQL Scripts with PHP and PDO”。即使您切换,您仍然可能想知道发生了什么问题,在这种情况下请继续阅读。

这个特定的错误仅仅意味着你没有处理mysqli_stmt$select_something$select_something_else。许多扩展中的函数(尤其是DB扩展)在失败时返回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()