mysql_fetch_assoc()在随机页面加载时死亡并给出错误


mysql_fetch_assoc() dies and gives error on random page loads?

我有一个页面,其中包含一些数据库查询,每个查询都附加了or die()。我每1秒加载一次这个页面进行测试,在随机页面加载时(可能需要两个、五个或十个(,die()被切换,并给出错误。

我分解了脚本,并设法隔离了特定的有问题的查询,即:

$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,如果没有,则应该为$result查询触发die()

我真的不明白为什么这种情况会发生在随机页面加载上,而不是一直发生,因为这可能表明这不是语法问题,而是加载问题?

然而,即使是负载问题,我也不明白为什么那个特定的查询会失败并触发die(),而其他查询都很好。

如果能帮助我理解为什么会发生这种情况,以及我能做些什么来解决这种问题的建议,我们将不胜感激!

我猜您在这里的查询没有返回结果:

$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的数组边界。

相关文章: