2009-07-22 29 views
3

假设我们有以下功能:如何找到在PHP脚本中未定义的变量是在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帮助设置错误处理程序。现在任何时候都会使用未初始化的变量 - 抛出异常。

回答

2

需要考虑的一个问题是,对于活动网站,您可能不希望用户看到错误和警告。一些网络主机提供了一个记录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'); 

关于这个伟大的事情是,你可以对其进行格式化,并甩了你想要的各种信息。

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 
+0

其他人可能想要更改错误报告出于其他原因并破坏某些东西。 – slipbull 2009-07-22 10:26:38

+0

如果程序被证实是正确的,那有什么可以打破的?在生产现场,设置错误报告是必须的。你可以关闭现场,但看到我的答案。 – Extrakun 2009-07-22 11:30:43

+0

其他人不应该碰到error_reporting级别。或者如果他真的*必须恢复它的原始价值。 – soulmerge 2009-07-22 11:44:34

2

如果您打开all warning and notices,评估该字符串应该会引发错误消息。

此外,它会评估为无效的SQL(它将是id=而不是id=0),所以你的perform_sql_query应该也报告。

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); 
1
  • 设置错误报告到E_ALL您的PHP应用程序使用:

    error_reporting(E_ALL);

或者通过在php.ini或.htaccess中为error_reporting变量设置合适的值。这允许您捕获所有错误,包括与未定义变量相关的错误。

  • 在开发环境中设置php error_log并在开发阶段仔细检查。

最后,对于上面提到的代码,在“perform_sql_query”函数中包含所有常识错误处理。您的perform_sql_query函数可能是通过mysql_query函数的封装,因此请检查由mysql_query(以及类似的)函数生成的错误。