公司在使用thinkphp框架,版本也有些老,被一些bug坑了,記錄一下
自動轉小寫解決辦法,最簡單的就是在配置文件加上
'DB_PARAMS' => [\PDO::ATTR_CASE => \PDO::CASE_NATURAL],
但是如果項目已經上線了一段直接, 這樣可能會影響其他人寫的
然后我想在控制器里面動態改變DB_PARAMS這個配置,后來發現不行.
因為基類里面有數據庫操作,model是單例的.不會重新new對象.
最后我想到了一個辦法,重新聲明一個函數,就是為了讓他重新new一個model
function db($table=''){ C('DB_PREFIX',''); $config = [ 'db_type' => C('DB_TYPE'), 'db_user' => C('DB_USER'), 'db_pwd' => C('DB_PWD'), 'db_host' => C('DB_HOST'), 'db_port' => C('DB_PORT'), 'db_name' => C('DB_NAME'), 'db_params' => [ \PDO::ATTR_CASE => \PDO::CASE_NATURAL, ], ]; return M($table)->db('wzb',$config); }
這樣在試用的時候,把M換成db就好了
如果還想修改其他參數,可以參照ThinkPHP\Library\Think\Db.class.php,大概在56行左右,其中parseConfig函數,里面有配置的參數
因為公司項目每次實例化model都是M('tableName',null),所以我把表前綴也去掉了.
溫馨提示: 樓主不建議表中的字段含有大寫,建議試用小寫+斜划線的命名方式.
版本:thinkphp3.1的pdo擴展
問題1:在使用pdo鏈接方式的時候,使用模型find($id)方法時,不會自動識別主鍵
解決辦法:在ThinkPHP\Extend\Driver\Db\DbPdo.class.php中,大概在178行下面加上
if($info['primary']===false){ $info['primary'] = $val['key']; }
版本:thinkphp3.1
問題2:如果開啟自動過濾數據庫不存在的字段(默認開啟),使用join的時候,會過濾掉where里面的join外表里面的字段
解決辦法:在ThinkPHP\Lib\Core\Model.class.php中,大概在549行
把if(isset($options['where']) && is_array($options['where']) && !empty($fields))) {
改成 if(isset($options['where']) && is_array($options['where']) && !empty($fields) && !isset($options['join'])) {
就是多加一個!isset($options['join'])條件
問題3:模板自動壓縮了,導致html換行沒有空格. 其實這個也不算bug, 這個默認是開啟的.
解決辦法:配置文件改一下TMPL_STRIP_SPACE參數