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').
. a, Y* t4 T' [8 t# |
9 W4 ^4 G) Z1 r
這是因為php 5.3以前舊版的密碼採16位編碼,而新版php 5.3以後採41位編碼,而mysql 5.2 以前預設也是16碼,所以才會造成此種錯誤.
2 E4 B0 j/ G) f+ Q1 ?9 m
先診斷一下mysql: (我的php 5.6.38 , mysql 5.1.73)
% U, J: h" H4 z7 C9 T4 |* ]
登入mysql 然後輸入 :
) I" e1 V" V$ q3 U& m
mysql> SHOW VARIABLES LIKE 'old_passwords';
. t! {9 C- e0 z( l% u P7 m, y
+------------------+-------+
$ C! {& B) m5 W% w& `/ v0 p
| Variable_name | Value |
6 [ z6 f( l* A
+------------------+-------+
+ e" f( y- _4 w
| old_passwords | ON |
0 I( [5 S2 B$ Y3 i; K9 r
+------------------+-------+
3 J( F1 B W/ N# h W9 ?6 B- a5 g
1 row in set (0.00 sec)
- A. K. z# w) r6 j( H# e/ q6 G
# ]# p) Q8 L* o2 h
old_password ==> ON 就表示 /etc/my.cnf 裏的 old_passwords=1 設定為16碼,須將它設為 0 然後重啟mysqld ==> service mysqld restart
! ^6 t) c( h* d5 [/ @: O
或 在 mysql prompt下輸入:
7 J; z& A* [/ f0 D
mysql> SET old_passwords=FALSE;
' \! p8 \$ @' t/ i7 X
檢查mysql.user內 每個密碼長度:
( F9 j! N1 D' [4 p
mysql> SELECT 'User', 'Host', Length('Password') FROM mysql.user;
9 s, u2 ~ ~' D( a7 R6 Q* L
如果還沒改成41位,Length('Password')這個欄位應該都是16或是0(表示沒設密碼)
, X1 s8 B3 p- b+ g2 \1 }2 f+ W
" b! I; P% Z6 u
再重設原來的密碼:
, y% ~0 s( P- W+ n0 C. M
mysql> SET PASSWORD FOR 'root'@'192.168.1.1' = PASSWORD('原來的密碼'); // 小心要核對原來 帳號@IP 更改,不要改錯了
% B# Z4 i- _& r9 p* \
mysql> flush privileges;
' {% {% A% e, u0 [0 b B( R
& E2 |( G' A7 ^8 e% v
再輸入 SELECT 'User', 'Host', Length('Password') FROM mysql.user; 檢查密碼度,就可發現剛剛改的root 的密碼長度已改為41碼
0 `: F3 H% T) m, Z6 `
注意:
- y# Y9 c5 l+ A' _0 Y
如果帳號太多,可以遇到問題時再重設密碼,因為重設密碼 SET PASSWORD FOR 只針對個別密碼,不會因為 old_passwords=0 而對所有密碼造成影響
===========================================================================
5 j- l6 R3 ^, h7 r
當mysql升級到 8.0.21時,php連到mysql出現2行errors:
/ P' R/ t% r: Q
mysqli_real_connect(): Server sent charset (255) unknown to the client. Please, report to the developers
+ G& l& O& v7 z; o: R
mysqli_real_connect(): (HY000/2054): Server sent charset unknown to the client. Please, report to the developers
; q! `7 |8 R) T; ]- T& \
原因:
5 j2 e; s# F% S" L
在MySQL 8.0.21中,caching_sha2_password是默認的身份驗證插件,而不是以往的mysql_native_password。所以和php不相容。可以降級php,也可以修改MySQL的配置。 吾人決定修改MySQL的配置:
6 Q' m' r& Y6 h
vi /etc/my.cnf 加入下列:
4 H. a% u" I7 T7 `4 V
[mysqld]
X# I- G& m7 B3 [! ^
+ l; t! \7 B. `. K( F& ]
character-set-server=utf8
7 T. B8 m6 a5 T3 W+ ]. X
default_authentication_plugin=mysql_native_password
! o" {% n7 D0 ]" p6 B4 H
; v2 \+ s8 `) z
[mysql]
2 ]: A: C0 P$ T* m" d7 N
default-character-set=utf8
- R+ _8 `5 S( X% ^+ l2 ~. L5 s; W
' Y& h1 a' X9 {7 I0 @' ~
[client]
) v% Q& A, o w$ t
default-character-set=utf8
/ x+ o' ]7 ~4 Z- L- p. @! N* B. t% O, Z* S
$ k) ` [2 {' d! Y9 f: i( Z
然後重啟mysqld
9 }, J2 M3 U* a) S" _2 ~8 E
service mysqld restart
; K$ U( u" i2 \4 U
搞定!!
* |2 Y' v* ]# q
* d8 a' e" R7 H, D
: H( D) J* I5 C' F
歡迎光臨 52AV手機A片王|52AV.ONE (https://www.itech.casa/)
Powered by Discuz! X3.2