PHP PDO尝试catch块没有捕获

时间:2015-06-02 00:38:50

标签: php mysql pdo

这个PHP PDO尝试catch块没有捕获任何错误。这是为什么?我犯了错误吗?

try {    
    $this->connect();      
    $preparedQuery = $this->pdo->prepare($sql);
    $this->pdo->beginTransaction();
    $preparedQuery->execute();
    $lastInsertId = $this->pdo->lastInsertId();
    $this->pdo->commit();
    return $lastInsertId;

} catch (PDOException $e) {
    $this->pdo->rollBack();
    return "error";
}

我正常运行,我得到了这个错误

Fatal error: Call to a member function rollBack() on null 

PDO对象

private function connect() {
        $this->pdo = new PDO('mysql:host=' . $this->host . ';dbname=' . $this->database . '', $this->username, $this->password);
        $this->pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    }

这是我的完整连接课程。

class ConnectionModel {

    private $host;
    private $username;
    private $password;
    private $database;
    private $pdo;

    function __construct() {
        $this->host = 'localhost'; // database server address
        $this->username = 'myuser'; //database server username;
        $this->password = 'mypass'; //database server password;
        $this->database = 'oms1'; //database name
    }

    private function connect() {
        $this->pdo = new PDO('mysql:host=' . $this->host . ';dbname=' . $this->database . '', $this->username, $this->password);
        $this->pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    }


    public function runQuery($sql) {

        try {

            $this->connect();
            $preparedQuery = $this->pdo->prepare($sql);
            $this->pdo->beginTransaction();
            $preparedQuery->execute();
            $lastInsertId = $this->pdo->lastInsertId();
            $this->pdo->commit();
            return $lastInsertId;
        } catch (PDOException $e) {
            $this->pdo->rollBack();
            return $e->getMessage();
        }
    }

}

4 个答案:

答案 0 :(得分:3)

作为@Rizier123 stated in his comment,您需要在PDO中设置错误模式:

$this->pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

Read more about PDO Error Modes

现在为什么你没有得到你的错误。您在捕获中执行以下操作:

return 'error';

如果您没有收到实际的错误消息,那么这并不完全有用。

您想要的是获取实际的错误消息:

catch (PDOException $e) {
    $this->pdo->rollBack();
    echo $e->getMessage();
}

除此之外,如果没有看到$sql中存储的实际SQL查询,我们就无法告诉您更多信息,如果您分享,我们可以提供更多帮助。

答案 1 :(得分:2)

您的问题是,您没有发现任何连接异常。所以你必须这样做:

private function connect() {
    try {
        $this->pdo = new PDO('mysql:host=' . $this->host . ';dbname=' . $this->database . '', $this->username, $this->password);
        $this->pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    } catch(PDOException $e) {
        echo $e->getMessage();
    }
}

现在你在try和catch块中调用你的连接方法,所以在你的方法中,连接将抛出一个Exception,然后从你的try和catch块中捕获,它也有rollBack调用,但是期望连接成功。

如果你把你的连接调用放在try和catch块之外,你会得到一个未被捕获的异常:

$this->connect();
try {

} catch(PDOException $e) {
    $this->pdo->rollBack();
    return $e->getMessage();
}

答案 2 :(得分:0)

您需要将错误模式设置为基于异常:

$this->pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

答案 3 :(得分:0)

你的try / catch块已经捕获了每个错误 在这一行

$this->connect();

它失败错误,然后你的代码中断了,所以,

$this->pdo

仍为null然后,在catch区块中,您尝试访问null object,再次失败错误。
您可以查看if(isset($this->pdo)),然后拨打rollBack()功能。