web-dev-qa-db-fra.com

Problème confus lié à PDO uniquement: connexion impossible via socket/accès refusé/connexion impossible au serveur (hôte partagé)

Donc, le problème a changé par rapport à ce qu'il était, je vais laisser la question initiale ci-dessous pour éviter les commentaires négatifs sur les réponses telles que celles que j'ai eues après que quelqu'un a modifié sa question, j'ai répondu:

Je travaille donc sur un hébergement partagé (vraiment nul) sur lequel PDO est installé, mais cela ne fonctionne pas. Avec les paramètres par défaut

<?php
try {
    $dbh = new PDO('mysql:Host=localhost;dbname=THE_DB_NAME', 'THE_USER', 'THE_PASSWORD');
    echo 'Connected to database';
    }
catch(PDOException $e)
    {
    echo $e->getMessage();
    }
?>

il jette ce message:

SQLSTATE[HY000] [2002] Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)

Avec un simple mysql_connect, ça marche.

Et le chemin du socket semble correct (phpinfo et cette requête:

show variables like 'socket';

confirmer.

Localhost redirige vers 10.103.0.14 (ces données proviennent de mysql_get_Host_info () et de phpMyAdmin)

Dans le PDO, si je remplace localhost par 127.0.0.1, je vais obtenir

SQLSTATE[HY000] [2003] Can't connect to MySQL server on '127.0.0.1' (111) 

Et si je remplace localhost par 10.103.0.14:

Access denied for user 'USER_NAME'@'10.103.0.14' (using password: YES

Les deux adresses IP (127.0.0.1 et 10.103.0.14) fonctionnent avec mysql_connect.

Donc, apparemment, le problème vient de la connexion PDO.

Est-ce que quelqu'un sait d'où cela pourrait provenir et/ou un moyen de le réparer?

Quelques données de serveur:

Le PHP Version: 5.2.10 Vous pouvez voir le phpinfo du serveur: http://web.lerelaisinternet.com/abcd.php?v=5 Pas de ligne de commande possible. (Je sais que cela devrait être le travail du support technique, mais ils sont vraiment lents)

Merci

Question précédente:

Comment trouver le mysql.sock sur un hôte partagé (moyen délicat nécessaire ...)

Le problème actuel est donc le suivant: la connexion PDO ne fonctionne pas sur un hôte partagé, et elle est supposée fonctionner (elle est installée sur le serveur). Juste une connexion PDO de base:

<?php
try {
    $dbh = new PDO('mysql:Host=localhost;dbname=THE_DB_NAME', 'THE_USER', 'THE_PASSWORD');
    echo 'Connected to database';
    }
catch(PDOException $e)
    {
    echo $e->getMessage();
    }
?>

jette ce message:

SQLSTATE[HY000] [2002] Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)

Une connexion mysql régulière:

mysql_connect("localhost", "THE_USER", "THE_PWD") or die(mysql_error()); 
mysql_select_db("24DLJLRR1") or die(mysql_error());;
echo 'Connected to database <br/>';

fonctionne bien.

Donc, apparemment, il ne peut pas trouver la .s. Je pense que spécifier l'adresse correcte devrait fonctionner, j'ai essayé un chemin mysql "classique" que j'ai trouvé sur Internet, sans succès. Le phpinfo dit que c'est à cette adresse (/var/lib/mysql/mysql.sock)(The PHP version est 5.2.10) Vous pouvez voir le phpinfo du serveur: http : //web.lerelaisinternet.com/abcd.php? v = 5

Donc, j'essaie de comprendre où il est !!! J'ai essayé de chercher dans l'interface phpMyAdmin, mais je n'ai pas pu trouver l'info, et il semblerait que phpMyAdmin se connecte à un autre serveur (ça a une adresse IP différente, et essayer de s'y connecter avec php donne une erreur "Mauvais mot de passe"). Le mysql_connect se connecte également à cette adresse, je pense qu'il redirige vers un autre serveur avec un mot de passe/login interne.

Eh bien, si vous avez une idée sur la façon d’obtenir ces informations (le support technique du fournisseur "règle le problème" ... cela fait 1 mois ...). Peut-être aussi que le problème vient ailleurs, mais les mêmes choses fonctionnent sur d'autres hôtes partagés ...

Le besoin de PDO vient du fait que j'utilise le framework Symfony avec Doctrine pour ce site web et que le plugin Doctrine a besoin de PDO ... Je ne veux pas refaire le site web à partir de rien!

Merci de votre aide !

15
Julien

C'était déjà marqué comme une réponse, mais pas vraiment résolu (sans changer de base de données). Donc, juste au cas où quelqu'un comme moi rencontrerait aussi ce problème ...

Le moyen le plus simple de résoudre ce problème est d’obtenir d’abord le chemin de la socket (soit en regardant dans le fichier php.ini, soit en utilisant: phpmyadmin ou la console (ou en le construisant dans mysql ou mysqli)

... pour exécuter la requête suivante (autre que PDO):

show variables like 'socket';       //as mentioned by symcbean

ALORS, dans la chaîne de connexion PDO, changez-la pour utiliser le socket au lieu d'un nom d'hôte:

$ dbc = new PDO ("mysql: unix_socket =/var/run/mysqld/mysqld.sock; nombd = $ DBName", $ utilisateur, $ mot de passe, array (PDO :: ATTR_PERSISTENT => true)); // utilisation de connexions persistantes

Cela a fonctionné pour moi.

21
Brent

FWIW, j'ai eu ce problème et changé mon hôte de 'localhost' à '127.0.0.1'. 

Je ne sais pas pourquoi localhost ne fonctionnait pas, mais ça a marché.

Ce qui est étrange, c’est que nous avons des tonnes de serveurs et que cela fonctionne sur presque tous en utilisant «localhost»

15
zmonteca

Est-ce que votre serveur fonctionne avec SeLinux activé (en vigueur)? Si c'est le cas, essayez de lancer en tant que root:

# setsebool -P httpd_can_network_connect on
7
Rodrigo Renie

Pouvez-vous essayer 127.0.0.1 comme nom de serveur au lieu de localhost?

IIRC, avec certains pilotes/adaptateurs MySQL, détermine si le socket est utilisé pour établir la connexion ou non.

4
Pekka 웃

En utilisant la connexion qui fonctionne, lancez la requête:

show variables like 'socket';

(cela se comporte exactement comme une instruction select) ... et vous obtiendrez le chemin du socket en cours d'exécution. 

Ensuite, vérifiez les autorisations de fichier.

4
symcbean

Le problème était que la version de production fonctionnait correctement et qu’une version test ne pouvait pas connecter PDO:/ Les deux versions se trouvaient sur les mêmes serveurs, dans un sous-répertoire.

Le correctif remplaçait dans DSN l'hôte local pour ip.

'mysql:Host=localhost;dbname=db'

est devenu

'mysql:Host=127.0.0.1;dbname=db'
4
Valentin Rusk

essayer:

exec('`which mysql_config` --socket');

cela devrait vous montrer le socket configuré.

2
Rufinus

Pour ce que ça vaut, j'ai trouvé cette page après avoir eu exactement le même problème. Je suis sur un serveur exécutant Apache et PHP uniquement _ - MySQL est installé sur un autre ordinateur. J'ai essayé le nom DNS du serveur et son adresse IP et j'ai confirmé que je pouvais le cingler. Une application PHP sur le même ordinateur communique correctement avec la base de données, en utilisant l'ancienne syntaxe mysql_connect (). Mais PDO de la CLI lançait cette erreur. 

La solution pour moi était de vérifier mon DSN. Toute faute de frappe dans le DSN lui-même est ignorée en silence, et PDO suppose que vous voulez dire localhost . Mon problème était que j'avais "name =" au lieu de "dbname =" dans le DSN.

1
phpguru

J'ai trouvé la raison de ce comportement étrange. Si bind-address est différent de 127.0.0.1 ou 0.0.0.0 (toutes les adresses), PDO ne peut pas se connecter à 127.0.0.1.

1
Franz

Le problème dans la configuration Mysql Si vous devez désactiver l’option skip-networking Dans le fichier de configuration my.conf, cela devrait fonctionner correctement Référence http: //www.wolfcms .org/forum/post7098.html # p7098

0
Ahmed Aswani

Mon problème est peut-être différent du PO, mais je pensais que ça valait la peine de le poster. J'ai effectué une mise à niveau logicielle sur une machine virtuelle, puis j'ai redémarré et j'ai reçu le message d'erreur de l'OP. Il s’est avéré qu’il s’agissait d’un problème de manque de mémoire empêchant mysql de démarrer. La suppression de quelques fichiers volumineux a permis de résoudre le problème.

0
David

Je viens de résoudre un problème similaire. Mon hypothèse est que vous avez probablement remplacé votre instruction mysql_connect () par l'équivalent PDO. N'oubliez pas que vous avez encore beaucoup d'autres codes dépendant de cette ancienne instruction de connexion. Essayez de garder mysql_connect en place pendant que vous écrivez dans le code PDO.

0
user1389749

Ce qui a fonctionné pour moi a été de spécifier le numéro de port de la manière suivante:

mysql: nomhôte; port = 3306; nombase = nombase;

Cela a fonctionné lors de la connexion à une base de données locale. Je travaille maintenant à le faire fonctionner avec une base de données distante. 

0
Nick Res