2009-08-27 20 views
21

Ok forse ho trascurato qualcosa di molto semplice qui, ma non riesco a capirlo.incompatibilità MySQL PHP

Sto eseguendo WAMP localmente, ma connettendo a un database MySQL remoto. La versione locale di PHP è l'ultima versione 5.3.0.

Uno dei database remoti, essendo la versione 5.0.45, funziona correttamente. Tuttavia, l'altro database remoto che sto cercando di connettersi, che è la versione 5.0.22 getta il seguente errore prima di morire:

Warning: mysql_connect() [function.mysql-Connect]: pacchetto OK 6 byte più corto del previsto PID = 5880 in ...

Warning: mysql_connect() [function.mysql-connect]: mysqlnd non può connettersi a MySQL 4.1+ utilizzando l'autenticazione vecchia in ...

WTF?

UPDATE:.

Tornando a PHP 5.2 * vale a dire qualcosa di inferiore a 5.3.0 risolve completamente il problema. Finché non eseguo la versione 5.3.0, posso collegarmi a entrambi i database. Non sono sicuro di quale sia la spiegazione per questa stranezza.

+0

mysqlnd non fa parte di 5.2, cioè stai utilizzando un altro connettore/lib ora che hai ripristinato il php 5.2. – VolkerK

+0

quindi quale sarebbe stato il problema con 5.3 probabilmente? – Evernoob

risposta

41

L'account MySQL che si sta utilizzando ha probabilmente una vecchia password di 16 caratteri (hash).
È possibile testarlo con un client MySQL (come HeidiSQL, il client della console MySQL o qualsiasi altro client) e un account che abbia accesso allo mysql. user tabella. Se il campo Password contiene 16 caratteri, è una vecchia password e mysqlnd non può utilizzarlo per connettersi al server MySQL.
È possibile impostare una nuova password per l'utente con

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

vedere dev_mysql_set_password

edit:
si dovrebbe anche verificare se il server è impostato su use/create old passwords by default.

EDIT2:
Si prega di eseguire la query

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

sul server 5.0.22 (quello che è "failing"). Sostituisci username con l'account che stai utilizzando in mysql_connect().
Cosa restituisce?

+0

no entrambe le autenticazioni sono uguali e non così lunghe. – Evernoob

+0

"non così lungo"? Non intendo la semplice password ma l'hash memorizzato nella tabella utente ;-) Il vecchio algoritmo usato 16 caratteri, il nuovo ... uhm ... 40? – VolkerK

+0

sì ... ancora non funziona scusa. Questo è un errore strano mi sta annoiando. – Evernoob

1

Il mio webhost ha diverse versioni di PHP/MySQL configurate e per usare una determinata ho bisogno di usare l'estensione .php corretta - in particolare .php5 Potrebbe essere qualcosa di così semplice.

+0

Mi spiace non andare, ho paura. – Evernoob

4

Il server di database è impostato per utilizzare le password precedenti per impostazione predefinita. Il messaggio di errore che ottieni è mysqlnd vedere un database in grado di supportare la nuova (più sicura) autenticazione ma si rifiuta di farlo. In tal caso, mysqlnd interrompe la connessione e si rifiuta di lavorare.

Assicurati che il tuo my.cnf non ha

old-passwords = 1 

Dopo di commentare che l'impostazione dal mio.cnf (o rimuoverlo da dove altro potrebbe essere impostato), e riavviare il server, assicurati di reimpostare la password usando il comando VolkerK, altrimenti non sarai in grado di accedere.

+0

Non ho ol-password = 1 nel mio my.ini, quindi come faccio a cambiare il server del database per non usare le vecchie password – Sid

+1

@sid: MySQL può caricare più file di configurazione, e devi assicurarti che nessuno di loro abbia vecchi password abilitate. Un'altra possibilità è che la variabile globale 'old_passwords' sia impostata su 1. Per controllare, eseguire' SELECT @@ global.old_passwords; ' – Guss

7

Ho stato cercando di trovare una soluzione semplice per questo problema. Prova questo approccio. In MySQL tipo

SELECT Host, User, Password FROM mysql.user; 

Se la password è caratteri sedici, questo è perché si è utilizzato OLD_PASSWORD sul vostro utente del o sono stati in esecuzione una vecchia versione di MySQL. Per aggiornare digitare

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

scambiando root, localhost e newpass per l'utente, host e pass rispettivamente. Ora quando si ri-digitare

SELECT Host, User, Password FROM mysql.user; 

La tua password deve essere cambiata. Questo l'ha risolto per me.

+1

Correzione più semplice! L'aggiornamento della password alla stessa vecchia password (Password = PASSWORD ('oldpass')) funziona bene però. – kehers

+1

Se il server crea ancora password di 16 caratteri per impostazione predefinita, è possibile risolvere il problema ancora: creare l'hash di 41 caratteri sul computer locale con 'SELEZIONA PASSWORD ('yourpass');', quindi copiare l'hash stampato in un comando come questo ed eseguirlo sul server: 'UPDATE mysql.user SET Password = 'yourhash' WHERE User = 'root'; FLUSH PRIVILEGES; '. – tanius

2

Come l'Evernoob utente di cui sopra, ha detto:

"Tornando a PHP 5.2 * vale a dire qualcosa di inferiore a 5.3.0 risolve completamente il problema Finché io non sono in esecuzione 5.3.0 posso collegarmi ad entrambi.. database. Non sono sicuro di quale sia la spiegazione per questa stranezza "

In caso di connessione a un tubo condiviso (nel nostro caso DreamHost), che utilizza l'opzione oldpassword, non è stato possibile modificare la tabella degli utenti . Queste opzioni suggerite funzioneranno in altri scenari, non solo con l'hosting web condiviso.

Di nota, stiamo eseguendo WAMP.

1

Indietro a PHP 5.2. * Ha fatto il trucco! GRAZIE!

Se stai usando WAMP ... click sinistro WAMP> php> versione> ottenere più>

selezionare la versione che si desidera e il download.

installare/eseguire il file EXE

click sinistro WAMP> php> versione> PHP 5.2. *

Che ha risolto questo problema. Non ho potuto eseguire nessuno di questi comandi SQL senza ottenere un errore "comando negato all'utente" XXX "@" localhost "". Buon aspetto cercando di accedere come SU 'Root'. Forse su un server personale, ma non succederà su un vero host.

3

Una soluzione più semplice è quella di eliminare l'utente del database e crearne uno nuovo con lo stesso nome utente e password.

+0

Questo è successo a me quando ho deciso di aggiornare il mio 'ppa: ondrej/php'. Ho anche dovuto aggiornare il mio servizio Apache2. Per farla breve, mi è successo questo problema mysql. Volevo solo dire che questa soluzione ha funzionato per me, e non avevo nemmeno bisogno di passare attraverso il fastidio di creare un nuovo utente. Dovevo semplicemente aggiornare la password del mio utente esistente. Spero che questo aiuti qualcun altro lungo la strada. Grazie per la vostra soluzione breve e funzionante. –

1

Ho appena avuto questo problema con un sito Wordpress che ha smesso improvvisamente di funzionare e ha visualizzato questo errore.

Ho trovato una GUI nel pannello di controllo del sito Web che mi ha permesso di cambiare la password per l'utente del database. Ho provato a cambiarlo con la password corrente e questo non era permesso perché la password corrente non era abbastanza forte.

Ho cambiato la password del database in una nuova password più potente e ho modificato il file wp-config.php per avere la nuova password.

Ha funzionato!

Quindi la mia ipotesi è che il provider di hosting ha aggiornato qualcosa, forse MySQL, a una versione che richiede password più potenti. La soluzione per me era usare la GUI di cpanel per cambiare la password dell'utente del database e aggiornare wp-config.php in modo che corrispondesse.