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++;
}
答案 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);