2011-11-03 3 views
1

상당수의 데이터베이스 쿼리가 포함 된 페이지가 있으며 각 페이지에는 or die()이 추가됩니다. 테스트를 위해 1 초마다이 페이지를로드하고 무작위 페이지로드시 (두 개가 걸리거나 5 또는 10이 걸릴 수 있음) die()이 전환되고 오류가 발생했습니다.mysql_fetch_assoc()이 죽어 랜덤 페이지로드시 오류가 발생합니까?

나는 스크립트를 고장하고있는 특정 잘못된 쿼리, 분리 관리 :

if($size > 0) { 
    $off_id = array(); 

    while($row = mysql_fetch_assoc($result)) { 
     $off_id[] = $row['off_id']; 
    } 

    echo '<pre>'; 
    var_dump($off_id); 
    echo '</pre>'; 

    $rand = rand(0,$size); 
    $off_id = $off_id[$rand]; 

    $query = "UPDATE rotation_data SET hit_counter = hit_counter + 1 WHERE off_id = '{$off_id}'"; 
    $result = mysql_query($query) or die("Error 1:" . mysql_error()); 

    $query = "SELECT * FROM offer_data WHERE off_id = '{$off_id}'"; 
    $result = mysql_query($query) or die("Error 2:" . mysql_error()); 
    $fetch = mysql_fetch_assoc($result) or die("Error 3:" . mysql_error()); 
    $offer_url = $fetch['url']; $geo_target = $fetch['geo_target']; $blank = $fetch['blank']; 

} 

것 I :

$fetch = mysql_fetch_assoc($result) or die("Error 3:" . mysql_error()); 

이 특정 라인에 포함됩니다 눈치 :

  • 아니요 mysql_error()이 반환/인쇄됩니다. Error 3: 만 있습니다.
  • $off_id 배열은 제대로 각각의 모든 시간을 덤프, 그래서 거기에 항상 이전 $result 쿼리에서 사용하는 $off_id, 그리고이 아니었다면, 그 대신 $result 쿼리에 대한 die()을 트리거한다.

이것은 임의의 페이지로드시 발생하는 이유와 모든 시간이 아닌 이유를 이해하지 못합니다.이 문제는 구문 문제가 아니라로드 문제 일 수 있습니다.

그러나로드 문제 일지라도 그 특정 쿼리가 실패하고 다른 쿼리가 실행되는 동안 die()이 트리거되는 이유를 알 수 없습니다.

이 문제의 원인을 이해하는 데 도움이되는 정보와 해결 방법에 대한 의견을 보내 주시면 대단히 감사하겠습니다.

+0

['또는 die()'해야합니다] (http://www.phpfreaks.com/blog/or-die-must-die). 또한 문 오류 때문에 mysql_error ($ result)를 사용하십시오. – Phil

+0

mysql을 더 이상 사용하지 말고 mysqli 또는 PDO를 사용하십시오. http://www.php.net/manual/en/intro.mysqli.php –

+0

제안을위한 소품 @Phil. – Avicinnian

답변

1

나는 당신의 쿼리가 여기에 어떤 결과를 반환하지 않습니다 추측하고있다 :

$query = "SELECT * FROM offer_data WHERE off_id = '{$off_id}'"; 

다음 명령문은, $result로 설정 단지 빈 결과를 FALSE를 반환하지 않습니다.

// No results here this time... 
$result = mysql_query($query) or die("Error 2:" . mysql_error()); 

그리고 빈 결과 리소스에서 행을 가져 오려고 시도합니다. 오류로 인해 FALSE이 발생하지만 가져올 행이 없으므로 단락 회로 평가는 die()입니다.

당신이 $size을 설정하는 곳에 우리는 볼 수 없습니다, 그러나 당신이 때때로 그 배열보다 큰 임의의 값에 도달하여 $off_id의 배열 범위를지나 읽고있는 가능성이 있습니다.

+0

"$ 크기를 어디에 설정했는지는 알 수 없지만 때때로 그 배열보다 큰 임의의 값에 도달하여 $ off_id의 배열 범위를 읽는 중일 수 있습니다." - 그게 내가 시험하려고하는거야. – Avicinnian

+1

@Pixelatron 아니, 죽지 않을거야.일치하지 않을 것이기 때문에 행을 갱신하지는 않지만 조회는 계속 성공했을 것입니다. mysql_fetch()는 실제로 행이 없을 때 실제로'FALSE'를 반환하기 때문에 문제를 볼 수있는 fetch 호출 일뿐입니다. –

+0

소품 @ 마이클! '$ size'는이 경우 5의 값을 가지며, 배열 키는 1에서 4까지이고, 5는'$ rand = rand (0, $ size)'의 상한으로 사용되기 때문에 가끔 에러가 발생합니다 ! – Avicinnian