ThinkPHP 数据表表名大小写问题
2022-07-28 14:14:58
215
{{single.collect_count}}

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;}


完成以上两步就可以了。


回帖
全部回帖({{commentCount}})
{{item.user.nickname}} {{item.user.group_title}} {{item.friend_time}}
{{item.content}}
{{item.comment_content_show ? '取消' : '回复'}} 删除
回帖
{{reply.user.nickname}} {{reply.user.group_title}} {{reply.friend_time}}
{{reply.content}}
{{reply.comment_content_show ? '取消' : '回复'}} 删除
回帖
收起
没有更多啦~
{{commentLoading ? '加载中...' : '查看更多评论'}}