2013-04-09 6 views
1

해야하는이 기능 :직접 매개 변수 VS. 변수에 저장된 값

function get_article_info(){ 
     $id = $_GET['id']; 
     $data = array(); 
     $q = "SELECT * FROM articles WHERE article_id = $id"; 
     $qry = mysql_query($q); 
     while($row = mysql_fetch_assoc($qry)){ 
      $data[] = $row; 
     } 
     return $data; 
    } 

이 같은 일이 하나

function get_article_info2(){ 
     $id = $_GET['id']; 
     $data = array(); 
     $q = mysql_fetch_assoc(mysql_query("SELECT * FROM articles WHERE article_id = $id")); 

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

내가이 오류를 얻을 get_article_info2 사용하려고하면 :

Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 35 bytes) 

수를 왜 그것이 작동하지 않는지 말해줘? 들으 당신은 전에 한 번 $의 Q 값을 할당하기 때문에)

+0

더 이상 사용되지 않으며 더 이상 지원되지 않으므로 mysql_ * 함수가 사용되지 않아야합니다. 대신 ** PDO ** 또는 ** mysqli **를 참조하십시오. – Pankucins

답변

2
$q = mysql_fetch_assoc(mysql_query("SELECT * FROM articles WHERE article_id = $id")); 

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

,이 루프 끝이 없다, 그것은 결코 변하지 않습니다. 따라서 동일한 행이 $ data에 반복해서 추가되고 마침내 스크립트의 메모리가 부족합니다.

첫 번째 코드와 마찬가지로 모든 레코드에 대해 패치 기능을 별도로 호출해야합니다. 모든

2

첫째, 당신은 항상 SQL 매개 변수를 탈출 또는 살균해야합니다

$sql = sprintf('SELECT * FROM articles WHERE article_id = %d', (int)$_GET['id']); 
$res = mysql_query($sql); 

둘째, 당신은 루프 내부에 mysql_fetch_assoc()를 수행해야합니다; 그렇지 않으면 무한 루프가 발생합니다 말했다

while (($row = mysql_fetch_assoc($req)) !== false) { $data[] = $row; } 

, 당신은 이전 mysql_* 기능의 사용을 중지해야을; 대신 PDO 또는 mysqli를 사용하고 준비된 명령문의 힘을 활용하십시오.

+0

잭 아니요 SQL INJECTION 경고가 없습니까? –

+0

@ Null은 매개 변수가 이스케이프 처리되거나 삭제되어야한다고 언급하지 않았습니까? 내가 뭐 놓친 거 없니? –

+0

네가 잘 해냈다.하지만 나는 왜 그걸 잘 풀어 매개 변수의 .. ..-) yes와 +1 –

관련 문제