MYSQLi bind_result分配了过多的内存

问题描述 投票:2回答:3

我正在尝试从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;
  }

感谢您提供所有帮助!

php mysql mysqli prepared-statement
3个回答
5
投票

不是MEDIUM,而是LONG TEXT大小。检查您的表定义


2
投票

我已经通过使用以下代码解决了这个问题。由于某些返回的数据看起来很混乱,仍然存在一个问题,但是我认为这值得提出自己的问题。对我来说棘手的是,需要在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);
  }

0
投票

[mysqli_stmt_store_result has an OO form as well

© www.soinside.com 2019 - 2024. All rights reserved.