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 相关文章推荐
BBS(php &amp; mysql)完整版(二)
Oct 09 PHP
很实用的一个完整email发送程序
Oct 09 PHP
php程序效率优化的一些策略小结
Jul 17 PHP
PHP代码网站如何防范SQL注入漏洞攻击建议分享
Mar 01 PHP
PHP的简易冒泡法代码分享
Aug 28 PHP
浅析PHP 按位与或 (^ 、&amp;)
Jun 21 PHP
ThinkPHP2.0读取MSSQL提示Incorrect syntax near the keyword 'AS'的解决方法
Jun 25 PHP
PHP 导出Excel示例分享
Aug 18 PHP
windows中为php安装mongodb与memcache
Jan 06 PHP
php实现将base64格式图片保存在指定目录的方法
Oct 13 PHP
如何修改Laravel中url()函数生成URL的根地址
Aug 11 PHP
PHP unset函数原理及使用方法解析
Aug 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
Mysql的Root密码忘记,查看或修改的解决方法(图文介绍)
2013/06/14 PHP
php官方微信接口大全(微信支付、微信红包、微信摇一摇、微信小店)
2015/12/21 PHP
PHP的邮件群发系统phplist配置方法详细总结
2016/03/30 PHP
php使用curl获取header检测开启GZip压缩的方法
2018/08/15 PHP
在JS中最常看到切最容易迷惑的语法(转)
2010/10/29 Javascript
jquery 图片上传按比例预览插件集合
2011/05/28 Javascript
jquery ajax jsonp跨域调用实例代码
2013/12/11 Javascript
jQuery实现点击按钮文字变成input框点击保存变成文字
2016/05/09 Javascript
AngularJS表单验证中级篇(3)
2016/09/28 Javascript
微信小程序 图片等比例缩放(图片自适应屏幕)
2016/11/16 Javascript
js 博客内容进度插件详解
2017/02/19 Javascript
js实现网页的两个input标签内的数值加减(示例代码)
2017/08/15 Javascript
React如何避免重渲染
2018/04/10 Javascript
详解element-ui设置下拉选择切换必填和非必填
2019/06/17 Javascript
微信小程序iOS下拉白屏晃动问题解决方案
2019/10/12 Javascript
基于Electron实现桌面应用开发代码实例
2020/07/07 Javascript
JS实现纸牌发牌动画
2021/01/19 Javascript
[48:32]2018DOTA2亚洲邀请赛 3.31 小组赛 A组 LGD vs VG
2018/04/01 DOTA
python检测服务器是否正常
2014/02/16 Python
windows下python和pip安装教程
2018/05/25 Python
Django如何自定义分页
2018/09/25 Python
使用Python paramiko模块利用多线程实现ssh并发执行操作
2019/12/05 Python
教你使用Sublime text3搭建Python开发环境及常用插件安装另分享Sublime text3最新激活注册码
2020/11/12 Python
selenium框架中driver.close()和driver.quit()关闭浏览器
2020/12/08 Python
毕业生求职找工作的自我评价范文
2013/11/27 职场文书
优秀团员自我评价范文
2014/04/23 职场文书
质量主管工作职责
2014/09/26 职场文书
学生不参加考试检讨书
2015/02/19 职场文书
建国大业电影观后感
2015/06/01 职场文书
妈妈再爱我一次观后感
2015/06/08 职场文书
月考总结与反思
2015/10/22 职场文书
小学中队长竞选稿
2015/11/20 职场文书
2016年七夕爱情寄语
2015/12/04 职场文书
SQL Server2019数据库之简单子查询的具有方法
2021/04/27 SQL Server
golang定时器
2022/04/14 Golang
教你win10系统中APPCRASH事件问题解决方法
2022/07/15 数码科技