php实现PDO中捕获SQL语句错误的方法


Posted in PHP onFebruary 16, 2017

本文实例讲述了php实现PDO中捕获SQL语句错误的方法。分享给大家供大家参考,具体如下:

使用默认模式-----PDO::ERRMODE_SILENT

在默认模式中设置PDOStatement对象的errorCode属性,但不进行其他任何操作。

例如:

通过prepare()和execute()方法向数据库中添加数据,设置PDOStatement对象的erroCode属性,手动检测代码中的错误,操作步骤如下。

$dbms='mysql';//数据库类型
$dbName='admin';//使用的数据库
$user='root';//数据库连接用户名
$pwd='password';//数据库连接密码
$host='localhost';//数据库主机名
$dsn="$dbms:host=$host;port=3306;dbname=$dbName";
$pdo=new PDO($dsn,$user,$pwd);//初始化一个PDO对象,就是创建了数据库连接对象$pdo
$query="insert into user (username,password) values('admin')";//需要执行的sql语句
$res=$pdo->prepare($query);
$res->execute();
$code=$res->errorCode();
echo $code.'<br>';
if($code==00000){//如果没有任何错误, errorCode() 返回的是: 00000 ,否则就会返回一些错误代码
echo "数据添加成功";
}else{
echo "数据库错误:<br>";
echo 'SQL Query:'.$query;
echo '<pre>';
var_dump($res->errorInfo());
echo '<pre>';
}

运行结果如下

21S01

数据库错误:

SQL Query:insert into user (username,password) values('admin')
array(3) {
 [0]=>
 string(5) "21S01"
 [1]=>
 int(1136)
 [2]=>
 string(47) "Column count doesn't match value count at row 1"
}

使用警告模式-----PDO::ERRMODE_WARNING

警告模式会产生一个PHP警告,并设置errorCode属性。如果设置的是警告模式,那么除非明确的检查错误代码,否则程序将继续按照其方式运行。

例如:

设置警告模式,通过prepare()和execute()方法读取数据库中数据,并且通过while语句和fetch()方法完成数据的循环输出,体会在设置成警告模式后执行错误的SQL的语句。

$dbms='mysql';//数据库类型
$dbName='admin';//使用的数据库
$user='root';//数据库连接用户名
$pwd='password';//数据库连接密码
$host='localhost';//数据库主机名
$dsn="$dbms:host=$host;port=3306;dbname=$dbName";
try {
$pdo = new PDO($dsn, $user, $pwd);//初始化一个PDO对象,就是创建了数据库连接对象$pdo
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);//设置为警告模式
$query = "select * from userrr";//需要执行的sql语句
$res = $pdo->prepare($query);//准备查询语句
$res->execute();
while ($result = $res->fetch(PDO::FETCH_ASSOC)) {//while循环输出查询结果集并设置结果集以关联数组的形式返回。
echo $result['id'] . " " . $result['username'] . " " . $result['password'];
  }
}catch(PDOException $e){
die("ERROR!:".$e->getMessage().'<br>');
}
echo "继续继续继续继续继续继续继续";

运行结果如下:

Warning: PDOStatement::execute() [pdostatement.execute]: SQLSTATE[42S02]: Base table or view not found: 1146 Table 'admin.userrr' doesn't exist in D:\wampserver\www\test\test\index1.php on line 14

 
继续继续继续继续继续继续继续

可以看出在设置警告模式后,如果SQL语句出现错误将给出一个提示信息,但是程序仍能够继续执行下去。

使用异常模式----PDO::ERRMODE_EXCEPTION

异常模式将会创建一个PDOException,并设置errorCode属性,它可以将执行代码封装到一个try{}catch{}语句块中。未捕获的异常将会导致脚本中断,并显示堆栈跟踪让用户了解是哪里出现了问题。

例如:

删除一个错误的数据表中的信息

$dbms='mysql';//数据库类型
$dbName='admin';//使用的数据库
$user='root';//数据库连接用户名
$pwd='password';//数据库连接密码
$host='localhost';//数据库主机名
$dsn="$dbms:host=$host;port=3306;dbname=$dbName";
try {
$pdo = new PDO($dsn, $user, $pwd);//初始化一个PDO对象,就是创建了数据库连接对象$pdo
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);//设置异常模式
$query = "delete from userrr where id=1";//需要执行的sql语句
$res = $pdo->prepare($query);//准备删除语句
$res->execute();
}catch(PDOException $e){
echo 'PDO Exception Caught: ';
echo "Error with the database:<br>";
echo 'SQL Query:'.$query;
echo '<pre>';
echo "ERROR:".$e->getMessage().'<br>';
echo "Code:".$e->getCode().'<br>';
echo "File:".$e->getFile().'<br>';
echo "Line:".$e->getLine().'<br>';
echo "Trace:".$e->getTraceAsString().'<br>';
echo '</pre>';
}

运行结果:

PDO Exception Caught: Error with the database:
SQL Query:delete from userrr where id=1
ERROR:SQLSTATE[42S02]: Base table or view not found: 1146 Table 'admin.userrr' doesn't exist
Code:42S02
File:D:\wampserver\www\test\test\index1.php
Line:14
Trace:#0 D:\wampserver\www\test\test\index1.php(14): PDOStatement->execute()
#1 {main}

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
Classes and Objects in PHP5-面向对象编程 [1]
Oct 09 PHP
ecshop 订单确认中显示省市地址信息的方法
Mar 15 PHP
PHP四大安全策略
Mar 12 PHP
ThinkPHP单字母函数(快捷方法)使用总结
Jul 23 PHP
ThinkPHP模板中数组循环实例
Oct 30 PHP
PHP文件缓存类示例分享
Jan 30 PHP
PHP实现中文圆形印章特效
Jun 19 PHP
php检测图片主要颜色的方法
Jul 01 PHP
PHP开发Apache服务器配置
Jul 15 PHP
Symfony2框架学习笔记之HTTP Cache用法详解
Mar 18 PHP
抛弃 PHP 代价太高
Apr 26 PHP
PHP+Mysql分布式事务与解决方案深入理解
Feb 27 PHP
php中的单引号、双引号和转义字符详解
Feb 16 #PHP
php输出图像的方法实例分析
Feb 16 #PHP
替换php字符串中的单引号为双引号的方法
Feb 16 #PHP
php中照片旋转 (orientation) 问题的正确处理
Feb 16 #PHP
php使用PDO事务配合表格读取大量数据插入操作实现方法
Feb 16 #PHP
php的PDO事务处理机制实例分析
Feb 16 #PHP
php使用include 和require引入文件的区别
Feb 16 #PHP
You might like
php执行sql语句的写法
2009/03/10 PHP
THINKPHP内容分页代码分享
2015/01/14 PHP
php简单实现屏蔽指定ip段用户的访问
2015/04/29 PHP
PHPExcel实现的读取多工作表操作示例
2020/04/14 PHP
js+HTML5实现canvas多种颜色渐变效果的方法
2015/06/05 Javascript
JavaScript forEach()遍历函数使用及介绍
2015/07/08 Javascript
javascript设计简单的秒表计时器
2020/09/05 Javascript
JavaScript仿支付宝密码输入框
2015/12/29 Javascript
教大家轻松制作Bootstrap漂亮表格(table)
2016/12/13 Javascript
jQuery实现返回顶部按钮和scroll滚动功能[带动画效果]
2017/07/05 jQuery
jQuery基于cookie实现换肤功能实例
2017/10/14 jQuery
react 国际化的实现代码示例
2018/09/14 Javascript
JS调用安卓手机摄像头扫描二维码
2018/10/16 Javascript
详解Vue.js中引入图片路径的几种方式
2019/06/17 Javascript
微信小程序实现日历签到
2020/09/21 Javascript
2款Python内存检测工具介绍和使用方法
2014/06/01 Python
对Python3中的input函数详解
2018/04/22 Python
python re模块的高级用法详解
2018/06/06 Python
Django应用程序入口WSGIHandler源码解析
2019/08/05 Python
python隐藏类中属性的3种实现方法
2019/12/19 Python
Python3.7黑帽编程之病毒篇(基础篇)
2020/02/04 Python
基于python实现对文件进行切分行
2020/04/26 Python
OpenCV 使用imread()函数读取图片的六种正确姿势
2020/07/09 Python
Python日志器使用方法及原理解析
2020/09/27 Python
matplotlib grid()设置网格线外观的实现
2021/02/22 Python
CSS3之多背景background使用示例
2013/10/18 HTML / CSS
业务员岗位职责
2013/11/16 职场文书
自荐信格式简述
2014/01/25 职场文书
医学生个人求职信范文
2014/02/07 职场文书
奥运会口号
2014/06/13 职场文书
大学新生军训自我鉴定
2014/09/18 职场文书
施工安全协议书范本
2014/09/26 职场文书
2015年底工作总结范文
2015/05/15 职场文书
2016年幼儿园教师政治学习心得体会
2016/01/23 职场文书
2016年企业安全生产月活动总结
2016/04/06 职场文书
2019年公司卫生管理制度样本
2019/08/21 职场文书