我有一个来自其他开发人员的旧代码设置,我在我的服务器上设置相同,我看到了一行
<?php @$Days = $_POST['Days']; ?>
此代码在我的本地设置上运行良好,但是一旦我将其上传到服务器上,这就无法正常工作并返回网络错误,此代码后的所有代码/ HTML也无效。
虽然,我调试了这个问题并删除了它。另外,我知道要处理错误,我们使用@符号,并且我已阅读this question
我的查询是上述案例中的错误是什么,为什么没有显示,如果我想检查错误,那我该怎么做。
对于错误报告,我会告诉您我已经使用了以下代码
<?php
ini_set("display_errors", "1");
error_reporting(E_ALL);
?>
所以请告诉我为什么我的代码无法通过此声明,因为我有大约100个这样的代码块。 php中是否有任何设置可以帮助我克服这个问题。
答案 0 :(得分:4)
@是PHP中的错误抑制运算符,请查看documentation。
在您的示例中,在变量名称之前使用它以避免E_NOTICE错误。如果在$ _POST数组中,那么&#39; Days&#39; key未设置它将抛出一个E_NOTICE消息,但在那里使用@来避免E_NOTICE。
代码无法在服务器上运行的原因可能是由于scream.enabled directive in your php.ini配置被禁用。
禁用scream
可以解决问题。
更改php.ini中的指令,如下所示:
scream.enabled = 0
如果要在运行时禁用它,则可以按照手册中的说明使用ini_set:
ini_set('scream.enabled', false);
修改强>
评论中有人指出,我的答案还不够彻底。我将尝试修改我在这里编辑的错误:)。
scream(和禁用@)可以/将会破坏代码的原因是由于变量没有值。如果代码的其余部分尝试使用该变量,则会抛出错误。
此外,如果您将错误处理程序附加到E_NOTICE,则E_NOTICE可能会抛出错误。 来自another question的引用:
以上代码会在E_NOTICE或者任何时候抛出ErrorException 引发E_WARNING,有效地终止脚本输出(如果是 异常没有被捕获)。抛出PHP错误的异常是最好的 结合并行异常处理策略 (set_exception_handler)在生产中正常终止 的环境中。