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 相关文章推荐
MySQL数据源表结构图示
Jun 05 PHP
PHP中使用crypt()实现用户身份验证的代码
Sep 05 PHP
QQ互联一键登录审核不通过的解决方案
Sep 10 PHP
PHP获取文件夹大小函数用法实例
Jul 01 PHP
PHP结合jQuery实现找回密码
Jul 22 PHP
百度地图经纬度转换到腾讯地图/Google 对应的经纬度
Aug 28 PHP
浅析php静态方法与非静态方法的用法区别
May 17 PHP
PHP操作mysql数据库分表的方法
Jun 09 PHP
详解PHP中cookie和session的区别及cookie和session用法小结
Jun 12 PHP
PHP入门教程之表单与验证实例详解
Sep 11 PHP
让ThinkPHP的模板引擎达到最佳效率的方法详解
Mar 14 PHP
laravel excel 上传文件保存到本地服务器功能
Nov 14 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
shopex中集成的站长统计功能的代码简单分析
2011/08/11 PHP
Zend Framework教程之动作的基类Zend_Controller_Action详解
2016/03/07 PHP
Smarty日期时间操作方法示例
2016/11/15 PHP
PHP简单实现冒泡排序的方法
2016/12/26 PHP
php+js实现点赞功能的示例详解
2020/08/07 PHP
File文件控件,选中文件(图片,flash,视频)即立即预览显示
2009/04/09 Javascript
基于Jquery的$.cookie()实现跨越页面tabs导航实现代码
2011/03/03 Javascript
使用Post提交时须将空格转换成加号的解释
2013/01/14 Javascript
最棒的Angular2表格控件
2016/08/10 Javascript
JS短信验证码倒计时功能的实现(没有验证码,只有倒计时)
2016/10/27 Javascript
前端实现文件的断点续传(前端文件提交+后端PHP文件接收)
2016/11/04 Javascript
100行代码理解和分析vue2.0响应式架构
2017/03/09 Javascript
写给vue新手们的vue渲染页面教程
2017/09/01 Javascript
python的即时标记项目练习笔记
2014/09/18 Python
python开发之thread线程基础实例入门
2015/11/11 Python
python实现K最近邻算法
2018/01/29 Python
Python使用matplotlib模块绘制图像并设置标题与坐标轴等信息示例
2018/05/04 Python
Flask框架Jinjia模板常用语法总结
2018/07/19 Python
学习python的前途 python挣钱
2019/02/27 Python
在Pycharm中调试Django项目程序的操作方法
2019/07/17 Python
使用python telnetlib批量备份交换机配置的方法
2019/07/25 Python
对Python中一维向量和一维向量转置相乘的方法详解
2019/08/26 Python
Python基础之变量基本用法与进阶详解
2020/01/03 Python
python递归调用中的坑:打印有值, 返回却None
2020/03/16 Python
HTML5使用Audio标签实现歌词同步的效果
2016/03/17 HTML / CSS
Joie官方网上商店:购买服装和女装配饰
2018/06/05 全球购物
创造美妙香氛体验:Aera扩散器和香水
2018/11/25 全球购物
金讯Java笔试题目
2013/06/18 面试题
应届毕业生自荐信例文
2014/02/26 职场文书
给学校的建议书
2014/03/12 职场文书
计算机专业毕业生求职信
2014/04/30 职场文书
医院院务公开实施方案
2014/05/03 职场文书
2014年母亲节寄语
2014/05/07 职场文书
2014年督导工作总结
2014/11/19 职场文书
Android超详细讲解组件ScrollView的使用
2022/03/31 Java/Android
Android自定义ScrollView实现阻尼回弹
2022/04/01 Java/Android