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').
$ i) h6 U$ E2 w# N, P6 {
3 O0 E; v! H8 T# ~1 [
這是因為php 5.3以前舊版的密碼採16位編碼,而新版php 5.3以後採41位編碼,而mysql 5.2 以前預設也是16碼,所以才會造成此種錯誤.
7 O. O/ `/ z6 r" v R; k
先診斷一下mysql: (我的php 5.6.38 , mysql 5.1.73)
( ~5 _/ E* c3 f; k" Z& f
登入mysql 然後輸入 :
N R$ \: p R# y
mysql> SHOW VARIABLES LIKE 'old_passwords';
9 W, v$ i+ V" r; s# |% y, W
+------------------+-------+
7 V6 ^- `4 `) q& C/ d
| Variable_name | Value |
0 W5 a# B' {+ ~0 j
+------------------+-------+
6 \+ v( k: u0 F
| old_passwords | ON |
, }4 D$ f# k+ L6 ^6 P- h
+------------------+-------+
" |6 t' M1 ^3 {4 O7 H
1 row in set (0.00 sec)
; M8 C/ G% E1 K3 R s& J: U
9 U6 @/ L7 S( ?! l6 Z& R7 J2 S2 z& r
old_password ==> ON 就表示 /etc/my.cnf 裏的 old_passwords=1 設定為16碼,須將它設為 0 然後重啟mysqld ==> service mysqld restart
6 G- p0 U& P' E7 `: F, J
或 在 mysql prompt下輸入:
& O8 g) q+ H5 O& J( m
mysql> SET old_passwords=FALSE;
/ U' j6 _! Z8 } N5 ^& e1 l6 U
檢查mysql.user內 每個密碼長度:
1 W. n6 y: T0 u- T: ]) \
mysql> SELECT 'User', 'Host', Length('Password') FROM mysql.user;
w; X# }. t4 Q. f9 Q
如果還沒改成41位,Length('Password')這個欄位應該都是16或是0(表示沒設密碼)
~ y- p$ i) u: J/ u
: `4 X1 c: B# @' e+ ~$ O
再重設原來的密碼:
6 }$ v4 J) \4 v2 R- K' y# Q
mysql> SET PASSWORD FOR 'root'@'192.168.1.1' = PASSWORD('原來的密碼'); // 小心要核對原來 帳號@IP 更改,不要改錯了
0 c8 H }& {$ Z# ]- ^) }+ Z
mysql> flush privileges;
& G) v4 y+ e$ ?$ x) T
9 p6 S% g- }. F$ K$ z& H9 H
再輸入 SELECT 'User', 'Host', Length('Password') FROM mysql.user; 檢查密碼度,就可發現剛剛改的root 的密碼長度已改為41碼
) i2 w; z8 k. X7 a3 l
注意:
# f0 Y1 F& F+ C' u# F! O
如果帳號太多,可以遇到問題時再重設密碼,因為重設密碼 SET PASSWORD FOR 只針對個別密碼,不會因為 old_passwords=0 而對所有密碼造成影響
===========================================================================
2 x/ `) E& l: v0 J9 x' {2 F% Z
當mysql升級到 8.0.21時,php連到mysql出現2行errors:
/ g1 G; F8 |: y# A" T4 c, w
mysqli_real_connect(): Server sent charset (255) unknown to the client. Please, report to the developers
! T4 a# o2 l1 o$ U
mysqli_real_connect(): (HY000/2054): Server sent charset unknown to the client. Please, report to the developers
9 F6 e; z) O* @+ p; y
原因:
" p3 u$ W- L4 y# ?2 C' R. k
在MySQL 8.0.21中,caching_sha2_password是默認的身份驗證插件,而不是以往的mysql_native_password。所以和php不相容。可以降級php,也可以修改MySQL的配置。 吾人決定修改MySQL的配置:
5 j1 i0 v) `. ]# h' `6 m
vi /etc/my.cnf 加入下列:
3 V0 y$ E" \! l3 x" e7 N2 ]- ^2 A9 ^; M
[mysqld]
" j: K. T4 M w# C b! q
& n" Q1 a' ^! T! s
character-set-server=utf8
( w; a! y$ r& a* u4 q
default_authentication_plugin=mysql_native_password
7 R# Y* j& F! v; {# |5 e6 v
4 Z9 X' w+ ]" c
[mysql]
* G- w& N7 P* {! {8 u: v
default-character-set=utf8
: [2 E, m7 S. Q% w+ c1 P
: m. B7 R& ?* F. [; b
[client]
! Q, L9 x. T) A1 L$ o
default-character-set=utf8
+ k+ l6 [" T. h+ x( ?8 q
, R; L v3 w! J3 O
然後重啟mysqld
4 \# H& r' m: e( z3 `5 H' v* o
service mysqld restart
0 n6 E j% }8 z+ x" [0 G8 W( J
搞定!!
* `& k p6 i; f
; G1 L h7 f) |+ X
9 o3 i* U9 |/ S" \. X+ s" _
歡迎光臨 52AV手機A片王|52AV.ONE (https://nhkie.com/)
Powered by Discuz! X3.2