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 Z6 S5 y0 a0 d: F- v6 [) f1 Y
" k) E* j# z2 x0 F9 C& R這是因為php 5.3以前舊版的密碼採16位編碼,而新版php 5.3以後採41位編碼,而mysql 5.2 以前預設也是16碼,所以才會造成此種錯誤.' I; T( F, g. f
先診斷一下mysql: (我的php 5.6.38 , mysql 5.1.73)8 _3 ?/ v, Q8 U( R
登入mysql 然後輸入 : + S: e2 u2 K" r9 c/ M
mysql> SHOW VARIABLES LIKE 'old_passwords';3 I( `' {, D; m! j& n5 c( J
+------------------+-------+8 v7 A1 Z! f" [" A/ K' i
| Variable_name | Value |# X! o9 ?, v" `7 p
+------------------+-------+' t  X0 D8 f8 b# U& K
| old_passwords | ON   |
; b: C, P, \: g8 Q( B2 h+------------------+-------+
# S* Q- Q+ N6 ?% M1 row in set (0.00 sec)
2 q/ I4 c! K, [& Z, V
2 d7 B& }3 A1 c. W+ ~: Iold_password  ==> ON  就表示 /etc/my.cnf  裏的 old_passwords=1  設定為16碼,須將它設為 0 然後重啟mysqld ==> service mysqld restart7 X; ~* D+ w& {! N# j5 j
或 在 mysql prompt下輸入:* N7 s7 |; \/ l  q3 t: Z
mysql> SET old_passwords=FALSE;  6 ?8 Q& s4 C0 N& E. k
檢查mysql.user內 每個密碼長度:7 |9 b  o# M% a7 J6 h
mysql> SELECT 'User', 'Host', Length('Password') FROM mysql.user;
: E: ]/ \7 U' M4 Y& i" b如果還沒改成41位,Length('Password')這個欄位應該都是16或是0(表示沒設密碼) : v% @. H" I3 u2 C# ~
0 C9 p! Z. G# ?
再重設原來的密碼:
: _5 ~" n6 D) f6 y" Omysql> SET PASSWORD FOR 'root'@'192.168.1.1' = PASSWORD('原來的密碼');    // 小心要核對原來 帳號@IP 更改,不要改錯了
, O( d; v( c, Q9 x7 }# R/ U. @mysql> flush privileges;
* {2 r4 ?+ i0 A5 d. e( B1 V; }% o& M% w& l
再輸入 SELECT 'User', 'Host', Length('Password') FROM mysql.user; 檢查密碼度,就可發現剛剛改的root 的密碼長度已改為41碼
0 x& ~7 H3 K) w" M0 P注意:
: A# m$ ?; Y3 V) b) Y如果帳號太多,可以遇到問題時再重設密碼,因為重設密碼 SET PASSWORD FOR 只針對個別密碼,不會因為 old_passwords=0 而對所有密碼造成影響
===========================================================================
, e* h3 ]9 G6 f4 k" @當mysql升級到 8.0.21時,php連到mysql出現2行errors:
* n. _( {8 g5 y" g3 R2 z% k/ Rmysqli_real_connect(): Server sent charset (255) unknown to the client. Please, report to the developers# T( a+ q! t5 N- l1 w$ k' {
mysqli_real_connect(): (HY000/2054): Server sent charset unknown to the client. Please, report to the developers4 j  D$ d! L+ v- t' l/ @
原因:
# x: c6 z$ a. s1 ?
在MySQL 8.0.21中,caching_sha2_password是默認的身份驗證插件,而不是以往的mysql_native_password。所以和php不相容。可以降級php,也可以修改MySQL的配置。 吾人決定修改MySQL的配置:
/ q! i: {! a$ ]6 M2 cvi /etc/my.cnf  加入下列:
+ i9 S& w1 M6 e# M' ~! m/ o! Z[mysqld]& D" b! D. e3 x! V% |
3 o5 N! ~/ ]3 O1 v
character-set-server=utf8
/ s$ R% c: q; Kdefault_authentication_plugin=mysql_native_password4 Z  q6 e4 c8 L# `2 j4 w1 Q
# |, \2 ?* q& {1 l. B0 Z7 f6 j
[mysql]
' F! F0 ?6 _9 v# H2 |default-character-set=utf82 K0 a# V) S2 b2 s
8 m/ v7 z2 y/ J6 K* i& _
[client]. K% R0 W$ @6 o, ?/ M( J* @( g
default-character-set=utf8
( `& J. ~7 t( r0 @2 L0 E4 a* x
. b. Y0 N8 z% T; E2 D8 N; o然後重啟mysqld4 d  _* z% |" \- z" O& u% y1 m
service mysqld restart
5 Q8 L) {, z$ u' w4 L搞定!!
% e' o( f; ]% O

! \& @: q& t) z$ d4 Z$ }( ^  g, L8 ?1 `6 F





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