博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
解决ThinkPHP3.2.3框架,PDO驱动类“抛出异常”不起作用的bug
阅读量:5124 次
发布时间:2019-06-13

本文共 2119 字,大约阅读时间需要 7 分钟。

项目中引进了ThinkPHP3.2.3的模型层,发现当SQL语句出错时,系统抛出的异常不是我想要的效果,打开文件 ThinkPHP\Library\Think\Db\Driver.class.php,找到如下代码:

/** * 执行语句 *  * @access public * @param string $str  sql指令 * @param boolean $fetchSql  不执行,只是获取SQL * @return mixed */public function execute($str,$fetchSql=false) {	$this->initConnect(true);	if ( !$this->_linkID ) return false;	$this->queryStr = $str;		if(!empty($this->bind)){		$that   =   $this;		$this->queryStr =   strtr($this->queryStr,array_map(function($val) use($that){ return '\''.$that->escapeString($val).'\''; },$this->bind));	}	if($fetchSql){		return $this->queryStr;	}		//释放前次的查询结果	if ( !empty($this->PDOStatement) ) $this->free();	$this->executeTimes++;	N('db_write',1); // 兼容代码		// 记录开始执行时间	$this->debug(true);	$this->PDOStatement = $this->_linkID->prepare($str);	if(false === $this->PDOStatement) {		$this->error();		return false;	}	foreach ($this->bind as $key => $val) {		if(is_array($val)){			$this->PDOStatement->bindValue($key, $val[0], $val[1]);		}else{			$this->PDOStatement->bindValue($key, $val);		}	}	$this->bind =   array();	$result = $this->PDOStatement->execute(); // 当有PDO内部异常时,此处就会直接抛出PHP异常,后面的代码不会被执行,页面被中断	$this->debug(false);	if ( false === $result) {		$this->error();		return false;	} else {		$this->numRows = $this->PDOStatement->rowCount();		if(preg_match("/^\s*(INSERT\s+INTO|REPLACE\s+INTO)\s+/i", $str)) {			$this->lastInsID = $this->_linkID->lastInsertId();		}		return $this->numRows;	}}

注意:

看到上面代码中的片段

$result = $this->PDOStatement->execute(); 

当上述PDO语句有异常时(如 SQL语句中数据表不存在),此处就会直接抛出PHP异常,后面的代码不会被执行,页面被中断,这不是我们想要的结果;

我们是希望PDO异常能够寄存到某个变量中,并且页面不会被中断,异常信息留到后面处理(希望异常在 $this->error() 中被处理),这也是ThinkPHP作者的设计意图,所以该驱动类文件(ThinkPHP\Library\Think\Db\Driver.class.php)需要调整下,找到如下代码调整:

// PDO连接参数protected $options = array(	PDO::ATTR_CASE              =>  PDO::CASE_LOWER,           // 需要改为 PDO::CASE_NATURAL,表示 字段名按照原始的方式显示	PDO::ATTR_ERRMODE           =>  PDO::ERRMODE_EXCEPTION,    // 需要改为 PDO::ERRMODE_SILENT,方便用 errorInfo()方法 来获取异常信息	PDO::ATTR_ORACLE_NULLS      =>  PDO::NULL_NATURAL,	PDO::ATTR_STRINGIFY_FETCHES =>  false,);

 

参考:

转载于:https://www.cnblogs.com/52php/p/5677933.html

你可能感兴趣的文章
单元测试原来是这样的呼
查看>>
java定时任务详解
查看>>
IOS之导航控制器与表视图
查看>>
MSYS2使用教程
查看>>
Hadoop 配置文件 & 启动方式
查看>>
2016年4月 之 《C程序设计语言》
查看>>
WCF配置报错 在 ServiceModel 客户端配置部分中,找不到名称 和协定
查看>>
SQL基础问题整理
查看>>
C++刷称号——2707: 素数与要素
查看>>
coco2dx c++ HTTP实现
查看>>
Hadoop 开源调度系统zeus(二)
查看>>
基于上一篇AS项目依赖库问题的优化解决方案
查看>>
Java——操作集合的工具类:Collections
查看>>
Discuz3.3精仿小米风格整站模板制作——1、新建模板方案
查看>>
挺好用的Markdown写法
查看>>
C# ADO.NET
查看>>
快速排序算法
查看>>
HDU 1394 Minimum Inversion Number
查看>>
JQuery方法
查看>>
P1049 装箱问题
查看>>