2013-07-21 3 views
0

나는 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 오류가있는 라인을라는 클래스의 일부가 루프와 라인

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"); 
    } 

I :

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

이 기능은 단지 다른 정책의 맨 위에, 내 코드에 한 번이라고합니다 왜 이런 일을했는지 ​​이해하지 못해 - 결코 익숙하지 않았고 내가 바꾼 유일한 일은 모든 SQL 쿼리를 작동시키는 것뿐이었습니다 :/

왜 이런 일이 일어나는 지 아십니까? for 루프가 끝없이 실행될 수 있습니까?

감사합니다, 리암

+0

의 싶지. 'while ($ row = mysql_fetch_array (...) {$ res [] = $ row;}'가 선호되는 방법입니다. 루프 카운터를 int 대신 배열로 초기화하여 정의되지 않은 영역입니다. 조건은 db 연산의 결과입니다. –

+0

$ row 변수는 어디에서 왔는지 알고 싶습니다. –

+0

루프를 처음 반복 할 때 PHP에 의해 자동으로 만들어졌습니다. –

답변

1

당신은 무한 루프를 가지고, 데이터베이스는하지만 하나의 행을 포함, 그래서 어떻게 수 I는 표시되지 않습니다. 당신은 아마 페치() 루프를 사용하지 마십시오

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

대신

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