Thinkphp PDO字符集设置报错解决

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

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

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

Thinkphp PDO字符集设置报错解决_第1张图片

百度了一下,发现这是因为用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文件。打印一下查看。

Thinkphp PDO字符集设置报错解决_第2张图片

确实是这样拼接的。

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

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

对比一下:

Thinkphp PDO字符集设置报错解决_第3张图片

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

Thinkphp PDO字符集设置报错解决_第4张图片

 

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

Thinkphp PDO字符集设置报错解决_第5张图片

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

Thinkphp PDO字符集设置报错解决_第6张图片

对其进行注释。

Thinkphp PDO字符集设置报错解决_第7张图片

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

Thinkphp PDO字符集设置报错解决_第8张图片

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

Thinkphp PDO字符集设置报错解决_第9张图片

即可正常使用了

 

你可能感兴趣的:(Thinkphp5)