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邮件类
Jan 03 PHP
PHP 第一节 php简介
Apr 28 PHP
PHP输出数组中重名的元素的几种处理方法
Sep 05 PHP
关于svn冲突的解决方法
Jun 21 PHP
对PHP新手的一些建议(PHP学习经验总结)
Aug 20 PHP
浅谈php命令行用法
Feb 04 PHP
微信支付开发告警通知实例
Jul 12 PHP
浅析PHP数据导出知识点
Feb 17 PHP
Laravel多用户认证系统示例详解
Mar 13 PHP
PHP explode()函数用法讲解
Feb 15 PHP
PHP删除数组中特定元素的两种方法
Feb 28 PHP
PHP强制转化的形式整理
May 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
joomla内置的表单验证功能使用方法
2010/06/11 PHP
PHP 命令行参数详解及应用
2011/05/18 PHP
一个非常实用的php文件上传类
2017/07/04 PHP
浅谈EasyUI中Treegrid节点的删除
2015/03/01 Javascript
原生JS实现LOADING效果
2015/03/16 Javascript
有趣的bootstrap走动进度条
2016/12/01 Javascript
ES6下子组件调用父组件的方法(推荐)
2018/02/23 Javascript
[原创]jQuery实现合并/追加数组并去除重复项的方法
2018/04/11 jQuery
nodeJs爬虫的技术点总结
2018/05/13 NodeJs
ES6 对象的新功能与解构赋值介绍
2019/02/05 Javascript
浅谈Ant Design Pro 菜单自定义 icon
2020/11/17 Javascript
如何使用 JavaScript 操作浏览器历史记录 API
2020/11/24 Javascript
剖析Django中模版标签的解析与参数传递
2015/07/21 Python
一个基于flask的web应用诞生 组织结构调整(7)
2017/04/11 Python
Python文件读写保存操作的示例代码
2018/09/14 Python
对Python中DataFrame选择某列值为XX的行实例详解
2019/01/29 Python
利用python实现AR教程
2019/11/20 Python
python实现回旋矩阵方式(旋转矩阵)
2019/12/04 Python
django formset实现数据表的批量操作的示例代码
2019/12/06 Python
使用python的turtle函数绘制一个滑稽表情
2020/02/28 Python
什么是python类属性
2020/06/10 Python
加拿大消费电子和手机购物网站:The Source
2017/01/28 全球购物
美国葡萄酒网上商店:Martha Stewart Wine Co.
2019/03/17 全球购物
行政前台岗位职责
2013/12/04 职场文书
聊城大学毕业生自荐书
2014/02/01 职场文书
教师党员承诺书
2014/03/25 职场文书
民生工作实施方案
2014/05/31 职场文书
施工安全标语
2014/06/07 职场文书
新文化运动的基本口号
2014/06/21 职场文书
2014年入党积极分子党校培训心得体会
2014/07/08 职场文书
2014年学习厉行节约反对浪费思想汇报
2014/09/10 职场文书
个人融资协议书
2014/10/02 职场文书
2014年医药代表工作总结
2014/11/22 职场文书
2016年寒假政治学习心得体会
2015/10/09 职场文书
2016学习依法治国心得体会
2016/01/15 职场文书
爱心捐款倡议书:点燃希望,传递温暖
2019/11/04 职场文书