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

Thinkphp5 PDO操作mysql预处理中文字段出错问题的更多相关文章
- MySQL原生API、MySQLi面向过程、MySQLi面向对象、PDO操作MySQL
[转载]http://www.cnblogs.com/52fhy/p/5352304.html 本文将举详细例子向大家展示PHP是如何使用MySQL原生API.MySQLi面向过程.MySQLi面向对 ...
- php类模块引擎PDO操作MySQL数据库简单阐述
PDO是什么呢? 通俗说就是别人写的一个“数据库操作工具类”,它非常强大,可以应对市面上几乎所有主流数据库, 具体应用时候有这样一个关系: 即,要操作某种数据,就得去“打开”对应的pdo引擎. 在ph ...
- 使用EF操作Mysql数据库中文变问号的解决方案
问题场景:使用Entity Framework 6.0 操作Mysql数据库,中文保存至数据库后全部变成问号.但是使用Mysql API却不会. 原因排查:首先想到的肯定是数据库编码问题,一次查询了表 ...
- mysql 查询中文字段 没有结果的解决方法
代码如下: $conn = new mysqli('localhost', 'root', '', 'excel');$sql = "select 中信一级行业 from excel gro ...
- [mysql]brew 安装 配置 操作 mysql(中文问题)
mac 下卸载mysqldmg mac下mysql的DMG格式安装内有安装文件,却没有卸载文件--很郁闷的事. 网上搜了一下,发现给的方法原来得手动去删. 很多文章记述要删的文件不完整,后来在stac ...
- PDO操作mysql数据库(一)
PHP连接mysql数据库: <?php$server = "localhost";$user = "root";$pwd = "123456& ...
- Python操作MySQL以及中文乱码的问题
Python操作MySQL需要安装Python-MySQL可以从网上搜索一下,和一般的Python包一样安装 安装好之后,模块名字叫做MySQLdb ,在Window和Linux环境下都可以使用,试验 ...
- Mysql使用中文字段排序的实现--order by
在处理排序规则的时候,有时候我们会需要选择用一些中文字段来排序,实现我们在工作中的需求,下面是在处理排序的时候,适用的方式展示. SELECT t.lawcheckcolumnid AS id,t.c ...
- 使mysql按中文字段排序
http://ourmysql.com/archives/391 测试后我发现,gbk不仅对字符内容是按拼音排序的,对数字也是一样,使用时需注意! 另外一篇文章: MySQL按中文拼音排序
随机推荐
- 洛谷 P2895 [USACO08FEB]流星雨Meteor Shower
题目描述 Bessie hears that an extraordinary meteor shower is coming; reports say that these meteors will ...
- UVALive 5031 Graph and Queries (Treap)
删除边的操作不容易实现,那么就先离线然后逆序来做. 逆序就变成了合并,用并存集判断连通,用Treap树来维护一个连通分量里的名次. Treap = Tree + Heap.用一个随机的优先级来平衡搜索 ...
- UVA 246 10-20-30 10-20-30游戏 模拟+STL双端队列deque
Input Each input set consists of a sequence of 52 integers separated by spaces and/or ends of line. ...
- Windows环境下使用Apache+mod
1.安装Python和Apache. 2.安装mod_wsgi后获得wsgi.so,并将wsgi.so放到Apache的modules文件夹下. 3.安装webpy. 4.打开httpd.conf(在 ...
- MFC:AfxSetResourceHandle
AfxGetResourceHandle用于获取当前资源模块句柄. 而AfxSetResourceHandle则用于设置程序目前要使用的资源模块句柄,一般在InitInstance()里调用.
- javaweb基础(7)_HttpServletResponse原理详解
Web服务器收到客户端的http请求,会针对每一次请求,分别创建一个用于代表请求的request对象.和代表响应的response对象.request和response对象即然代表请求和响应,那我们要 ...
- java基础—基础语法2
一.语句
- 有关SQL的一道面试题
这是一个学生分数表 StudentName StudySubject SubjectScore Peter ...
- nginx作为正向代理,反向代理的一些应用
正向代理代理的对象是客户端 反向代理代理的对象是服务端 举例说下nginx作为正向代理作访问控制 server{ listen 80; server_name localhost jeson.gaos ...
- UVA - 1152 4 Values whose Sum is 0问题分解,二分查找
题目:点击打开题目链接 思路:暴力循环显然会超时,根据紫书提示,采取问题分解的方法,分成A+B与C+D,然后采取二分查找,复杂度降为O(n2logn) AC代码: #include <bits/ ...