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实现从ftp服务器上下载文件树到本地电脑的程序
Feb 10 PHP
探讨php中遍历二维数组的几种方法详解
Jun 08 PHP
PHP和javascript常用正则表达式及用法实例
Jul 01 PHP
PHP高手需要要掌握的知识点
Aug 21 PHP
PHP实现将HTML5中Canvas图像保存到服务器的方法
Nov 28 PHP
PHP使用xmllint命令处理xml与html的方法
Dec 15 PHP
PHP数据库连接mysql与mysqli对比分析
Jan 04 PHP
mysql_escape_string()函数用法分析
Apr 25 PHP
PHP中FTP相关函数小结
Jul 15 PHP
php session的应用详细介绍
Mar 22 PHP
PHP基于openssl实现的非对称加密操作示例
Jan 11 PHP
Laravel模糊查询区分大小写的实例
Sep 29 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
Zend Framework教程之资源(Resources)用法实例详解
2016/03/14 PHP
PHP封装的简单连接MongoDB类示例
2019/02/13 PHP
常用简易JavaScript函数
2009/04/09 Javascript
使弱类型的语言JavaScript变强势
2009/06/22 Javascript
javascript中的数字与字符串相加实例分析
2011/08/14 Javascript
onkeyup,onkeydown和onkeypress的区别介绍
2013/10/21 Javascript
js的hasownproperty使用示例
2014/03/02 Javascript
js中精确计算加法和减法示例
2014/03/28 Javascript
node.js中使用socket.io制作命名空间
2014/12/15 Javascript
js函数与php函数的区别实例浅析
2015/01/12 Javascript
JavaScript动态添加列的方法
2015/03/25 Javascript
快速解决Canvas.toDataURL 图片跨域的问题
2016/05/10 Javascript
PHP捕捉异常中断的方法
2016/10/24 Javascript
利用D3.js实现最简单的柱状图示例代码
2016/12/09 Javascript
nodejs进阶(6)—连接MySQL数据库示例
2017/01/07 NodeJs
深入理解vue.js中的v-if和v-show
2017/06/22 Javascript
ionic环境配置及问题详解
2017/06/27 Javascript
nodejs中安装ghost出错的原因及解决方法
2017/10/23 NodeJs
JS实现验证码倒计时的注册页面
2018/01/02 Javascript
js实时监控文本框输入字数的实例代码
2018/01/18 Javascript
socket io与vue-cli的结合使用的示例代码
2018/11/01 Javascript
JavaScript This指向问题详解
2019/11/25 Javascript
openlayers4实现点动态扩散
2020/08/17 Javascript
vue深度监听(监听对象和数组的改变)与立即执行监听实例
2020/09/04 Javascript
python多线程操作实例
2014/11/21 Python
TensorFlow实现Logistic回归
2018/09/07 Python
推荐10款最受Python开发者欢迎的Python IDE
2018/09/16 Python
python绘制评估优化算法性能的测试函数
2019/06/25 Python
Python Socket TCP双端聊天功能实现过程详解
2020/06/15 Python
完美解决torch.cuda.is_available()一直返回False的玄学方法
2021/02/06 Python
英国时尚饰品和发饰购物网站:Claire’s
2017/07/04 全球购物
销售员岗位职责范本
2014/02/03 职场文书
普通党员整改措施
2014/10/24 职场文书
小学五年级(说明文3篇)
2019/08/13 职场文书
一看就懂的MySQL的聚簇索引及聚簇索引是如何长高的
2021/05/25 MySQL
gateway网关接口请求的校验方式
2021/07/15 Java/Android