多个准备好的语句的问题

2023-12-02

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

$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),我只是认为无需重复代码。


请注意,mysqli 扩展已被替换为PDO,它使用起来更简单,性能也更好。你应该使用它而不是 mysqli。如果您需要 PDO 教程,请尝试“使用 PHP 和 PDO 编写 MySQL 脚本即使你切换了,你可能仍然希望弄清楚出了什么问题,在这种情况下请继续阅读。

该特定错误仅意味着您没有处理mysqli_stmt in $select_something or $select_something_else。许多扩展(尤其是数据库扩展)中的函数返回false当它们失败时,而不是资源或对象。这可能就是这里发生的事情。通过测试可能失败的函数的返回值来遵循正确的错误处理程序。使用mysqli::error获取 MySQLi 函数/方法失败原因的描述。

您可能会遇到 mysqli 和 MySQL 驱动程序的限制:较低级别mysql_use_result() or mysql_store_result()在使用结果之前必须调用它们。默认情况下,mysqli_stmt::execute可能会打电话mysql_use_result,这意味着旧结果必须是在运行新查询之前关闭(在文档中提到mysqli::query())。正确应用mysqli_stmt::store_result可能会解决问题。

请注意,您不需要致电mysqli::stmt_init(),存在(如mysqli_stmt_init)支持过程化编程。相反,您可以使用mysqli::prepare().

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

多个准备好的语句的问题 的相关文章

随机推荐