尝试分配字节时出错

时间:2014-02-02 23:41:33

标签: php pdo

我将旧系统转换为使用PDO。 编辑:忘记添加错误: 致命错误:允许的内存大小为33554432字节耗尽

我在这里遇到的问题是这个功能:

原始代码:

function visitors_get_data() {
   // select
   $result = mysql_query("SELECT `ip`, `value` FROM `visitors`");
   while ($row = mysql_fetch_assoc($result)) {
       $data[] = $row;
   }
   if (isset($data)) return $data;
      else return false;
   }

这是我的编辑:

function visitors_get_data() {
   $dbc1 = new Db();
   // select
   $sth = $dbc1->PDOPrepare("SELECT `ip`, `value` FROM `visitors`");
   $sth->execute();
   $result = $sth->fetchAll(PDO::FETCH_ASSOC);

       while ($row = $result) {
          $data[] = $row;
       }
       if (isset($data)) return $data;
        else return false;
}

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

问题出在这些方面:

$result = $sth->fetchAll(PDO::FETCH_ASSOC);

while ($row = $result) {
    $data[] = $row;
}

您正在分配$result,然后在while循环中使用该值。发生的事情是,然后你一遍又一遍地为$row分配相同的值,直到你的内存不足为止。

要解决此问题,您只需移动作业:

while ($row = $sth->fetch(PDO::FETCH_ASSOC)) {
    $data[] = $row;
}

这将遍历数据库,将每一行分配到$data

您也可以使用fetchAll

按照您的代码目前一次性撤回所有内容
$result = $sth->fetchAll(PDO::FETCH_ASSOC);

在这种情况下,所有内容都已分配给$result,因此您根本不需要while循环。如果您查看man page,可以看到fetchAll返回数据的格式 - 可能与您期望的完全不同。