我的脚本的一行使用所有可用内存 - 为什么?

时间:2013-07-21 21:48:01

标签: php mysqli

我有一个我正在制作的PHP项目,但是我遇到了一个死胡同,因为一行导致脚本错误地说内存限制已经过了。

有问题的行是方法的一部分,如下所示:

public function query_all($query)
{

    if (function_exists('mysqli_fetch_all')) # Compatibility layer with PHP < 5.3
        $res = mysqli_fetch_all($this->query($query));
    else
    for ($res = array(); $tmp = mysqli_fetch_array($this->query($query));) $res[] = $tmp;

    return $res;
}

此函数是名为Db的类的一部分,带错误的行是for循环的行:

for ($res = array(); $tmp = mysqli_fetch_array($this->query($query));) $res[] = $tmp;

此函数仅在我的代码中调用一次,位于else语句的顶部:

do
    {
        $id = rand(1000000, 9999999);

        if (!Util::in_array_r($id, $db->query_all('SELECT * FROM tickets')))
        {
            break;
        }
    }
    while (true);

    $emailsubject = $db->escape($emailsubject);
    $emailbody = $db->escape($emailbody);
    $from = $db->escape($from);

    $db->query("INSERT INTO tickets VALUES ($id, '$emailsubject', '$emailbody', '$from')");


    foreach ($config['staff_emails'] as $email)
    {
        mail($email, "[$id] [NEW TICKET] $emailsubject", $emailbody, "Reply-to: $to");
    }

我不明白它为什么这样做 - 它从来没有用过,我唯一改变的就是让所有的SQL查询都能正常工作:/

有谁知道为什么会这样? for循环可以无休止地运行吗?数据库只包含一行,所以我看不出它是怎么回事,

谢谢, 利安

1 个答案:

答案 0 :(得分:1)

你有一个无限循环。你可能想做

while ($row = mysqli_fetch_array($this->query($query)) {
    $res[] = $row;

而不是

for ($res = array(); $tmp = mysqli_fetch_array($this->query($query));) $res[] = $tmp;