假设我们在PHP中有以下功能:
public function testSomething()
{
$name = perform_sql_query("SELECT name FROM table WHERE id = $entity_id;");
assert($name == "some_name");
}
查询在语法上是正确的,但由于$ entity_id未定义 - 查询将始终搜索'id = 0',这在语义上是不正确的。
我希望这些函数在尝试使用未定义的变量时自动失败。 PHP中有这样的机制吗?或者也许有一些工具,可用于分析PHP源代码以找到这样的情况?
UPDATE 这些未定义的变量可以出现在项目的任何地方,因此正确的决定是检查每个函数中的函数参数。
UPDATE2 设置错误处理程序有帮助。现在,无论何时使用未初始化的变量,都会抛出异常。
答案 0 :(得分:6)
PHP在脚本错误中有多个严重性级别。您可以使用函数error_reporting()
或php.ini
-directive with the same name设置您希望它考虑的错误。这就是你如何设置PHP来报告任何可能导致错误的(这可能会导致相当多的消息,如果你是第一次设置它,但修复这些错误会给你一个更稳定的应用程序):
# In your php script:
error_reporting(E_ALL | E_STRICT);
# Or in your php.ini:
error_reporting = E_ALL | E_STRICT
答案 1 :(得分:2)
如果你打开all warning and notices,评估该字符串会给你一个错误信息。
此外,它将评估为无效的SQL(它将id=
而不是id=0
),因此您的perform_sql_query也应该报告。
答案 2 :(得分:2)
我通常检查我的函数中的值是否为null。你可以使用isset(),如果它是一个空字符串,使用如下所示:
public function testSomething()
{
if(!empty($entity_id)){
$name = perform_sql_query("SELECT name FROM table WHERE id = $entity_id;");
assert($name == "some_name");
return true;
}
return false;
}
我还会使用以下行设置错误报告:
error_reporting(E_ALL | E_STRICT);
答案 3 :(得分:2)
需要考虑的一个问题是,对于实际网站,您可能不希望用户看到错误和警告。一些web-host提供了一个记录php错误的error.log。这是实时网站的自定义错误处理程序:
function log_error($no,$msg,$file,$line)
{
$errorMessage = "Error no $no: $msg in $file at line number $line";
file_put_contents("errors_paypal.txt",$errorMessage."\n\n",FILE_APPEND);
}
set_error_handler('log_error');
关于这一点的好处是你可以格式化它并转储你想要的各种信息。
答案 4 :(得分:1)
使用以下命令在您的php应用中将错误报告设置为E_ALL:
error_reporting(E_ALL);
或者通过在php.ini或.htaccess中为error_reporting变量设置适当的值。这允许您捕获所有错误,包括与未定义变量相关的错误。
最后,对于上面提到的代码,请在“perform_sql_query”函数中包含所有常识错误处理。你的perform_sql_query函数可能是mysql_query函数的包装器,所以检查mysql_query(和类似的)函数生成的错误。
答案 5 :(得分:-1)
在访问变量之前使用isset()函数。