- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我发现在捕获它时获取导致 PDOException
的 sql 语句文本很有用。据我所知,异常没有该信息。例如(在阅读了 PDOException
类的文档之后),我使用了 Exception::__toString()
并得到了类似的东西:
SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '14' for key 'PRIMARY'
exception 'PDOException' with message 'SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '14' for key 'PRIMARY'' in xx.php:64
Stack trace:
#0 xx.php(64): PDOStatement->execute(Array)
#1 xx.php(108): insertKeplerian(Object(MyConn), '14', Object(stdClass))
#2 Command line code(1): include('/srv/www/htdocs...')
#3 {main}
问题是我有从不同函数执行的语句,我想在单个 catch
block 中捕获所有异常。如果语句确实无法从异常中恢复,那么我可以想到两种可能的解决方案:
catch
部分恢复。PDOException
我想有更好的方法来做到这一点。
最佳答案
我根据答案 https://stackoverflow.com/a/7716896/4044001 找到了执行此操作的方法. 代码如下,其中包括对参数标记支持问号 (?) 而不是命名占位符 (:name) 的改进:
<?php
///\brief Class that extends PDOStatement to add exception handling
class MyPDOStatement extends PDOStatement
{
protected $_debugValues = null;
protected $_ValuePos = 0;
protected function __construct()
{
// need this empty construct()!
}
///\brief overrides execute saving array of values and catching exception with error logging
public function execute($values = array())
{
$this->_debugValues = $values;
$this->_ValuePos = 0;
try {
$t = parent::execute($values);
}
catch (PDOException $e) {
// Do some logging here
print $this->_debugQuery() . PHP_EOL;
throw $e;
}
return $t;
}
///\brief Retrieves query text with values for placeholders
public function _debugQuery($replaced = true)
{
$q = $this->queryString;
if (!$replaced) {
return $q;
}
return preg_replace_callback('/(:([0-9a-z_]+)|(\?))/i', array(
$this,
'_debugReplace'
), $q);
}
///\brief Replaces a placeholder with the corresponding value
//$m is the name of a placeholder
protected function _debugReplace($m)
{
if ($m[1] == '?') {
$v = $this->_debugValues[$this->_ValuePos++];
}
else {
$v = $this->_debugValues[$m[1]];
}
if ($v === null) {
return "NULL";
}
if (!is_numeric($v)) {
$v = str_replace("'", "''", $v);
}
return "'" . $v . "'";
}
}
///\brief Class that encapsulates DB connection parameters and configuration
class MyConn extends PDO
{
function __construct()
{
$servername = "localhost";
$username = "root";
$password = "xxx";
$dbname = "new_att";
parent::__construct("mysql:host=$servername;dbname=$dbname", $username, $password);
//Set connection to raise exception when error
$this->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
//Set connection to use the derived class MyPDOStatement instead of PDOStatement for statements
$this->setAttribute(PDO::ATTR_STATEMENT_CLASS, array(
'MyPDOStatement',
array()
));
}
}
?>
关于php - 有没有办法从 PDOException 中获取 sql 语句?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47187147/
我正在使用 symfony,当我在控制台中输入以下内容时: php app/console doctrine:schema:create 我有以下错误 [Doctrine\DBAL\Exception
我在 PHP 中收到以下错误: Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[HY000] [2003]
这是我的代码: $db = new PDO('mysql:host=192.168.1.1;dbname=mydb'); 是否可以更改异常消息“无法连接到‘192.168.1.1’上的 MySQL 服
我在 PHP 中收到以下错误: Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[HY000] [2003]
我安装了 Laravel 并从 git 服务器克隆了一个存储库以在临时服务器上使用。安装所有必需的工具后,我想迁移数据库。我现在得到的错误是: [2016-05-04 16:54:51] local.
如果我无法连接到数据库(例如 xamp 关闭或数据库连接关闭等),我会 try catch 错误。我尝试使用 PDO::errorCode() 但没有产生结果。 在我的php中,我有一个connect
当我运行以下代码时,出现此错误: Fatal error: Uncaught PDOException: SQLSTATE[HY093]: Invalid parameter number: numb
我正在使用 Articles 类从我的数据库中提取关于 ..articles 的数据。我可以使用实例来插入数据、修改它,但我似乎无法从不同的页面集使用它。文件夹结构如下所示/cms/conf.php(
这个问题在这里已经有了答案: PHP Fatal error: Uncaught PDOException: could not find driver (4 个答案) PDOException “
这段代码工作正常,但我想处理 exception如果有任何问题,所以我故意在 query 中犯了一个语法错误但没有任何反应。下面是代码 try { $sql = "INSERT INTO jo
我不知道如何在下面的代码中捕获PDOException,请告诉我在下面的代码中哪里抛出异常? 我有(目录): - folder -1) b.php -2) c.php - au
我有一段简单的代码,在 PHP 中使用 PDO: $conn = new PDO('mysql:host=localhost;dbname=someDatabase', $username, $pas
我目前正在通过终端在 Laravel 中进行迁移,并且在尝试使用 php artisan migrate 时出现这两个错误;我将在下面打印错误: Exception trace: 1 PDOE
try { self::$dbinstance = new PDO( "mysql:host=$c[host];dbname=$c[dbname]", $c['user'],
我目前正在完善我的网站,一切正常但我一直收到错误。它不会破坏任何东西,但看起来很烦人。我一直在尝试很多东西,但我需要一些新的眼光来看待这个问题:/ 错误 PHP Fatal error: Cannot
获取POST传递过来的信息,将字符串中的所有空格去掉,然后启动一个新的pdo实例,连接mysql,将POST传递过来的信息插入到表中。 $title = trim($_POST["title"]);
我可以将迁移迁移到数据库,但是当我访问公用文件夹时,我收到一个 PDOException : SQLSTATE[28000] [1045] 用户“root”@“localhost”访问被拒绝(使用密码
我在 CentOS 7 上使用 PHP 5.6 运行 MariaDB。这是我的连接字符串: try { $connStr = 'mysql:host=server;dbname=mysql';
try { self::$dbinstance = new PDO( "mysql:host=$c[host];dbname=$c[dbname]", $c['user'],
所以我正在尝试为这样的 Laravel 应用程序编写单元测试: protected function setUp() { parent::setUp(); $this->disable
我是一名优秀的程序员,十分优秀!