thinkphp会自动把表名里的大写字母转化成下划线加小写字母,这就导致sql查询报错,网上很多人提供了一种解决方案
'DB_PARAMS' => array(\PDO::ATTR_CASE => \PDO::CASE_NATURAL),
把这句代码加入到配置文件中,经过验证这代码是把字段名强制转换为小写,所以该方法行不通。
另一个办法是改源码,亲测可行,下面我们说一下如何改:
第一步:ThinkPHP/Common/functions.php文件
把 // return strtolower(trim(preg_replace("/[A-Z]/", "_\\0", $name), "_"));的strtolower函数删除/** * 字符串命名风格转换 * type 0 将Java风格转换为C的风格 1 将C风格转换为Java的风格 * @param string $name 字符串 * @param integer $type 转换类型 * @return string */function parse_name($name, $type=0) {if ($type) {return ucfirst(preg_replace_callback('/_([a-zA-Z])/', function($match){return strtoupper($match[1]);}, $name));} else { // return strtolower(trim(preg_replace("/[A-Z]/", "_\\0", $name), "_"));return trim(preg_replace("/[A-Z]/", "_\\0", $name), "_");}}
第二步:ThinkPHP/Library/Think/Model.class.php文件中
把$this->trueTableName = strtolower($tableName);的strtolower函数删除
/** * 得到完整的数据表名 * @access public * @return string */public function getTableName() {if(empty($this->trueTableName)) {$tableName= !empty($this->tablePrefix) ? $this->tablePrefix : '';if(!empty($this->tableName)) {$tableName .= $this->tableName;}else{$tableName .= parse_name($this->name);}$this->trueTableName = $tableName; // $this->trueTableName= strtolower($tableName);}return (!empty($this->dbName)?$this->dbName.'.':'').$this->trueTableName;}
完成以上两步就可以了。