如何关闭mysqli准备语句中的结果集,但保留该语句-而不缓冲整个结果?

BadZen

我试图在PHP中使用mysqli驱动程序使用多个准备好的语句,并得到臭名昭著的错误:

命令不同步;您现在不能运行此命令

尽管我认为此数据库API严重损害了大脑,但我确实理解了为什么会收到此错误所述的错误,如本问题所述

在此解决方案中提供了几种解决方案,以及我发现的其他各种解决方案,我所看到的唯一可行的解​​决方案涉及

$stmt->store_result()

缓冲整个结果集。

但是,我不想缓冲整个结果集-我想丢弃它而不使用(大量)内存来存储它!

所有我想做的事情,就是创建一个准备好的声明,使用bind_param()bind_result()fetch()得到一些结果,然后以某种方式接近的结果,这样我可以再次使用statment并运行其他查询到那时

我已经尝试了几乎所有从语句中使用实际结果对象并显式关闭该对象的方法,并且尝试了调用next_result()直到它返回null为止。这些解决方案均不能阻止该错误的出现。

因此,如何在a之后关闭结果集并执行其他准备好的语句fetch(),而又不浪费执行的语句而不必重新解析查询呢?

$q = $dbc->prepare("SELECT id, typename, storageclass, tablename FROM _dbtype WHERE typename=?");
$q->bind_param("s", $typeName);
$q->bind_result($id,$typeName,$storageClass,$tableName);
$q->execute();
$q->fetch();  // ie.  only once
...  <something that does not destroy $q> ...
$q2 = $dbc->prepare("SELECT id, name FROM _storagetype");
沃尔克

请参见mysqli_stmt :: free_result()
(和http://dev.mysql.com/doc/refman/5.7/en/mysql-stmt-free-result.html 以获得“如果该语句有游标, ,mysql_stmt_free_result()将其关闭。”)

<?php
mysqli_report(MYSQLI_REPORT_STRICT|MYSQLI_REPORT_ALL);
$mysqli = new mysqli('localhost', 'localonly', 'localonly', 'test');
if ($mysqli->connect_errno) {
    trigger_error( sprintf('mysqli connect error (%d) %s', $mysqli->connect_errno, $mysqli->connect_error), E_USER_ERROR);
    die;
}
$mysqli->query('CREATE TEMPORARY TABLE sofoo ( id int auto_increment, primary key(id))');
$mysqli->query('INSERT INTO sofoo VALUES (),(),(),(),(),()');


$stmtA = $mysqli->prepare('SELECT id FROM sofoo WHERE id>1');
$stmtB = $mysqli->prepare('SELECT id FROM sofoo WHERE id<10 ORDER BY id DESC');


$stmtA->execute();
$stmtA->bind_result($id);
$stmtA->fetch(); echo $id, PHP_EOL;
$stmtA->free_result(); // without this the script ends with "Fatal error: Uncaught mysqli_sql_exception: Commands out of sync;"

$stmtB->execute();
$stmtB->bind_result($id);
$stmtB->fetch(); echo $id, PHP_EOL;

如果有多个结果集(即,如果必须使用next_result()),则必须分别调用free_result()每个结果集。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何使mysqli准备好的语句并获取结果?

来自分类Dev

如何从面向对象的Mysqli预准备语句分配结果

来自分类Dev

如何使mysqli准备好的语句并获取结果?

来自分类Dev

Java准备的语句没有结果集?

来自分类Dev

如何从该语句中的SELECT语句中减去两个结果?

来自分类Dev

该语句不返回结果集SQL Server异常

来自分类Dev

PHP无法从mysqli语句中读取第二个结果集

来自分类Dev

PHP MySQLi准备的语句fetch()返回'1'而不是查询结果

来自分类Dev

使用准备好的语句 mysqli 获取查询结果

来自分类Dev

如何显示在if语句中找到的结果?

来自分类Dev

在Spring MVC 3中,如何使用带jdbcTemplate返回结果集的准备好的语句?

来自分类Dev

MySQL查询准备好的语句不返回任何结果

来自分类Dev

PHP中的预准备语句不绑定结果

来自分类Dev

在IF语句中包含SELECT语句结果

来自分类Dev

异步读取完成,但缓冲区不包含预期结果

来自分类Dev

Solr 建议最常见的结果而不返回整个短语

来自分类Dev

mysqli准备的语句缓冲的数据与未缓冲的数据性能?

来自分类Dev

PHP MySQLi准备的语句在绑定不同的参数时给出相同的结果

来自分类Dev

将mysqli预准备语句的多行结果绑定到多维数组中

来自分类Dev

如何仅在Case语句中显示汇总或标记的结果

来自分类Dev

如何使用惯用bash比较if语句中函数的结果

来自分类Dev

如何替换snowlight.execute语句中的循环结果?

来自分类Dev

如何在mysql中的select语句中过滤结果

来自分类Dev

如何根据 select 语句中的值限制结果?

来自分类Dev

PHP准备的语句:回显结果

来自分类Dev

检查准备好的语句PDO的结果?

来自分类Dev

显示准备好的语句的结果

来自分类Dev

我必须在PHP中使用结果之前或之后关闭准备好的语句

来自分类Dev

mysqli_stmt :: bind_param():变量数量与准备好的语句中的参数数量不匹配

Related 相关文章

  1. 1

    如何使mysqli准备好的语句并获取结果?

  2. 2

    如何从面向对象的Mysqli预准备语句分配结果

  3. 3

    如何使mysqli准备好的语句并获取结果?

  4. 4

    Java准备的语句没有结果集?

  5. 5

    如何从该语句中的SELECT语句中减去两个结果?

  6. 6

    该语句不返回结果集SQL Server异常

  7. 7

    PHP无法从mysqli语句中读取第二个结果集

  8. 8

    PHP MySQLi准备的语句fetch()返回'1'而不是查询结果

  9. 9

    使用准备好的语句 mysqli 获取查询结果

  10. 10

    如何显示在if语句中找到的结果?

  11. 11

    在Spring MVC 3中,如何使用带jdbcTemplate返回结果集的准备好的语句?

  12. 12

    MySQL查询准备好的语句不返回任何结果

  13. 13

    PHP中的预准备语句不绑定结果

  14. 14

    在IF语句中包含SELECT语句结果

  15. 15

    异步读取完成,但缓冲区不包含预期结果

  16. 16

    Solr 建议最常见的结果而不返回整个短语

  17. 17

    mysqli准备的语句缓冲的数据与未缓冲的数据性能?

  18. 18

    PHP MySQLi准备的语句在绑定不同的参数时给出相同的结果

  19. 19

    将mysqli预准备语句的多行结果绑定到多维数组中

  20. 20

    如何仅在Case语句中显示汇总或标记的结果

  21. 21

    如何使用惯用bash比较if语句中函数的结果

  22. 22

    如何替换snowlight.execute语句中的循环结果?

  23. 23

    如何在mysql中的select语句中过滤结果

  24. 24

    如何根据 select 语句中的值限制结果?

  25. 25

    PHP准备的语句:回显结果

  26. 26

    检查准备好的语句PDO的结果?

  27. 27

    显示准备好的语句的结果

  28. 28

    我必须在PHP中使用结果之前或之后关闭准备好的语句

  29. 29

    mysqli_stmt :: bind_param():变量数量与准备好的语句中的参数数量不匹配

热门标签

归档