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').
5 v( X2 l6 z. ?8 ?6 l
8 [; M* m3 A" G7 o0 q# o
這是因為php 5.3以前舊版的密碼採16位編碼,而新版php 5.3以後採41位編碼,而mysql 5.2 以前預設也是16碼,所以才會造成此種錯誤.
# g+ T; @$ ~* @4 {6 {
先診斷一下mysql: (我的php 5.6.38 , mysql 5.1.73)
* f V8 V# w, p0 L6 v
登入mysql 然後輸入 :
; e/ l8 V q& ?' P) I7 o! }+ F
mysql> SHOW VARIABLES LIKE 'old_passwords';
" H: z, f; b& P7 [! k) d/ E; _( B) h
+------------------+-------+
U2 ^7 J7 F$ E' T
| Variable_name | Value |
7 [4 B8 E# @2 z% j' H7 n
+------------------+-------+
8 ~ t; u! W3 E% N, i" }5 g; D
| old_passwords | ON |
& M. @ \! R0 @7 I: P3 d& V% \0 H* R
+------------------+-------+
6 c5 M$ t4 @9 u- l
1 row in set (0.00 sec)
- P& s! _& Y3 k) p& d J3 X M- |0 i
6 h) m! G$ Y( b0 {6 G( k
old_password ==> ON 就表示 /etc/my.cnf 裏的 old_passwords=1 設定為16碼,須將它設為 0 然後重啟mysqld ==> service mysqld restart
@+ A* K* E) ?9 D" `* R$ j
或 在 mysql prompt下輸入:
; a* A$ _' e4 E9 @3 e0 E
mysql> SET old_passwords=FALSE;
: L9 T9 I- z' \- F
檢查mysql.user內 每個密碼長度:
; [) _ ], \2 b' D. n' i
mysql> SELECT 'User', 'Host', Length('Password') FROM mysql.user;
% B( `1 ~5 V9 }5 k
如果還沒改成41位,Length('Password')這個欄位應該都是16或是0(表示沒設密碼)
1 U8 S) |6 C P' X4 ]3 N
7 g- w/ }9 s2 {/ C* D! R
再重設原來的密碼:
: R4 N9 ]' `% q4 h4 `& D- P( X
mysql> SET PASSWORD FOR 'root'@'192.168.1.1' = PASSWORD('原來的密碼'); // 小心要核對原來 帳號@IP 更改,不要改錯了
/ N' M& j/ R& f$ a% ?. B0 Z
mysql> flush privileges;
4 j- d G( H: ?: ?* ?
, u& H$ z; {) {2 L) |* ^: z
再輸入 SELECT 'User', 'Host', Length('Password') FROM mysql.user; 檢查密碼度,就可發現剛剛改的root 的密碼長度已改為41碼
/ s3 W" x5 e% |& V5 N4 v
注意:
6 ^4 Q" J0 x# |" r- Y. Q1 i
如果帳號太多,可以遇到問題時再重設密碼,因為重設密碼 SET PASSWORD FOR 只針對個別密碼,不會因為 old_passwords=0 而對所有密碼造成影響
===========================================================================
6 v4 C1 X$ Q- y3 K! z) q
當mysql升級到 8.0.21時,php連到mysql出現2行errors:
2 F) F6 T$ C3 `
mysqli_real_connect(): Server sent charset (255) unknown to the client. Please, report to the developers
; q: Z' ]* u4 ^* {5 t6 r
mysqli_real_connect(): (HY000/2054): Server sent charset unknown to the client. Please, report to the developers
0 [* l- b2 J( n k
原因:
' Z! g6 X' T- g7 u
在MySQL 8.0.21中,caching_sha2_password是默認的身份驗證插件,而不是以往的mysql_native_password。所以和php不相容。可以降級php,也可以修改MySQL的配置。 吾人決定修改MySQL的配置:
4 K+ Y, e; k( J4 C0 ^
vi /etc/my.cnf 加入下列:
9 e0 L3 P7 u, j+ U, `! b8 W2 h
[mysqld]
0 U+ E' x: \4 a ~ c6 k. j1 |
6 j/ M5 g! A2 m5 e% i. e, c
character-set-server=utf8
8 F2 S& P0 A; e6 V+ I, J( A
default_authentication_plugin=mysql_native_password
Q, y- l4 K1 X* o4 F8 S
4 V" r7 v/ F! R5 T
[mysql]
( K* t/ S" H9 d7 E2 A* B
default-character-set=utf8
$ f9 t! Z" L% r9 C
& Z* A* {' C7 `: c# m
[client]
# `3 @: `+ \" m% u4 ?/ |9 c: t
default-character-set=utf8
h' [, q( j. w, c' H
8 g4 m( I7 I3 l# {
然後重啟mysqld
6 D" Q. Z& ]( P0 f: d1 r; }
service mysqld restart
6 L: h5 K# `: k$ m2 v/ }
搞定!!
8 Z0 ?# n7 X& C
9 g! I4 e( N# J' H* b8 Q( W3 o
8 G5 Z7 C( a4 R% p
歡迎光臨 52AV手機A片王|52AV.ONE (https://www.52av.one/)
Powered by Discuz! X3.2