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').2 s) J; `! ?, C0 S  ~
( P% p# O: \& d. S5 C
這是因為php 5.3以前舊版的密碼採16位編碼,而新版php 5.3以後採41位編碼,而mysql 5.2 以前預設也是16碼,所以才會造成此種錯誤., c; Y3 {4 I) l6 t  W. O' f
先診斷一下mysql: (我的php 5.6.38 , mysql 5.1.73)
% E7 ^9 w+ U# j' n6 v7 b登入mysql 然後輸入 :
3 }6 G6 _. Z( U/ T5 n: @& Umysql> SHOW VARIABLES LIKE 'old_passwords';$ a" ~" o" @2 l3 B
+------------------+-------+
! W" b7 k( p  S| Variable_name | Value |% }- i. l: A- _$ u
+------------------+-------+! i5 v1 r7 p* C
| old_passwords | ON   |
. g; o' x2 E* A# Q+------------------+-------+
: ?1 \- r2 E$ P, A1 row in set (0.00 sec)7 A3 d1 x8 ~0 e, D

5 l) c8 }+ W4 Q( _; g+ e, y4 ^old_password  ==> ON  就表示 /etc/my.cnf  裏的 old_passwords=1  設定為16碼,須將它設為 0 然後重啟mysqld ==> service mysqld restart
* q4 x  c* y# ]0 I  h, y或 在 mysql prompt下輸入:9 j7 \+ q1 J6 n
mysql> SET old_passwords=FALSE;  / w9 Q9 l/ L  f( F
檢查mysql.user內 每個密碼長度:8 `+ i9 ~3 D& s6 h, i  p. R
mysql> SELECT 'User', 'Host', Length('Password') FROM mysql.user;
8 }+ V' c5 A4 V- r: P; y) r& C如果還沒改成41位,Length('Password')這個欄位應該都是16或是0(表示沒設密碼)
9 W3 F* B% N: O9 V9 }
5 [- |1 o8 q2 U再重設原來的密碼:+ l( l1 T' f3 o$ G/ r
mysql> SET PASSWORD FOR 'root'@'192.168.1.1' = PASSWORD('原來的密碼');    // 小心要核對原來 帳號@IP 更改,不要改錯了2 _* }' x5 S! Q$ s, R% U
mysql> flush privileges;" ]- e- R: Q: ~# I) C

; R& U6 U& ], T! R再輸入 SELECT 'User', 'Host', Length('Password') FROM mysql.user; 檢查密碼度,就可發現剛剛改的root 的密碼長度已改為41碼  K  I! F8 V: O7 q3 o& ^0 O# _
注意:; Q  D( a5 c( `8 i6 C
如果帳號太多,可以遇到問題時再重設密碼,因為重設密碼 SET PASSWORD FOR 只針對個別密碼,不會因為 old_passwords=0 而對所有密碼造成影響
===========================================================================, B; O5 R5 O4 o2 s
當mysql升級到 8.0.21時,php連到mysql出現2行errors:5 D6 }) J/ x. `8 E  A
mysqli_real_connect(): Server sent charset (255) unknown to the client. Please, report to the developers
5 J0 ?$ l4 [. b* R$ Tmysqli_real_connect(): (HY000/2054): Server sent charset unknown to the client. Please, report to the developers6 ~$ ^" j8 e9 v# ?
原因:
, y# H/ b5 y# c" F, r9 L9 Z
在MySQL 8.0.21中,caching_sha2_password是默認的身份驗證插件,而不是以往的mysql_native_password。所以和php不相容。可以降級php,也可以修改MySQL的配置。 吾人決定修改MySQL的配置:4 k) `9 X- j* ?7 }+ l, v# q
vi /etc/my.cnf  加入下列:; P, u! d/ b( N2 h$ V$ w$ {  E
[mysqld]- b- O% f2 q6 G! [
5 Z& J! O' c( m5 L7 C$ h
character-set-server=utf8$ t5 f$ a; A% V( Y- _4 ?
default_authentication_plugin=mysql_native_password
' Q' s5 u6 e9 m4 g, K. d& \/ {8 y2 S6 d" e( t
[mysql]
; h* Q3 U: i6 ddefault-character-set=utf8
( \- b/ V! M  S6 U4 k
. c% D  j- ~) V7 j$ o  r/ l1 v[client]  R. [7 \( L* ^; B  z
default-character-set=utf8
* I5 {, u1 l2 }) ~% [* }6 s5 J- r; k+ r
然後重啟mysqld
5 H$ X) W! T0 A3 J3 k, rservice mysqld restart/ |1 a9 h9 q( B, s+ ~3 ]* h
搞定!!7 f6 B5 Q" J7 P6 J" X9 n% ~

* w+ C  K# i% U) M- l8 M- K- }5 b! l  B% G& v. S( }





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