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').
- d" Z2 R9 W/ v. b; d
& i/ e! `1 V' K
這是因為php 5.3以前舊版的密碼採16位編碼,而新版php 5.3以後採41位編碼,而mysql 5.2 以前預設也是16碼,所以才會造成此種錯誤.
5 u- j, v: M$ W0 B0 D/ P' [
先診斷一下mysql: (我的php 5.6.38 , mysql 5.1.73)
/ D7 Q/ F# L! N6 J
登入mysql 然後輸入 :
$ o7 v$ }, w) K) N+ o
mysql> SHOW VARIABLES LIKE 'old_passwords';
% f7 f; ]5 x& m' A, A& s1 d# N
+------------------+-------+
1 v8 L# @- ?( s# N! ]/ e$ _8 U7 T6 ]; w
| Variable_name | Value |
3 A/ M. w( V9 o! H9 Y
+------------------+-------+
# u' M P! t/ w) c6 y* `6 E
| old_passwords | ON |
; J$ ^# u% F! i$ E4 E7 K: j+ T
+------------------+-------+
. |0 o1 M& P$ Q3 d1 S5 O
1 row in set (0.00 sec)
5 l1 {9 o- \' Z
4 H) o. @; u1 ^# ^5 [
old_password ==> ON 就表示 /etc/my.cnf 裏的 old_passwords=1 設定為16碼,須將它設為 0 然後重啟mysqld ==> service mysqld restart
6 \ H$ E7 i: K0 n ^8 C
或 在 mysql prompt下輸入:
/ ~: r7 R) T4 Q
mysql> SET old_passwords=FALSE;
6 a5 t' Q5 B) S9 S- Y
檢查mysql.user內 每個密碼長度:
; V2 u5 q7 T2 \9 G3 }! i% o5 ~
mysql> SELECT 'User', 'Host', Length('Password') FROM mysql.user;
7 @' m3 s. d) L o K
如果還沒改成41位,Length('Password')這個欄位應該都是16或是0(表示沒設密碼)
7 k# x6 i& b' {0 R; l* [5 r+ l* q
/ A' \% t8 F# a; E* [% P6 }) s$ Z
再重設原來的密碼:
2 \! ~6 N0 C+ W0 v6 T+ l/ f
mysql> SET PASSWORD FOR 'root'@'192.168.1.1' = PASSWORD('原來的密碼'); // 小心要核對原來 帳號@IP 更改,不要改錯了
) Z+ G# B6 f5 N) K+ X
mysql> flush privileges;
& T! w/ n- g5 b2 S+ L, _
/ a1 r0 N9 s/ A! v
再輸入 SELECT 'User', 'Host', Length('Password') FROM mysql.user; 檢查密碼度,就可發現剛剛改的root 的密碼長度已改為41碼
9 `3 T3 g3 [7 W/ _0 R% O5 V8 }
注意:
& v2 n. t# E) ^# X* y: a' C% N
如果帳號太多,可以遇到問題時再重設密碼,因為重設密碼 SET PASSWORD FOR 只針對個別密碼,不會因為 old_passwords=0 而對所有密碼造成影響
===========================================================================
' O4 S/ X+ R, c+ Z7 C% r* V2 H
當mysql升級到 8.0.21時,php連到mysql出現2行errors:
% G2 |( M- d6 a1 a: q" t6 x, V
mysqli_real_connect(): Server sent charset (255) unknown to the client. Please, report to the developers
, N% @1 Q1 c, A( h s, W- z" `5 H' \
mysqli_real_connect(): (HY000/2054): Server sent charset unknown to the client. Please, report to the developers
4 f+ I0 k3 Q: l
原因:
6 T _( i5 }, p2 u
在MySQL 8.0.21中,caching_sha2_password是默認的身份驗證插件,而不是以往的mysql_native_password。所以和php不相容。可以降級php,也可以修改MySQL的配置。 吾人決定修改MySQL的配置:
- }" p, S8 k/ ^6 G' D
vi /etc/my.cnf 加入下列:
! e3 {0 |: S0 ^# f6 D, F
[mysqld]
+ a" b3 [( p2 m( D
: A( v: N$ E. A
character-set-server=utf8
4 {7 x3 T( i* ]1 D. H. G
default_authentication_plugin=mysql_native_password
' ^; V; I8 m: y$ S& s' z+ L
$ j4 ~7 a( I: i+ t2 U/ m& C1 H8 U
[mysql]
1 B, X3 K& E1 H
default-character-set=utf8
$ r( S4 G3 Y3 R5 _
/ S _5 b# `4 x5 W2 q" A
[client]
0 i3 ^: k6 z! I, w9 G
default-character-set=utf8
5 d$ T- K( V# u1 r. r* @8 q
7 u) C$ n8 @2 X/ q, u
然後重啟mysqld
* l$ s; c# @' A" P) C" A" M7 z
service mysqld restart
, p0 h; R7 ~3 Z$ X, w; r% D
搞定!!
9 g o4 Y/ o( ]( U$ E+ b
2 w8 O' W4 ?$ ]4 }8 h, i
- R- ]( I9 M! K9 I
歡迎光臨 52AV手機A片王|52AV.ONE (https://www.52av.one/)
Powered by Discuz! X3.2