Thinkphp5手冊上建議不用中文代表和中文字段名php
今天發現中文字出問題的地方了html
$pdo = new PDO('mysql:host=localhost;dbname=xsfm_master', 'root','root' ); $pre = $pdo->prepare('UPDATE `ep購買` SET `支付寶`=:data__111 WHERE `id` = :where_id '); $arr = [':data__111'=>'852',':where_id'=>'1']; $pre->execute($arr);
中文字段是徹底支持的mysql
官網是這麼說的sql
http://www.thinkphp.cn/topic/44305.htmlthinkphp
可是 Thinkphp5中綁定是這麼幹的數組
"UPDATE `ep購買` SET `支付寶`=:data__支付寶 WHERE `id` = :where_id "
["data__支付寶"] => array(2) { [0] => string(3) "998" [1] => int(2) } ["where_id"] => array(2) { [0] => int(1) [1] => int(1) }
測試一下果真出錯thinkphp5
$pre = $pdo->prepare('UPDATE `ep購買` SET `支付寶`=:data__支付寶 WHERE `id` = :where_id '); $arr = [':data__支付寶'=>'852',':where_id'=>'1']; $pre->execute($arr);
知道錯誤緣由就容易解決了測試
我是這麼幹的ui
Thinkphp5.1 \thinkphp\library\think\db\Builder.phpspa
P:103
elseif (is_scalar($val)) { // 過濾非標量數據 if (0 === strpos($val, ':') && $query->isBind(substr($val, 1))) { $result[$item] = $val; } else { $key = str_replace('.', '_', $key); if (preg_match("/[\x7f-\xff]/", $key)) { //add_判斷字符串中是否有中文 $query->bind('data__' . md5($key), $val, isset($bind[$key]) ? $bind[$key] : PDO::PARAM_STR);//add $result[$item] = ':data__' . md5($key); //add } else { //add $query->bind('data__' . $key, $val, isset($bind[$key]) ? $bind[$key] : PDO::PARAM_STR); $result[$item] = ':data__' . $key; } //add } }
公司有人改這裏用的是 base64_encode方法
想到Thinkphp5 Model返回的都是implement ArrayAccess 的對象,雖然能夠以數組的方式訪問,可是做者建議用$obj->id的方式訪問,若是中文字段 $obj->數量,不優雅
20180112
thinkphp5.1.3我是這麼幹的