2011-11-03 51 views
1

我有一個頁面,包含一些公平的數據庫查詢,每個附加or die()。我每隔1秒加載一次該頁面進行測試,並隨機加載頁面(可能需要兩次,可能需要五次或十次)die()已切換並出現錯誤。mysql_fetch_assoc()死亡,並給隨機頁面加載錯誤?

我崩潰了劇本,併成功地分離出特定問題的查詢,它是:

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

這種特殊的行內包含:

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']; 

} 

事情我注意:

  • mysql_error()已退回/打印。只有Error 3:是。
  • $off_id陣列正確轉儲每一次,所以總是在以前$result查詢中使用的$off_id,並且,如果沒有,應觸發die()$result查詢,而不是。

我不明白爲什麼會出現隨機頁面加載,而不是所有的時間,因爲這可能指向它不是一個語法問題,但加載問題?

但是,即使它是一個負載問題,我不明白爲什麼這個特定的查詢會失敗,並觸發die()而其他人都很好。

任何幫助理解這可能是什麼,以及我可以做什麼來解決這個問題的建議將不勝感激!

+0

[''或死()'必死](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}'"; 

下面的語句將不會返回FALSE,只是一個空結果集到$result

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

然後您嘗試從空的結果資源中獲取一行。這導致FALSE不是因爲錯誤,而是因爲沒有要讀取的行,並且您的短路評估調用die()

我們看不到您正在設置的位置$size,但您可能偶爾會通過達到大於該陣列的隨機值來讀取$off_id的數組邊界。

+0

「我們無法看到您設置$ size的位置,但您可能偶爾會通過達到大於該數組的隨機值來讀取$ off_id的數組範圍。」 - 這就是我要測試的。 – Avicinnian

+1

@Pixelatron不,它不會死()。它不會更新任何行,因爲沒有匹配,但查詢仍然會成功。這只是一個獲取調用,你會看到問題,因爲'mysql_fetch()'實際上在沒有行時返回'FALSE'。 –

+0

道具@邁克爾! '$ size'在這種情況下的值爲5,而數組鍵從1到4,並且5被用作'$ rand = rand(0,$ size)'的上界,因此偶然的錯誤! – Avicinnian