2009-08-27 4 views
21

어쩌면 여기서 간단하게 뭔가를 간과 한 것일 수도 있습니다. 그러나 이것을 알아낼 수는 없습니다.MySQL의 PHP 비 호환성

저는 로컬에서 WAMP를 실행 중이지만 원격 MySQL 데이터베이스에 연결하고 있습니다. PHP의 로컬 버전은 최신 5.3.0입니다.

원격 데이터베이스 중 하나 인 버전 5.0.45가 정상적으로 작동합니다. 그러나 연결하려고하는 다른 원격 데이터베이스 인 5.0.22 버전은 죽기 전에 다음 오류를 throw합니다.

경고 : mysql_connect() [function.mysql-connect] : OK 패킷 6 바이트 예상보다 짧다. PID = 5880에 ...

경고 :로 mysql_connect() [function.mysql-연결] mysqlnd 그 ...

WTF 이전 인증을 사용하여 4.1 MySQL로 연결할 수 있는가?

UPDATE :. 5.3.0보다 낮은 PHP 5.2로 되돌리기

* 즉 어떤 문제를 완전히 해결합니다. 5.3.0을 실행하지 않는 한 두 데이터베이스에 모두 연결할 수 있습니다. 나는이 이상한 것에 대한 설명이 무엇인지 모르겠다.

+0

mysqlnd는 5.2에 속하지 않습니다. 즉, php 5.2로 되돌아 왔으므로 다른 커넥터/lib를 사용 중입니다. – VolkerK

+0

그렇다면 5.3의 문제점은 그때까지 어떻게 되었을까요? – Evernoob

답변

41

사용중인 MySQL 계정에는 오래된 16 자의 긴 암호 (해시)가있을 수 있습니다.
HeidiSQL, MySQL 콘솔 클라이언트 또는 다른 클라이언트와 같은 MySQL 클라이언트와 mysql에 액세스 할 수있는 계정으로 테스트 할 수 있습니다. user 테이블. 암호 필드에 16 개의 문자가 포함되어 있으면 이전 암호이므로 mysqlnd을 사용하여 MySQL 서버에 연결할 수 없습니다. 서버가 use/create old passwords by default로 설정되어있는 경우
당신은 또한 확인해야합니다 :
당신은 dev_mysql_set_password

편집을 참조

SET PASSWORD FOR 'username'@'hostmask' = PASSWORD('thepassword') 

와 해당 사용자에 대한 새 암호를 설정할 수 있습니다.

EDIT2 :
는 5.0.22 서버 ("실패"의 하나)에서 쿼리

SELECT 
    Length(`Password`), 
    Substring(`Password`, 1, 1) 
FROM 
    `mysql`.`user` 
WHERE 
    `user`='username' 

을 실행하십시오. username을 mysql_connect()에서 사용중인 계정으로 대체하십시오.
무엇이 반환됩니까?

+0

두 인증이 동일하지 않으며 그 인증 시간이 길지 않습니다. – Evernoob

+0

"길이가 길지 않습니다"? 나는 일반 암호를 의미하지는 않지만 사용자 테이블에 저장된 해시 ;-) 이전 알고리즘은 16자를 사용했으며 새로운 ... uhm ... 40? – VolkerK

+0

그래 ... 아직 미안해. 이것은 나를 귀찮게하는 이상한 오류입니다. – Evernoob

1

내 웹 호스트에는 PHP/MySQL의 서로 다른 버전이 구성되어 있으며 특정 버전을 사용하고 있습니다. 올바른 .php 확장자를 사용해야합니다 .- 특히 .php5 간단 할 수도 있습니다.

+0

죄송합니다. 가서 두려워합니다. – Evernoob

4

데이터베이스 서버는 기본적으로 이전 암호를 사용하도록 설정되어 있습니다. 당신이 얻는 에러 메시지는 새로운 (더 안전한) 인증을 지원할 수 있지만 그렇게하는 것을 거부 할 수있는 데이터베이스를 보는 mysqlnd입니다. 이 경우 mysqlnd는 연결을 중단하고 작업을 거부합니다. 내에서 해당 설정을 주석 처리 한 후

있는지 확인 my.cnf 파일은

old-passwords = 1 

이 없습니다.CNF 그렇지 않으면 로그인 할 수 없습니다 설명 명령 VolkerK을 사용하여 비밀번호를-다시 설정해야합니다 (또는이 설정되어있을 수 있습니다 다른 어디에서 제거)하고 서버를 다시 시작합니다.

+0

내 my.ini에 ol-passwords = 1이 없으므로 이전 암호를 사용하지 않도록 데이터베이스 서버를 변경하는 방법 – Sid

+1

@sid : MySQL은 여러 구성 파일을로드 할 수 있으며 오래된 파일이 없는지 확인해야합니다 사용 가능한 암호. 또 다른 가능성은 전역 변수'old_passwords'가 1로 설정되어 있다는 것입니다. 확인하려면'SELECT @@ global.old_passwords; '를 실행하십시오. – Guss

7

내가 가진 이 문제에 대한 간단한 해결책을 찾고자했습니다. 이 방법을 시도해보십시오. 당신이 당신의 사용자에 OLD_PASSWORD를 사용했거나 MySQL의 이전 버전을 실행 되었기 때문에

SELECT Host, User, Password FROM mysql.user; 

암호가 여섯 자하면 MySQL의 형식에서,이입니다. 유형을 업데이트하려면

UPDATE mysql.user SET Password=PASSWORD('newpass') 
    WHERE User='root' AND Host='localhost'; 
FLUSH PRIVILEGES; 

사용자, 호스트 및 패스에 대한 로컬 호스트와 newpass를 각각 바꿉니다. 이제 다시 입력 할 때

SELECT Host, User, Password FROM mysql.user; 

비밀번호가 변경되었을 것입니다. 이것은 나를 위해 그것을 고정. 사용자 Evernoob 위

+1

가장 간단한 수정! 동일한 이전 암호 (Password = PASSWORD ('oldpass'))로 암호를 업데이트하는 것도 효과적입니다. – kehers

+1

서버가 디폴트로 16 글자 패스워드를 생성했다면, 여전히 이것을 고칠 수 있습니다 :'SELECT PASSWORD ('yourpass');'를 사용하여 로컬 머신에 41 문자 해시를 생성 한 다음, 인쇄 된 해시를 이것을 서버 컴퓨터에서 실행합니다 :'UPDATE mysql.user SET Password = 'yourhash'WHERE User = 'root'; FLUSH PRIVILEGES; – tanius

2

을 말했듯이 :

"PHP 5.2로 되돌리기 5.3.0보다 낮은 * 즉 아무것도 문제를 완전히 해결하는만큼 나는 모두에 연결할 수 있습니다 5.3.0을 실행하고 있지 않다으로.. 데이터베이스에 대한 설명이 무엇인지 모르겠습니다. "

oldpassword 옵션을 사용하는 공유 호스 (이 경우 DreamHost)에 연결하는 경우 사용자 테이블을 수정할 수 없습니다. . 이 제안 된 옵션은 공유 웹 호스팅이 아닌 다른 시나리오에서도 작동합니다. 참고로

, 우리는 WAMP를 실행하고 있습니다. PHP 5.2. * 되돌리기

1

트릭을했다! 고맙습니다!

당신 WAMP를 사용하는 경우가 ... 얻을> PHP> 버전> WAMP 클릭 왼쪽보다>

당신이 원하는 버전 및 다운로드를 선택합니다.

은> PHP> 버전> PHP 5.2 WAMP 클릭/설치

왼쪽 EXE 파일을 실행합니다. *이 문제를 해결

. "사용자가 'XXX'@ 'localhost'"오류로 명령을 거부하지 않고 이러한 SQL 명령을 실행할 수 없습니다. SU '루트'로 로그온하려고하는 좋은 모습. 어쩌면 개인용 서버에 있지만 실제 호스트에서 발생하지 않을 수 있습니다.

3

더 간단한 솔루션은 데이터베이스 사용자를 삭제하고 동일한 사용자 이름과 암호를 새로 만드는 것입니다.

+0

'ppa : ondrej/php' 파일을 업데이트하기로 결정했을 때 이런 일이 일어났습니다. 또한 apache2 서비스를 업데이트해야했습니다. 짧게 긴 이야기,이 MySQL 문제는 나에게 일어났다. 이 솔루션이 저에게 효과적이었으며 새로운 사용자를 생성하는 번거 로움을 겪지 않아도된다고 말하고 싶습니다. 간단하게 기존 사용자의 비밀번호를 업데이트해야했습니다. 나는 이것이 다른 누군가가 길을가는 데 도움이되기를 바랍니다. 간단한 솔루션을 이용해 주셔서 감사합니다. –

1

난 그냥 갑자기 작동을 중지하고이 오류가 표시되는 워드 프레스 사이트에이 문제를 가지고 있었다.

나는 나를 데이터베이스 사용자의 암호를 변경할 수 웹 사이트의 제어판에있는 GUI를 발견했다. 현재 암호로 변경하려고 시도했지만 현재 암호가 충분하지 않아이 작업이 허용되지 않았습니다.

나는 새로운, 강력한 암호로 데이터베이스 암호를 변경하고 새 암호를 가지고 내 WP-config.php 파일을 편집했다.

이것은 효과가 있습니다.

내 생각에 호스팅 제공 업체는 MySQL을 더 강력한 암호가 필요한 버전으로 업그레이드했습니다. 나를위한 해결책은 cpanel GUI를 사용하여 데이터베이스 사용자의 암호를 변경하고 wp-config.php를 일치하도록 업데이트하는 것이 었습니다.