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').
: U" e" z* Z; l& v) n1 Z
# r! p; ?) w3 `! f- e* L* x5 V
這是因為php 5.3以前舊版的密碼採16位編碼,而新版php 5.3以後採41位編碼,而mysql 5.2 以前預設也是16碼,所以才會造成此種錯誤.
0 R/ V% v. s4 d% A1 _% W) u
先診斷一下mysql: (我的php 5.6.38 , mysql 5.1.73)
7 }/ R: T7 e# [
登入mysql 然後輸入 :
4 A, g5 I( n8 c( @4 c
mysql> SHOW VARIABLES LIKE 'old_passwords';
! b0 v- ]0 T8 {
+------------------+-------+
. j3 ?" P1 o( e
| Variable_name | Value |
! C' H& D9 E! q- o8 C& S% B
+------------------+-------+
g0 S6 v, g( H! C( `
| old_passwords | ON |
2 p/ p. q9 C8 E* W
+------------------+-------+
; S% o8 V2 e+ h) U1 t+ a
1 row in set (0.00 sec)
' L N3 E& q9 ]6 Y
/ f0 g: E, j; N8 y! n: E5 d
old_password ==> ON 就表示 /etc/my.cnf 裏的 old_passwords=1 設定為16碼,須將它設為 0 然後重啟mysqld ==> service mysqld restart
) \: O M9 K' [1 |; ?
或 在 mysql prompt下輸入:
2 v: @! Z1 p$ e" r& q3 n- j: v( D# ?
mysql> SET old_passwords=FALSE;
9 o# B' o$ \7 F, F$ }
檢查mysql.user內 每個密碼長度:
" K/ C3 o+ ?1 o
mysql> SELECT 'User', 'Host', Length('Password') FROM mysql.user;
* Z6 a% \* h! _% u
如果還沒改成41位,Length('Password')這個欄位應該都是16或是0(表示沒設密碼)
9 j7 W) J8 t3 p
3 {- M/ M9 u8 e: N" z- Q
再重設原來的密碼:
0 E1 U# O4 ]5 a* S6 C4 k
mysql> SET PASSWORD FOR 'root'@'192.168.1.1' = PASSWORD('原來的密碼'); // 小心要核對原來 帳號@IP 更改,不要改錯了
/ F( W4 d+ C" N7 B
mysql> flush privileges;
1 |8 W# n) X& L: U, u
1 w( Q/ S" A( `4 @3 C
再輸入 SELECT 'User', 'Host', Length('Password') FROM mysql.user; 檢查密碼度,就可發現剛剛改的root 的密碼長度已改為41碼
/ P' I! x) @ ?( D$ e1 r
注意:
6 }; n0 M# B8 \' i. t2 e: d8 N
如果帳號太多,可以遇到問題時再重設密碼,因為重設密碼 SET PASSWORD FOR 只針對個別密碼,不會因為 old_passwords=0 而對所有密碼造成影響
===========================================================================
2 v6 l6 N$ g. {; @! o- @1 Z" x
當mysql升級到 8.0.21時,php連到mysql出現2行errors:
) n( c) \/ A9 D9 n
mysqli_real_connect(): Server sent charset (255) unknown to the client. Please, report to the developers
1 L7 d, |/ I% ~) k0 {0 A2 s7 r
mysqli_real_connect(): (HY000/2054): Server sent charset unknown to the client. Please, report to the developers
; _4 ^1 f" O! X
原因:
7 w) ^9 ]! w0 A
在MySQL 8.0.21中,caching_sha2_password是默認的身份驗證插件,而不是以往的mysql_native_password。所以和php不相容。可以降級php,也可以修改MySQL的配置。 吾人決定修改MySQL的配置:
, Q' P5 y. r5 K7 P+ J- K
vi /etc/my.cnf 加入下列:
2 ?8 `* |. r$ v o6 b0 \( f
[mysqld]
4 k7 |) t3 P7 M- @& V% D) b
4 I2 b/ B8 W5 L% ~
character-set-server=utf8
: k8 j* R5 k) O! u6 Z# Q
default_authentication_plugin=mysql_native_password
0 X$ r* \# J; u3 N! X* O& E% X
# @8 z% i3 P* T, C
[mysql]
6 V9 W. B2 ~ p( r# h
default-character-set=utf8
+ w5 {% V; J! u3 z5 o! O
& M" v) b2 p# o
[client]
7 v2 w$ d. r' u, T* C$ Q, o# f3 v6 Z
default-character-set=utf8
3 S. D4 [$ G, l8 k% K% f" [: U N
8 C! N9 U0 }1 J' w. Z8 U1 t) i7 e
然後重啟mysqld
' y7 L( P( j1 N3 @" z7 P$ e
service mysqld restart
# e" d% r/ S8 |4 P
搞定!!
5 ]" N' G P( K2 }2 C
, N% l! r R4 I- r* g' G
8 }9 ?) Z/ I8 e
歡迎光臨 52AV手機A片王|52AV.ONE (https://www.itech.casa/)
Powered by Discuz! X3.2