IT_man 發表於 2018-10-11 12:57:07

解決 php連接mysql指令mysqli_connect()等等的錯誤==>mysqlnd cannot connect to MySQL 4.1

當php 5.5以上 遇上 mysql 5.2 時,連接mysql的指令 mysqli_connect() 會產生錯誤mysqli_connect(): mysqlnd cannot connect to MySQL 4.1+ using the old insecure authentication. Please use an administration tool to reset your password with the command SET PASSWORD = PASSWORD('your_existing_password').

這是因為php 5.3以前舊版的密碼採16位編碼,而新版php 5.3以後採41位編碼,而mysql 5.2 以前預設也是16碼,所以才會造成此種錯誤.
先診斷一下mysql: (我的php 5.6.38 , mysql 5.1.73)
登入mysql 然後輸入 :
mysql> SHOW VARIABLES LIKE 'old_passwords';
+------------------+-------+
| Variable_name | Value |
+------------------+-------+
| old_passwords | ON   |
+------------------+-------+
1 row in set (0.00 sec)

old_password==> ON就表示 /etc/my.cnf裏的 old_passwords=1設定為16碼,須將它設為 0 然後重啟mysqld ==> service mysqld restart
或 在 mysql prompt下輸入:
mysql> SET old_passwords=FALSE;
檢查mysql.user內 每個密碼長度:
mysql> SELECT 'User', 'Host', Length('Password') FROM mysql.user;
如果還沒改成41位,Length('Password')這個欄位應該都是16或是0(表示沒設密碼)

再重設原來的密碼:
mysql> SET PASSWORD FOR 'root'@'192.168.1.1' = PASSWORD('原來的密碼');    // 小心要核對原來 帳號@IP 更改,不要改錯了
mysql> flush privileges;

再輸入 SELECT 'User', 'Host', Length('Password') FROM mysql.user; 檢查密碼度,就可發現剛剛改的root 的密碼長度已改為41碼
注意:
如果帳號太多,可以遇到問題時再重設密碼,因為重設密碼 SET PASSWORD FOR 只針對個別密碼,不會因為 old_passwords=0 而對所有密碼造成影響===========================================================================
當mysql升級到 8.0.21時,php連到mysql出現2行errors:
mysqli_real_connect(): Server sent charset (255) unknown to the client. Please, report to the developers
mysqli_real_connect(): (HY000/2054): Server sent charset unknown to the client. Please, report to the developers
原因:
在MySQL 8.0.21中,caching_sha2_password是默認的身份驗證插件,而不是以往的mysql_native_password。所以和php不相容。可以降級php,也可以修改MySQL的配置。 吾人決定修改MySQL的配置:
vi /etc/my.cnf加入下列:


character-set-server=utf8
default_authentication_plugin=mysql_native_password


default-character-set=utf8


default-character-set=utf8

然後重啟mysqld
service mysqld restart
搞定!!


頁: [1]
查看完整版本: 解決 php連接mysql指令mysqli_connect()等等的錯誤==>mysqlnd cannot connect to MySQL 4.1