3.2.0 - 严重 - 未处理
在该版本发现(估计3.2.1和3.2.2也有这个问题)当MYSQL使用PDO时,并且开启数据库字段缓存(DB_FIELDS_CACHE),当清空runtime数据,第一次生成的sql正常,第二次生成的sql会丢失参数值。
下面是我的db配置:
<?php
return array(
'DB_CONFIG' => array(
'DB_TYPE' => 'pdo',
'DB_USER' => 'root',
'DB_PWD' => '123456',
'DB_PREFIX' => 'prefix_',
'DB_DSN' => 'mysql:host=xxxx;dbname=xxx;charset=UTF8'
),
);分析了代码发现是由于下面的原因导致:问题出现在函数escapeString上,在Pdo.class.php中,如下:
public function escapeString($str) {
switch($this->dbType) {
case 'PGSQL':
case 'MSSQL':
case 'SQLSRV':
case 'MYSQL':
return addslashes($str);
case 'IBASE':
case 'SQLITE':
case 'ORACLE':
case 'OCI':
return str_ireplace("'", "''", $str);
}
}没有PDO类型,而在connect里方法里有如下代码,会把PDO更换为MYSQL:// 因为PDO的连接切换可能导致数据库类型不同,因此重新获取下当前的数据库类型
$this->dbType = $this->_getDsnType($config['dsn']);如果没开启DB_FIELDS_CACHE,会在生成sql前,会执行getFields方法,查询表字段来执行一次connect方法,使得dbType变为MYSQL,在接下来的组装sql就不会有问题。但是开启了DB_FIELDS_CACHE,就在第二次直接读取字段缓存,而connect是在最后query的时候才执行,这时候sql已经组装完成了,参数已经丢失。
建议:
最简单还是改下escapeString方法。
