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 相关文章推荐
用PHP和ACCESS写聊天室(十)
Oct 09 PHP
php通过COM类调用组件的实现代码
Jan 11 PHP
PHP的5个安全措施小结
Jul 17 PHP
通过php修改xml文档内容的方法
Jan 23 PHP
php curl登陆qq后获取用户信息时证书错误
Feb 03 PHP
PHP中实现crontab代码分享
Mar 26 PHP
php 多文件上传的实现实例
Oct 23 PHP
简单谈谈PHP中的trait
Feb 25 PHP
PHP实现的链式队列结构示例
Sep 15 PHP
PHP join()函数用法与实例讲解
Mar 11 PHP
laravel http 自定义公共验证和响应的方法
Sep 29 PHP
laravel框架创建授权策略实例分析
Nov 22 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下载远程文件类(支持断点续传)
2008/11/14 PHP
ThinkPHP空模块和空操作详解
2014/06/30 PHP
PHP用户验证和标签推荐的简单使用
2016/10/31 PHP
php加密之discuz内容经典加密方式实例详解
2017/02/04 PHP
php使用array_chunk函数将一个数组分割成多个数组
2018/12/05 PHP
php生成短网址/短链接原理和用法实例分析
2020/05/29 PHP
JavaScript 实现鼠标拖动元素实例代码
2014/02/24 Javascript
jquery比较简洁的软键盘特效实现方法
2015/03/19 Javascript
javascript实现实时输出当前的时间
2015/04/27 Javascript
JS实现动态移动层及拖动浮层关闭的方法
2015/04/30 Javascript
jQuery实现查找链接文字替换属性的方法
2016/06/27 Javascript
在JSP中如何实现MD5加密的方法
2016/11/02 Javascript
JS中用childNodes获取子元素换行会产生一个子元素
2016/12/08 Javascript
Jquery Easyui对话框组件Dialog使用详解(14)
2016/12/19 Javascript
node.js发送邮件email的方法详解
2017/01/06 Javascript
jquery实现左右轮播图效果
2017/09/28 jQuery
vue渲染时闪烁{{}}的问题及解决方法
2018/03/28 Javascript
js实现每日签到功能
2018/11/29 Javascript
Vue源码解析之数据响应系统的使用
2019/04/24 Javascript
Python使用Turtle模块绘制五星红旗代码示例
2017/12/11 Python
python3实现域名查询和whois查询功能
2018/06/21 Python
对python实现模板生成脚本的方法详解
2019/01/30 Python
Python argparse模块应用实例解析
2019/11/15 Python
浅谈keras的深度模型训练过程及结果记录方式
2020/01/24 Python
Python学习工具jupyter notebook安装及用法解析
2020/10/23 Python
意大利体育用品网上商城:Nencini Sport
2016/08/18 全球购物
怎样在 Applet 中建立自己的菜单(MenuBar/Menu)?
2012/06/20 面试题
金融专业个人的自我评价
2013/10/18 职场文书
母亲80寿诞答谢词
2014/01/16 职场文书
活动总结格式范文
2014/04/26 职场文书
爱耳日宣传活动总结
2014/07/05 职场文书
优秀员工推荐材料
2014/12/20 职场文书
英语教师个人工作总结
2015/02/09 职场文书
2015年乡镇卫生院妇幼保健工作总结
2015/05/19 职场文书
《巨人的花园》教学反思
2016/02/19 职场文书
mysql使用FIND_IN_SET和group_concat两个方法查询上下级机构
2022/04/20 MySQL