MySQL PHP uyumsuzluğu

7 Cevap php

Tamam belki ben burada gerçekten çok basit bir şey unutuyorsun, ama ben bu anlamaya görünüyor olamaz.

Ben yerel WAMP çalışan, ama uzak bir MySQL veritabanı bağlıyorum. PHP yerel versiyonu son 5.3.0 olduğunu.

Uzak veritabanlarına biri, sürüm 5.0.45 olmak çalışıyor. Ancak, sürüm 5.0.22 I bağlanmaya çalışıyorum diğer uzak veritabanı, ölmeden önce aşağıdaki hata atıyor:

Uyarı: mysql_connect () [function.mysql-connect]: beklenenden daha OK paket 6 bayt daha kısa. PID = 5.880 in ...

Uyarı: mysql_connect () [function.mysql-connect]: mysqlnd eski kimlik doğrulaması kullanarak + MySQL 4.1 bağlanamıyor ...

WTF?

GÜNCELLEME:

PHP 5.2 dönülüyor. * 5.3.0 yani daha düşük bir şey tamamen sorunu giderir. Sürece Ben 5.3.0 çalışan değilim gibi ben de veritabanlarına bağlanabilirsiniz. Ben açıklama bu garabeti için ne olduğundan emin değilim.

7 Cevap

The MySQL account you're using probably has an old 16 character long password (hash).
You can test that with a MySQL client (like HeidiSQL, the MySQL console client or any other client) and an account that has access to the mysql.user table. If the Password field contains 16 chars it's an old password and mysqlnd cannot use it to connect to the MySQL server.
You can set a new password for that user with

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

bkz dev_mysql_set_password

edit:
You should also check if the server is set to use/create old passwords by default.

edit2:
Please run the query

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

on the 5.0.22 server (the one that's "failing"). Replace username by the account you're using in mysql_connect().
What does that return?

Sizin veritabanı sunucusu, varsayılan olarak eski şifreleri kullanmak için ayarlanır. Alacağınız hata iletisi mysqlnd yeni (güvenli) kimlik doğrulamasını destekleyen bir veritabanı görmeye ama bunu yapmak istemiyor. Böyle bir durumda, mysqlnd bağlantıyı terkeder ve çalışmak reddediyor.

Emin my.cnf sahip olmadığından emin olun

old-passwords = 1

Eğer açıklama bundan sonra my.cnf ayarı (ya da ayarlanmış olabilir başka nerede kaldırmak), aksi takdirde mümkün olmayacaktır, komut VolkerK açıklar kullanarak şifrenizi yeniden ayarlamak için emin olun, ve sunucuyu yeniden başlatın oturum

Ben bu sorun için basit bir düzeltme bulmak için çalışıyorlar. Bu yaklaşım deneyin. MySQL tipinde

SELECT Host, User, Password FROM mysql.user;

Şifrenizi onaltı karakter eğer kullanıcının üzerinde old_password kullanmış veya MySQL eski bir sürümünü çalıştıran olmuştur, çünkü bu. In türünü güncellemek için

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

Kullanıcı, ev sahibi için kök, localhost ve Newpass takas ve sırasıyla geçmektedir. Şimdi yeniden yazın

SELECT Host, User, Password FROM mysql.user;

Parolanız değişmiş olmalıdır. Bu benim için sabit.

Benim host yapılandırılmış PHP / MySQL farklı sürümleri vardır ve ben doğru php uzantısı kullanmak gerekir belli birini kullanmak -. Özellikle php5 Bu kadar basit bir şey olabilir..

Kullanıcı olarak Evernoob yukarıda söyledi:

"Reverting to PHP 5.2.* i.e. anything lower than 5.3.0 resolves the problem completely. As long as I am not running 5.3.0 I can connect to both databases. I'm not sure what the explanation is for this weirdness"

Eskisifre seçeneğini kullanarak (bizim durumumuzda DreamHost içinde) ortak bir hortum, bağlanma durumunda, biz kullanıcıların tabloyu değiştirmek olamazdı. Bu önerilen seçenekler değil sadece paylaşılan web hosting ile, diğer senaryolarda çalışacaktır.

Notun, biz WAMP yayınlanıyor.

PHP 5.2 dönülüyor. * Yoktu hile! TEŞEKKÜR EDERİZ!

Eğer WAMP kullanıyorsanız ... wamp sol tıklayın> php> sürümü> daha fazla olsun>

İstediğiniz sürümü ve indirme seçeneğini seçin.

install / exe çalıştırmak

Sol wamp tıklayın> php> sürüm> PHP 5.2. *

İşte bu sorunu düzeltildi. Ben almadan Bu SQL komutları herhangi koşmak olamazdı "kullanıcı 'XXX' inkar komutu @ 'localhost'" hata. İyi görünüm SU 'Kök' olarak oturum çalışıyor. Belki kişisel bir sunucu üzerinde, ama gerçek bir ev üzerinde olmayacak.

Daha basit bir çözüm veritabanı kullanıcı silmek ve aynı kullanıcı adı ve şifre ile yeni bir tane oluşturmak için.