我无法弄清楚以下两种语法之间的区别

时间:2011-08-25 08:21:09

标签: php

while($rowForStateList  =   @mysql_fetch_array($resForStateList))

{
    $sid[$i]    =   $rowForStateList['state_auto_id'];

    $sname[$i]  =   $rowForStateList['state_name'];

    $spid[$i]   =   $rowForStateList['country_auto_id'];

    $i++;
}

while($rowForStateList  =   mysql_fetch_array($resForStateList))

{
    $sid[$i]    =   $rowForStateList['state_auto_id'];

    $sname[$i]  =   $rowForStateList['state_name'];

    $spid[$i]   =   $rowForStateList['country_auto_id'];

    $i++;
}

12 个答案:

答案 0 :(得分:2)

不同之处在于,第一个代码示例中的@mysql_fetch_array获取数组抑制任何错误,而mysql_fetch_array执行相同但不抑制错误 。实际上,第二种方式更为正确。

使用@的罪恶之处在于它使调试复杂化。有了这种抑制,如果出现错误,你最终会得到空数组,因此它看起来就像用于获取$resForStateList的查询返回空结果一样。但是,您实际上可能已经破坏了查询,拒绝了数据库连接以及其他任何问使用@ ,您永远不会知道出现问题

所以,不要使用@。相反,请使用错误handling functions。最好的方法是检查是否有什么东西可能导致错误,例如如果出现任何错误,mysql_query将返回false,因此您可能需要将其检查为

$result = nysql_query("qwerty");
if (!$result){
    echo mysql_error();
}

答案 1 :(得分:1)

不同之处在于前者将掩盖mysql_fetch_array()中发生的任何错误,使调试更加困难。

答案 2 :(得分:1)

第一个版本中的@基本上意味着“如果此功能触发错误,只需隐藏它,不要记录或显示它”。

不要使用@ error suppression运算符!它不仅会导致调试噩梦,还会损害应用程序性能。使用error_reporting,log_errors和display_errors来设置正确的错误消息行为。

答案 3 :(得分:1)

在这种情况下,请勿使用@运算符。 mysql_fetch_array只会在资源无效时抛出错误。在获得此资源之后,您应该先检查一下。

答案 4 :(得分:0)

不同之处在于错误报告。 如果在mysql_fetch_array之前设置@,则将忽略任何错误。 see php errorcontrol

答案 5 :(得分:0)

唯一的区别是第一个代码中@前面的mysql_fetch_array会阻止任何错误显示在屏幕上。

答案 6 :(得分:0)

答案 7 :(得分:0)

他们是完全相同的。由于抑制运算符mysql_fetch_array(),第一个@不会产生错误消息。

答案 8 :(得分:0)

第一个会默默地忽略任何错误。第二个将显示抛出mysql_fetch_array的任何错误或异常(例如,连接问题)。神奇来自@标志。

答案 9 :(得分:0)

@mysql_fetch_array($resForStateList)) 在出现错误时不会显示任何消息。 就是这样。

答案 10 :(得分:0)

@是一个运算符,它可以抑制错误。添加@时,您的语句不会抛出错误。您可以在此处阅读更多内容:http://thesmithfam.org/blog/2006/05/07/php-the-operator/

答案 11 :(得分:0)

当您在表达式中添加“@”时,将忽略可能生成的任何错误消息(即,不会生成错误输出)。无论如何,如果启用了track_errors功能,表达式生成的任何错误消息都将在变量$ php_errormsg中保存(并覆盖每个错误)。

查看PHP Error Control了解详情。

实际上,我更喜欢使用表达式widthout'@'并使用一个函数处理所有异常,该函数使用error_log()记录文件中的所有消息。类似的东西:

function error_handler($errno, $errstr, $errfile=null, $errline=null, $errcontext=null) {
    error_log($errstr, 3, 'debug.log');
}

set_error_handler('error_handler', ERROR_REPORTING);