Thinkphp PDO字符集设置报错解决

在用cmf做好一个项目之后,传到阿里的虚拟主机上。传虚拟主机需要把index.php抽出来的,这个大家百度就好,这里重点讲PDO的报错。

在线下项目是没问题的能跑的,但是传上去后发现一个报错。

报错为:'SQLSTATE[HY000] [2019] Can't initialize charater set utf8mb4 (path: /usr/local/mysql/share/mysql/charsets/)'

百度了一下,发现这是因为用PDO操作的时候,把字符编码也写进去了。

正常操作:

$dbms='mysql';    
$host='localhost'; 
$dbName='test';   
$user='root';     
$pass='';        
$dsn="$dbms:host=$host;dbname=$dbName";
$dbh = new PDO($dsn, $user, $pass);

 

线上报错操作:

$dbms='mysql';    
$host='localhost'; 
$dbName='test';   
$user='root';     
$pass='';        
$dsn="$dbms:host=$host;dbname=$dbName;charset=utf8";
$dbh = new PDO($dsn, $user, $pass);

可以发现在传入dsn的时候多了一个charset的操作。

不过这个在线下我的电脑中测试不会报错,但线上环境就会。。

ps:线上是阿里云的虚拟主机,不知道是不是和这个有关。。。

我们看看thinkphp是不是也是这样子拼接的。根据报错信息我们去到thinkphp的mysql连接的php文件。打印一下查看。

确实是这样拼接的。

所以我们需要把设置字符串修改成

$pdo->query('SET NAMES utf8mb4');

对比一下:

--------------------------------

 

我们要着手改代码了。看到这里:(文件在 think/db/Connection.php 

发现对dsn进行了parseDsn方法的操作。找到这个函数。在 think/db/connector/Mysql.php 

对其进行注释。

重新打印,发现没有了charset。

我们还要再Connection.php中加上一个设置字符集的操作。

即可正常使用了

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值