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')., y: x4 s% Z' |& {1 {

- o+ Y; @4 K& `8 F& s& c2 a; S& M這是因為php 5.3以前舊版的密碼採16位編碼,而新版php 5.3以後採41位編碼,而mysql 5.2 以前預設也是16碼,所以才會造成此種錯誤.) i# D2 D. J% A1 p6 H3 U) h
先診斷一下mysql: (我的php 5.6.38 , mysql 5.1.73)
3 V& }: t& g6 k登入mysql 然後輸入 :
, S! t4 V# ?6 a+ Bmysql> SHOW VARIABLES LIKE 'old_passwords';- V2 x! U& S7 K: P# b
+------------------+-------+
8 j" Q  o: s, Y" `2 w; B+ U| Variable_name | Value |
/ x6 z7 Q* r1 X5 {+------------------+-------+" G  G9 O1 F0 d, V. H9 A) T% A
| old_passwords | ON   |( L6 D1 g) Z. T( I) r
+------------------+-------+* S. e" z, ?( l1 o- B* R2 V
1 row in set (0.00 sec)
* L; x0 d) k7 B& _4 n$ o
8 l6 b3 _  @% H) X' j. h# y9 r4 ?) n* zold_password  ==> ON  就表示 /etc/my.cnf  裏的 old_passwords=1  設定為16碼,須將它設為 0 然後重啟mysqld ==> service mysqld restart6 q0 S7 h% n0 V* Y& A
或 在 mysql prompt下輸入:8 U8 B8 y7 q- c  D! S
mysql> SET old_passwords=FALSE;  8 s( e  K- ?( T0 E1 R1 t% ?$ C) i* |
檢查mysql.user內 每個密碼長度:
* K0 z" E$ Y. @  _/ hmysql> SELECT 'User', 'Host', Length('Password') FROM mysql.user;# B/ h- r) e1 k, A5 O" c
如果還沒改成41位,Length('Password')這個欄位應該都是16或是0(表示沒設密碼) 8 u" o9 I0 u' K% @9 _

. [$ R, `8 w1 u, P, d, {( C! M再重設原來的密碼:0 a6 ^- E. F' M
mysql> SET PASSWORD FOR 'root'@'192.168.1.1' = PASSWORD('原來的密碼');    // 小心要核對原來 帳號@IP 更改,不要改錯了5 v9 G8 _8 M; C3 N
mysql> flush privileges;
4 b2 X* C7 b& |; ^7 o! {' s1 @* e/ Q$ N" M: Q/ S6 P
再輸入 SELECT 'User', 'Host', Length('Password') FROM mysql.user; 檢查密碼度,就可發現剛剛改的root 的密碼長度已改為41碼) U8 J5 R+ V7 M6 ]) a' l  A- e. A
注意:: n7 O6 q: \- k. c2 a* N; ]% C
如果帳號太多,可以遇到問題時再重設密碼,因為重設密碼 SET PASSWORD FOR 只針對個別密碼,不會因為 old_passwords=0 而對所有密碼造成影響
===========================================================================0 c& U7 G7 q2 C/ M
當mysql升級到 8.0.21時,php連到mysql出現2行errors:) y' R4 J8 X! {6 f+ H3 g. S, u
mysqli_real_connect(): Server sent charset (255) unknown to the client. Please, report to the developers- w9 C+ x4 M, r0 C6 W. h6 F) I/ r
mysqli_real_connect(): (HY000/2054): Server sent charset unknown to the client. Please, report to the developers
. E6 k# f! @0 v, L' v7 ?( J原因:
, l, q* {0 Z- u
在MySQL 8.0.21中,caching_sha2_password是默認的身份驗證插件,而不是以往的mysql_native_password。所以和php不相容。可以降級php,也可以修改MySQL的配置。 吾人決定修改MySQL的配置:5 z5 I( T" s" G3 ]( S0 r5 a9 f
vi /etc/my.cnf  加入下列:
  b- F- L9 }2 L$ [0 h[mysqld]
: ^% X- R7 f9 z! }$ A4 O% O6 {, h9 i, k
character-set-server=utf85 ?1 x9 v+ j8 G  K3 d. Q: f; E
default_authentication_plugin=mysql_native_password; u& N$ G& G! A9 R, `& R9 E
- c: r$ X- D8 e# R6 @* P( F
[mysql]3 q4 C3 n* t( i
default-character-set=utf8
( d; `* w: Y/ i! }" ~0 V: V6 L; I5 @( K0 R% G% N
[client]; |+ q$ m3 S0 U' u1 ^
default-character-set=utf8
$ L: R' B. \: f$ w8 J$ g0 v9 }' R9 I  }, X
然後重啟mysqld. p5 u! ?/ s9 Z. ?. Z
service mysqld restart5 H  i; _0 @7 Z2 r9 k
搞定!!; S3 O6 f' j0 u2 A% l
, \; f' _" v2 d4 T5 J, f

8 O3 c, f2 A, p  k




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