PDO 的错误处理

PDO 全称 PHP Data Object

?------------------    错误处理  -------------------------

??php 的 mysql 扩展对于 mysql 执行中的错误,并不报错显示在页面上。默认是“静默模式”。如果要显示错误到页面上,需要使用函数 mysql_error()

if( !mysql_query("select * from ") ){

echo mysql_error();

}

?

PDO 类对错误的处理默认也是“静默模式”。?要输出错误信息,也需要手动输出。

$pdo->errorCode() //获得错误的编码

$pdo->errorInfo() //错误信息集合?,包含三个元素的索引数组

PDO 支持三种错误处理模式:

静默模式,警告模式,异常模式

静默模式是默认的,需要修改的话,通过设置 PDO 对象的属性完成。

$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_SILENT)?

$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING)??

$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_SILENT)??

警告模式:

警告模式也不是什么特别的东西哦,错误发生时会报一个警告,就只是一个警告,默认情况下,php对警告的处理是输出页面,可以自己定义处理函数。

异常模式:

?异常处理分成三步:抛出异常,监听异常,捕获异常。

??其实异常就是错误。抛出的错误就是异常。错误处理是:触发,处理。这里的的触发就是异常处理的“抛出”。

抛出:throw

监听:try

捕获:catch?

?异常的工作原理是这样的,把一些信息放到一个类的对象里面,这就是异常处理的原理。这个类叫异常类。这些信息叫异常信息。这没有什么特别的。这个异常类是 Exception .

一般的异常处理:

?try{

$age = 28;?

if( $age > 26 ){

throw new Exception("年龄过大");

}

}catch( Exception $e ){

echo $e->getMessage();

}

throw 会抛出一个异常对象,这个对象是异常类的对象,所以写为 new Exception 。?

try 会监听写在它里面的异常。?catch 会捕获它的参数对应的异常。这里 catch 的参数是 Exception $e ,这种写法表示这个参数是一个对象,而且只能是 Exception 类的对象。这是 php 语法里面对参数的限制。这个异常类可以是 Exception 或者 它的子类。如果是它的子类,那么 throw new 的类也应该是 ?Exception 类的子类(我是这么想的,未测试)。

PDO 的异常处理:??

??try{

$pdo->query("set names "); //不需要抛出异常,可能是在query函数中抛出的

echo ‘错误了‘; //这句不会输出?,抛出异常后程序挂起,必须处理异常,处理异常后这句也不执行。

}catch( PDOException $e ){  //PDOException类是 Exception类的子类的子类

echo $e->getMessage();

}

?

其实,异常处理就是用面向对象的语法来处理错误。用一般的面向过程的方法也是可以,只是面向对象的语法比较高级。所以,错误处理方式分成两种:标准错误处理,异常错误处理。

时间: 2024-11-02 17:24:32

PDO 的错误处理的相关文章

pdo简介--错误与错误处理

PDO 简介——错误和错误处理 标签: database数据库exception脚本phpup 2008-09-28 19:42 1623人阅读 评论(0) 举报  分类: PHP(10)  为适合你的应用开发,PDO 提供了3中不同的错误处理策略. PDO::ERRMODE_SILENT 这是默认使用的模式.PDO会在statement和database对象上设定简单的错误代号,你可以使用PDO->errorCode() 和 PDO->errorInfo() 方法检查错误:如果错误是在对st

thinkphp数据库PDO::SQLSRV_ATTR_ENCODING错误的解决

这两天刚粗略看了一下thinkphp3.2.3,决定在新项目中用这个框架,早上做了一下配置, 测试时发现报错: Fatal error: Undefined class constant 'PDO::SQLSRV_ATTR_ENCODING' . 搜了一下,同样的问题还真有不少人碰到,而且没有找到有效的解决方案.用自己写的连接MSSQL方法去连接2008版本的数据库,能正常连接,那么问题出在哪呢?百思不得骑姐,扩展很早就复制到ext文件下并且在配置文件里做了相应配置,思来想去再去看了一下这个错误

pdo mysql错误:Cannot execute queries while other unbuffered queries are active

运行环境:PHP 5.5.30-x64,MYSQL  5.6.27 错误代码:Cannot execute queries while other unbuffered queries are active.  Consider using PDOStatement::fetchAll().  Alternatively, if your code is only ever going to run against mysql, you may enable query buffering by

PHP PDO的错误处理模式

PDO默认的错误处理方式是返回一个数组格式的错误代码.如果想要判断SQL有没有出错时,就需要写一组代码来检测这个返回的数组.觉得这样有些麻烦.还好PDO还提供了另外两种处理方式,只要根据需要设置一下就OK了. 方式一:PDO::ERRMODE_SILENT 这是默认使用的模式.PDO会在statement和database对象上设定简单的错误代号,可以使用PDO->errorCode() 和 PDO->errorInfo() 方法检查错误: 方式二:PDO::ERRMODE_WARNING 使

Yii2 HOW-TO(4):PDO连接数据库错误

问题代码 1,控制器代码如下: public function actionIndex() { $query = Country::find(); $pagination = new Pagination([ 'defaultPageSize' => 5, 'totalCount' => $query->count() ]); $countries = $query->orderBy('name') ->offset($pagination->offset) ->

如何使用PDO查询Mysql来避免SQL注入风险?ThinkPHP 3.1中的SQL注入漏洞分析!

当我们使用传统的 mysql_connect .mysql_query方法来连接查询数据库时,如果过滤不严,就有SQL注入风险,导致网站被攻击,失去控制.虽然可以用mysql_real_escape_string()函数过滤用户提交的值,但是也有缺陷.而使用PHP的PDO扩展的 prepare 方法,就可以避免 sql injection 风险. PDO(PHP Data Object) 是PHP5新加入的一个重大功能,因为在PHP 5以前的php4/php3都是一堆的数据库扩展来跟各个数据库的

php大力力 [046节] 兄弟连高洛峰 PHP教程 2014年[数据库、PDO教程]

第14章 数据库252.[2014]兄弟连高洛峰 PHP教程14.1.1 复习数据库[已发布,点击下载]253.[2014]兄弟连高洛峰 PHP教程14.1.2 phpMyAdmin的使用[已发布,点击下载]254.[2014]兄弟连高洛峰 PHP教程14.1.3 php访问MySQL[已发布,点击下载]255.[2014]兄弟连高洛峰 PHP教程14.1.4 在PHP脚本中操作MySQL数据库1[已发布,点击下载]256.[2014]兄弟连高洛峰 PHP教程14.1.5 在PHP脚本中操作My

PHP中关于PDO数据访问抽象层的功能操作

PDO:数据访问抽象层 具有三大特点: 1.可以访问其它数据库  所有数据库都可以 2.具有事务功能 3.带有预处理语句功能(防止SQL注入攻击) 实例操作代码如下: <?php //1.造PDO对象$dsn ="mysql:dbname=mydb;host=localhost";//数据库类型:dbname=数据库名称;host=链接的ip或本机$pdo =new PDO($dsn,"root","root");//$dsn,帐号,密码

pdo借鉴

别人的 之前一段时间,开始了php的研究,看了关于PDO的一些资料,发现不错,整理和总结一下,作为开发笔记,留待日后使用,<PHP开发笔记系列(一)-PDO使用>. PDO是PHP Data Objects的简称,是一种数据库访问抽象层.PDO是用于多种数据库的一致接口.类比的说,PDO做的事情类似于JAVA中的持久层框架(Hibernate.OpenJPA)的功能,为异构数据库提供一个统一的编程接口,这样就不必再使用mysql_*.pg_*这样的函数,也不必再写自己的"Generi