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

ThinkPHP中文字段问题的更多相关文章

  1. Thinkphp5 PDO操作mysql预处理中文字段出错问题

    Thinkphp5手册上建议不用中文表明和中文字段名 今天发现中文字出问题的地方了 $pdo = new PDO('mysql:host=localhost;dbname=xsfm_master', ...

  2. 在英文版操作系统中安装的MS SQL server,中文字段无法匹配

    在英文版的操作系统中安装的MS SQL server,会出现中文字段无法被匹配到.其原因在于英文环境下安装的MS SQL server的排序规则不包括中文. 所以解决办法就是更改MS SQL serv ...

  3. 01:Geoserver发布shapfile,中文字段乱码问题

    软件环境:Geoserver 2.1.0 UDig 1.2.1 shapfile文件结构:FID                  地物名称      变化图斑                     ...

  4. mysql中文字段转拼音首字母,以及中文拼音模糊查询

    创建存储过程,将中文字段转拼音首字母 CREATE DEFINER=`root`@`%` FUNCTION `fristPinyin`(P_NAME VARCHAR(255)) RETURNS var ...

  5. 表单同时有中文字段和文件上传,加上enctype="multipart/form-data"后导致的中文乱码问题

    因为一个表单需要同时上传字段和文件,所以加上enctype="multipart/form-data",但是上传后的中文字段变成了乱码. 把enctype="multip ...

  6. Mysql使用中文字段排序的实现--order by

    在处理排序规则的时候,有时候我们会需要选择用一些中文字段来排序,实现我们在工作中的需求,下面是在处理排序的时候,适用的方式展示. SELECT t.lawcheckcolumnid AS id,t.c ...

  7. Oracle 如何对中文字段进行排序

    Oracle 如何对中文字段进行排序 oracle中drop.delete和truncate的区别 oracle里的执行计划-查看

  8. mysql 查询中文字段 没有结果的解决方法

    代码如下: $conn = new mysqli('localhost', 'root', '', 'excel');$sql = "select 中信一级行业 from excel gro ...

  9. 通过RF数据库查询中文字段结果正常显示的转换方法

    方法1:统一显示为中文 1.通过RF数据库查询中文字段结果格式:'\xba\xcb\xbc\xf5\xcd\xa8\xb9\xfd' 2.通过Decode Bytes To String进行gbk解码 ...

随机推荐

  1. Zebra-打印特殊字符

    Zebra在打印一些特殊的字符时,会出异常. 在要打印的字符串前加  ^FH  然后将字符换成 ASCii编码或utf-8编码的16进制,在前面加_,如D094写成_DO_94 查看字符的编码 htt ...

  2. Kali 安装tightvncserver

    一.软件说明 a) tightvncserver是一个轻量级,只能建立桌面,不能查看TTY7/TTY1正在显示的桌面,但x11 vnc可以,相比x11vnc 安全传输差一些.反之,x11 vnc:安全 ...

  3. zabbix--自动注册

    Active agent自动注册 agent 自动注册就是实现一台新的服务器配置好 agent 端,自动在服务器端注册,无需在服务器上进行手动配置便可以直接启动对新的host的监控. 参考官档:htt ...

  4. Ansible 常用模块(一)

    一.Ansible简介 Ansible是新出现的自动化运维工具,基于python开发,集合了众多运维工具(puppet(ruby).cfengine.chef.func.fabric.)的优点,实现了 ...

  5. Django bootstrap按钮点击后激活active

    现在有个需求,就是在导航栏上有若干个按钮,我想实现的功能是当点击某个按钮后修改文字颜色,这样网站会更人性化.现总结方法如下: index.html: <ul class="navbar ...

  6. Servlet & spring -网络事务处理单元

    网络事务处理单元 Java Servlet 是运行在 Web 服务器或应用服务器上的程序,它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层 ...

  7. 单片机模块化程序: 单片机AT指令配置模块程序模板(非阻塞版)

    拷贝这两个文件到自己的工程 测试1://单片机发送AT+RST\r\n  如果单片机串口接收到OK 或者ready 执行下一条 测试视频: https://qqqqqbucket.oss-cn-bei ...

  8. [RN] React Native 使用精美图标库react-native-vector-icons

    React Native 使用精美图标库react-native-vector-icons 一.安装依赖 npm install --save react-native-vector-icons // ...

  9. A@[G!C]%008

    A@[G!C]%008 A Simple Calculator 细节题. B Contiguous Repainting 最后只要有连续\(K\)个鸽子同色就可以构造方案,枚举+前缀和 C Tetro ...

  10. virsh使用总结

    做下面操作前先安装这些工具: yum  install  virt-install  libvirt-admin  libvirt-client  libvirt-daemon libvirt主要的配 ...