这个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();
}
}
}
答案 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()
功能。