2013-07-21 64 views
0

我有一個PHP項目我做的,但我已經打了一個死衚衕作爲一行導致腳本錯誤說出來的內存限制已exausted。使用所有可用內存的一行腳本 - 爲什麼?

所討論的行是一個方法的一部分,如下所示:

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 ($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循環可以無休止地運行嗎?該數據庫只包含一個排了,所以我看不出它如何,

感謝, 利亞姆

+0

不要爲()循環使用的獲取。 'while($ row = mysql_fetch_array(...){$ res [] = $ row;}'是首選的方法。通過將您的循環計數器初始化爲數組而不是int,條件爲DB操作。 –

+0

的東西,我想知道的結果,哪裏的$ row變量從何而來? –

+0

它只是自動創建的PHP你第一次循環迭代。 –

回答

1

你有一個無限循環。你可能想要做的

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

代替

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