使用PDO并开启数据库字段缓存导致sql生成错误

浏览:1039 发布日期:2014/07/07
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方法。
评论(
后面还有条评论,点击查看>>