2011-11-03 91 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