web-dev-qa-db-fra.com

mysqli :: mysqli (): (HY000 / 2002): Impossible de se connecter au serveur MySQL local via le socket 'MySQL' (2)

Je reçois cette erreur lorsque j'essaie de me connecter à la base de données mysql à l'aide de php mysqli class. En utilisant le code suivant:

$db = new MySQLi("localhost","kamil","*****");
if (mysqli_connect_errno())
{
    echo "An error occured. Please try again later.";
    exit();
}

le mot de passe est * pour la sécurité.

J'ai créé l'utilisateur kamil avec tous les privilèges sur l'adresse IP externe et sur l'hôte local. Quand je cours: select user,Host from mysql.user _ il affiche correctement ces deux utilisateurs.

J'ai fait des recherches et utilisé ce repère: https://stackoverflow.com/a/2183134/1839439 pour voir à quoi il se connecte. En fait, il est seulement capable de se connecter à 127.0.0.1 et 127.0.0.1:3306 qui est localhost, cependant, lorsque je fournis localhost, cette erreur est supprimée.

Ma question est pourquoi cela me permet-il seulement de me connecter à la base de données en utilisant l'adresse IP de l'hôte local et non le nom ou l'adresse IP externe. Ai-je besoin d'un hôte différent si je veux pouvoir utiliser mysql sur un site Web ou si je peux utiliser 127.0.0.1?

EDIT:
hosts fichier

127.0.0.1       localhost
::1             localhost ip6-localhost ip6-loopback
fe00::0         ip6-localnet
ff00::0         ip6-mcastprefix
ff02::1         ip6-allnodes
ff02::2         ip6-allrouters

127.0.1.1       raspberrypi

| kamil            | 109.255.177.28 |
| kamil            | localhost      |
34
Dharman

Lorsque vous utilisez uniquement "localhost", la bibliothèque cliente MySQL essaie d'utiliser un socket de domaine Unix pour la connexion au lieu d'une connexion TCP/IP. L'erreur indique que le socket, appelé MySQL, ne peut pas être utilisé pour établir la connexion, probablement parce qu'il n'existe pas (numéro d'erreur 2).

Depuis le documentation MySQL :

Sous Unix, les programmes MySQL traitent le nom d’hôte localhost de manière particulière, d’une manière probablement différente de ce que vous attendiez par rapport aux autres programmes basés sur le réseau. Pour les connexions à localhost, les programmes MySQL tentent de se connecter au serveur local en utilisant un fichier de socket Unix. Cela se produit même si une option --port ou -P est donnée pour spécifier un numéro de port. Pour vous assurer que le client établit une connexion TCP/IP au serveur local, utilisez --Host ou -h pour spécifier une valeur de nom d'hôte de 127.0.0.1, ou l'adresse IP ou le nom du serveur local. Vous pouvez également spécifier explicitement le protocole de connexion, même pour localhost, en utilisant l'option --protocol = TCP.

Il y a plusieurs façons de résoudre ce problème.

  1. Vous pouvez simplement utiliser TCP/IP au lieu du socket Unix. Vous feriez cela en utilisant 127.0.0.1 au lieu de localhost lorsque vous vous connectez. Le socket Unix pourrait toutefois être plus rapide et plus sûr à utiliser.
  2. Vous pouvez changer le socket en php.ini : ouvre le fichier de configuration MySQL my.cnf pour trouver où MySQL crée le socket et définir le mysqli.default_socket sur ce chemin. Sur mon système, c'est /var/run/mysqld/mysqld.sock.
  3. Configurez le socket directement dans le script PHP lors de l’ouverture de la connexion. Par exemple:

    $db = new MySQLi('localhost', 'kamil', '***', '', 0, 
                                  '/var/run/mysqld/mysqld.sock')
    
71
Joni

S'il s'agit d'un problème PHP, vous pouvez simplement modifier le fichier de configuration php.ini où qu'il se trouve et mettre à jour les paramètres de PORT/SOCKET-PATH, etc. pour le connecter. au serveur.

Dans mon cas, j’ai ouvert le fichier php.ini et

mysql.default_socket = /var/run/mysqld/mysqld.sock
mysqli.default_socket = /var/run/mysqld/mysqld.sock

Et cela a fonctionné tout de suite. Je dois admettre que j'ai retenu l'allusion de la réponse acceptée par @Joni

3
Vijay Kumar Kanta

Si 'localhost' ne fonctionne pas mais 127.0.0.1. Assurez-vous que votre fichier d'hôtes local pointe vers le bon emplacement. (/ etc/hosts pour linux/mac, C:\Windows\System32\drivers\etc\hosts pour Windows).

Assurez-vous également que votre utilisateur est autorisé à se connecter à la base de données que vous essayez de sélectionner.

0
castis

Veuillez vérifier le fichier suivant

%SystemRoot%\system32\drivers\etc\Host

Il manque probablement une ligne qui lie le nom d'hôte avec ip à une ligne qui les lie ensemble

127.0.0.1  localhost

Si la ligne donnée est manquante. Ajouter la ligne dans le fichier


Pourriez-vous également consulter la table des utilisateurs de votre base de données MySQL et nous indiquer la valeur de la colonne Hôte pour l'utilisateur que vous utilisez? Vous devez avoir les privilèges utilisateur pour l'hôte "127.0.0.1" et "localhost" et utiliser%, car il s'agit d'un caractère sauvage pour le nom d'hôte générique.

0
Badal Singh