ThinkPHP中文字段問題 Thinkphp5 PDO操作mysql預處理中文字段出錯問題

轉自:

https://www.baidu.com/link?url=Ohc9epgQgkNYLwnHqP-jZ9RfIQWW50-iz8-ZMIPLdtCIJHnUpYwQnDLmXzi7Fa110o_fej06HBQC2fJpNwXLP_&wd=&eqid=e71449f60000ca22000000025dfb2fc9

 

 

Thinkphp5 PDO操作mysql預處理中文字段出錯問題

 

Thinkphp5手冊上建議不用中文表明和中文字段名

今天發現中文字出問題的地方了

$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);

中文字段是完全支持的

官網是這麼說的

http://www.thinkphp.cn/topic/44305.html

但是 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)
  }
複製代碼

測試一下果然出錯

$pre = $pdo->prepare('UPDATE `ep購買`  SET `支付寶`=:data__支付寶  WHERE  `id` = :where_id  ');
$arr = [':data__支付寶'=>'852',':where_id'=>'1'];
$pre->execute($arr);

知道錯誤原因就容易解決了

我是這麼幹的

Thinkphp5.1 \thinkphp\library\think\db\Builder.php

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我是這麼幹的

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章