在用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中加上一个设置字符集的操作。
即可正常使用了