【问题标题】:MYSQLi bind_result allocates too much memory [duplicate]MYSQLi bind_result分配了太多内存[重复]
【发布时间】:2011-02-19 19:01:26
【问题描述】:

我正在尝试从 MYSQL 获取多行,但是当将变量绑定到结果时,MYSQLi 会耗尽内存来分配,因为它会尝试一次获取所有行并缓冲完整的 LONGBLOB 大小,即使在不必要时也是如此。

还讨论了该错误here。一位发帖人似乎已经使用 mysqli_stmt_store_result 解决了这个问题,但没有详细说明具体是如何解决的(mysqli_stmt_store_result 是一种程序性(而不是 OO)方法。

致命错误:允许的内存大小为 134217728 字节用尽(试图 分配4294967296字节)

理想情况下,无论如何我都更喜欢使用fetch_object(),但我不知道如何使用我准备好的语句使其发挥作用。

  public function display() {
    $page_offset = ($this->get_page_number()- 1)
                      * $this->notes_per_page;
    if ($page_offset < 0) {
      $page_offset = 0;
    }
    $sql = "SELECT title, date_posted, text, url
              FROM notes ORDER BY date_posted DESC
              LIMIT ?, ?";
    $results = $this->query($sql, "ii", $page_offset, $this->notes_per_page);
    $results->bind_result(&$title, &$date_posted, &$text, &$url);
    //while ($row = $result->fetch_object()) { //store_result()) {
      //echo 'success';
      //var_dump($row);
    //}
    //$this->write($results);
  }

  // Here is the query function that $this->db->query() above refers to.
  public function query() {
    $args = func_get_args();
    $statement = $this->db->prepare($args[0]);
    $args = array_slice($args, 1);
    call_user_func_array(array($statement, 'bind_param'), &$args);
    $statement->execute();
    return $statement;
  }

感谢您的所有帮助!

【问题讨论】:

  • PDO会导致同样的错误吗?
  • 我没有尝试过 PDO,除非必要,否则希望避免重写,但感谢您的建议。

标签: php mysql mysqli prepared-statement


【解决方案1】:

我已经通过使用以下代码解决了这个问题。仍然存在一些问题,因为一些返回的数据似乎被破坏了,但我相信这值得自己提出问题。对我来说棘手的是需要在 mysqli 对象上调用 store_result(),而需要在语句上调用 fetch_object()。

  public function display() {
    $page_offset = ($this->get_page_number()- 1)
                      * $this->notes_per_page;
    if ($page_offset < 0) {
      $page_offset = 0;
    }
    $sql = "SELECT title, date_posted, text, url
              FROM notes ORDER BY date_posted DESC
              LIMIT ?, ?";
    $results = $this->query($sql, "ii", $page_offset, $this->notes_per_page);
    $results = $this->db->store_result();
    while ($row = $results->fetch_object()) {
      var_dump($row);
    }
    //$this->write($results);
  }

【讨论】:

【解决方案2】:

mysqli_stmt_store_resulthas an OO form as well.

【讨论】:

  • 是的,你是对的,我的错。但是我该如何使用它呢?我不清楚文档,该方法只是返回 true。
  • 在拨打$stmt-&gt;fetch()之前先拨打$stmt-&gt;store_result()
猜你喜欢
  • 2012-06-20
  • 1970-01-01
  • 2015-12-04
  • 2011-08-04
  • 1970-01-01
  • 2015-12-03
  • 1970-01-01
  • 1970-01-01
  • 2013-08-19
相关资源
最近更新 更多