忽略PHP Web服务中的致命错误和数据库异常

时间:2010-10-19 00:47:34

标签: php web-services error-handling

我有一个用PHP编写的Web服务,它返回JSON结果。它运作良好,并已经过全面测试。

我需要在服务调用中添加日志记录(谁调用和何时调用)。我使用SQLite数据库(用于非常少量的数据)和PDO实现了这一点。日志记录的一个条件是它不应该损害Web服务本身。我正在记录他的呼叫这一事实对用户来说无关紧要,记录过程中的任何错误也不应阻止任何服务呼叫。

我实现了一个Log类和一个需要SQL字符串的“execute”函数:

    function __construct() {
        $this->dbConn = 'sqlite:' . realpath("myLog.sqlite");
        try {
            $this->db = new PDO($this->dbConn);
        }
        catch (PDOException $e) {
            //I don't care
        }
    }

    private function execute($sql) {
        try {
            $query = $this->db->prepare($sql);
            $query->execute();  
        }
        catch(Exception $e) {
            //I don't care
        }
    }

然后我在每个服务函数的末尾添加了一个类似于此的调用:

$sql = "INSERT INTO $table(id, Time) VALUES('$id', datetime('now','localtime'))";
$this->execute($sql);

$jsonResult = doSomething($id);
return $jsonReuslt;

问题是:我不时在客户端上得到一个包含致命错误字符串(指向此行$query->execute())的字符串,表示它不是对象。

到目前为止,在所有情况下,我都将其追溯到错误的SQL查询。但我需要的是一种确保原始JSON返回的方法,即使日志功能中存在错误。

如果我调用$this->execute($sql)时无论发生什么,我怎样才能确保 - $ jsonResult将返回实际的JSON结果?

TIA,

1 个答案:

答案 0 :(得分:1)

在执行查询之前测试准备查询的结果 - 如果语句无法成功准备,server will return false(或抛出异常)。

$query = $this->db->prepare($sql);
if ($query)
    $query->execute();