zoukankan      html  css  js  c++  java
  • ThinkPHP中文字段问题

    转自:
    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 hinkphplibrary hinkdbBuilder.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我是这么干的

  • 相关阅读:
    C++ 数组array与vector的比较
    C/C++头文件区别
    C/C++ 标准输入输出重定向
    C文件读写
    输入输出重定向
    【剑指offer26 二叉搜索树与双向链表】
    【剑指offer25 复杂链表的复制】
    【剑指offer23 二叉搜索树的后序遍历序列】
    【剑指offer22 从上往下打印二叉树 & 60 把二叉树打印成多行】
    【剑指offer21 栈的压入、弹出序列】
  • 原文地址:https://www.cnblogs.com/GarfieldTom/p/12068444.html
Copyright © 2011-2022 走看看