52AV手機A片王|52AV.ONE

標題: 解決 php連接mysql指令mysqli_connect()等等的錯誤==>mysqlnd cannot connect to MySQL 4.1 [打印本頁]

作者: IT_man    時間: 2018-10-11 12:57
標題: 解決 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').
- d" Z2 R9 W/ v. b; d& i/ e! `1 V' K
這是因為php 5.3以前舊版的密碼採16位編碼,而新版php 5.3以後採41位編碼,而mysql 5.2 以前預設也是16碼,所以才會造成此種錯誤.
5 u- j, v: M$ W0 B0 D/ P' [先診斷一下mysql: (我的php 5.6.38 , mysql 5.1.73)/ D7 Q/ F# L! N6 J
登入mysql 然後輸入 : $ o7 v$ }, w) K) N+ o
mysql> SHOW VARIABLES LIKE 'old_passwords';% f7 f; ]5 x& m' A, A& s1 d# N
+------------------+-------+
1 v8 L# @- ?( s# N! ]/ e$ _8 U7 T6 ]; w| Variable_name | Value |
3 A/ M. w( V9 o! H9 Y+------------------+-------+# u' M  P! t/ w) c6 y* `6 E
| old_passwords | ON   |; J$ ^# u% F! i$ E4 E7 K: j+ T
+------------------+-------+. |0 o1 M& P$ Q3 d1 S5 O
1 row in set (0.00 sec)5 l1 {9 o- \' Z
4 H) o. @; u1 ^# ^5 [
old_password  ==> ON  就表示 /etc/my.cnf  裏的 old_passwords=1  設定為16碼,須將它設為 0 然後重啟mysqld ==> service mysqld restart
6 \  H$ E7 i: K0 n  ^8 C或 在 mysql prompt下輸入:/ ~: r7 R) T4 Q
mysql> SET old_passwords=FALSE;  6 a5 t' Q5 B) S9 S- Y
檢查mysql.user內 每個密碼長度:; V2 u5 q7 T2 \9 G3 }! i% o5 ~
mysql> SELECT 'User', 'Host', Length('Password') FROM mysql.user;7 @' m3 s. d) L  o  K
如果還沒改成41位,Length('Password')這個欄位應該都是16或是0(表示沒設密碼)
7 k# x6 i& b' {0 R; l* [5 r+ l* q/ A' \% t8 F# a; E* [% P6 }) s$ Z
再重設原來的密碼:
2 \! ~6 N0 C+ W0 v6 T+ l/ fmysql> SET PASSWORD FOR 'root'@'192.168.1.1' = PASSWORD('原來的密碼');    // 小心要核對原來 帳號@IP 更改,不要改錯了) Z+ G# B6 f5 N) K+ X
mysql> flush privileges;
& T! w/ n- g5 b2 S+ L, _
/ a1 r0 N9 s/ A! v再輸入 SELECT 'User', 'Host', Length('Password') FROM mysql.user; 檢查密碼度,就可發現剛剛改的root 的密碼長度已改為41碼9 `3 T3 g3 [7 W/ _0 R% O5 V8 }
注意:& v2 n. t# E) ^# X* y: a' C% N
如果帳號太多,可以遇到問題時再重設密碼,因為重設密碼 SET PASSWORD FOR 只針對個別密碼,不會因為 old_passwords=0 而對所有密碼造成影響
===========================================================================' O4 S/ X+ R, c+ Z7 C% r* V2 H
當mysql升級到 8.0.21時,php連到mysql出現2行errors:
% G2 |( M- d6 a1 a: q" t6 x, Vmysqli_real_connect(): Server sent charset (255) unknown to the client. Please, report to the developers, N% @1 Q1 c, A( h  s, W- z" `5 H' \
mysqli_real_connect(): (HY000/2054): Server sent charset unknown to the client. Please, report to the developers4 f+ I0 k3 Q: l
原因:
6 T  _( i5 }, p2 u
在MySQL 8.0.21中,caching_sha2_password是默認的身份驗證插件,而不是以往的mysql_native_password。所以和php不相容。可以降級php,也可以修改MySQL的配置。 吾人決定修改MySQL的配置:- }" p, S8 k/ ^6 G' D
vi /etc/my.cnf  加入下列:! e3 {0 |: S0 ^# f6 D, F
[mysqld]
+ a" b3 [( p2 m( D
: A( v: N$ E. Acharacter-set-server=utf84 {7 x3 T( i* ]1 D. H. G
default_authentication_plugin=mysql_native_password' ^; V; I8 m: y$ S& s' z+ L

$ j4 ~7 a( I: i+ t2 U/ m& C1 H8 U[mysql]
1 B, X3 K& E1 Hdefault-character-set=utf8
$ r( S4 G3 Y3 R5 _/ S  _5 b# `4 x5 W2 q" A
[client]0 i3 ^: k6 z! I, w9 G
default-character-set=utf85 d$ T- K( V# u1 r. r* @8 q

7 u) C$ n8 @2 X/ q, u然後重啟mysqld* l$ s; c# @' A" P) C" A" M7 z
service mysqld restart
, p0 h; R7 ~3 Z$ X, w; r% D搞定!!9 g  o4 Y/ o( ]( U$ E+ b
2 w8 O' W4 ?$ ]4 }8 h, i
- R- ]( I9 M! K9 I





歡迎光臨 52AV手機A片王|52AV.ONE (https://www.52av.one/) Powered by Discuz! X3.2