Maison  >  Article  >  base de données  >  Pourquoi MySQL_connect() échoue-t-il avec « paquet OK 6 octets plus court que prévu » lors de la connexion à une base de données MySQL 5.0.22 distante à partir de PHP 5.3.0 ?

Pourquoi MySQL_connect() échoue-t-il avec « paquet OK 6 octets plus court que prévu » lors de la connexion à une base de données MySQL 5.0.22 distante à partir de PHP 5.3.0 ?

Susan Sarandon
Susan Sarandonoriginal
2024-11-07 05:10:02168parcourir

Why does MySQL_connect() fail with

Incompatibilité MySQL PHP : comprendre l'erreur

Le problème décrit dans la question survient lors de la tentative de connexion à une base de données MySQL distante à partir d'un local Installation WAMP exécutant PHP 5.3.0. Bien que la connexion à une base de données exécutant MySQL 5.0.45 réussisse, la connexion à une base de données avec la version 5.0.22 entraîne l'erreur suivante :

Warning: mysql_connect() [function.mysql-connect]: OK packet 6 bytes shorter than expected. PID=5880 in ...
Warning: mysql_connect() [function.mysql-connect]: mysqlnd cannot connect to MySQL 4.1+ using old authentication in ...

Explication

La cause première de cette incompatibilité vient de la longueur du mot de passe du compte MySQL utilisé pour la connexion. En règle générale, les comptes MySQL créés avec des versions antérieures utilisaient des mots de passe à 16 caractères. Cependant, les versions plus récentes de PHP, telles que PHP 5.3.0, ne prennent plus en charge l'authentification avec ces anciens mots de passe.

Solution

Pour résoudre le problème, le mot de passe de le compte MySQL concerné doit être réinitialisé à l'aide d'une commande telle que :

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

De plus, il est conseillé de vérifier si le serveur est configuré pour utiliser ou créer d'anciens mots de passe par défaut.

Requête de diagnostic

Pour diagnostiquer davantage le problème, la requête suivante peut être exécutée sur le serveur MySQL problématique pour déterminer la longueur du mot de passe :

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

Remplacer 'nom d'utilisateur' par le nom d'utilisateur réel utilisé pour la connexion à la base de données fournira des informations sur la longueur du mot de passe et le premier caractère du mot de passe, ce qui peut aider à confirmer s'il s'agit d'un mot de passe de style ancien.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn