Avertissement: mysql_connect (): [2002] Aucun fichier ou répertoire de ce type (essayant de se connecter via unix: ///tmp/mysql.sock) dans

246

J'essaie de me connecter à ma base de données MySQL avec le terminal sur mon Apple (avec PHP).

Hier, cela a bien fonctionné, et maintenant j'ai soudainement l'erreur dans le titre.

Le script fonctionne lorsque j'utilise mon navigateur pour l'exécuter (j'ai XAMPP installé), mais Terminal refuse de se connecter à la base de données.

Voici le fichier que j'inclus pour me connecter (le script fonctionne lorsque je ne l'inclus pas, mais il ne se connecte pas à la base de données):

<?php
    mysql_connect("localhost", "root", "") or die(mysql_error());
    mysql_select_db("FNB1C_data") or die(mysql_error());
?>

Cela devrait fonctionner, car cela fonctionne avec mon navigateur.

La commande que j'utilise sur le terminal est php scriptname.php.

Nr 28
la source

Réponses:

415

Pour une raison quelconque, mysql sur OS X obtient les emplacements du fichier socket requis un peu mal, mais heureusement, la solution est aussi simple que de configurer un lien symbolique.

Vous pouvez avoir un socket (apparaissant comme un fichier de longueur nulle) comme /tmp/mysql.sockou /var/mysql/mysql.sock, mais une ou plusieurs applications le recherchent à l'autre emplacement. Découvrez avec cette commande:

ls -l /tmp/mysql.sock /var/mysql/mysql.sock

Plutôt que de déplacer le socket, éditez les fichiers de configuration et n'oubliez pas de conserver les fichiers modifiés localement et loin des serveurs où les chemins sont corrects, créez simplement un lien symbolique pour que votre Mac trouve le socket requis, même lorsqu'il cherche au mauvais endroit !

Si vous avez /tmp/mysql.sockmais non /var/mysql/mysql.sockalors ...

cd /var 
sudo mkdir mysql
sudo chmod 755 mysql
cd mysql
sudo ln -s /tmp/mysql.sock mysql.sock

Si vous avez /var/mysql/mysql.sockmais non /tmp/mysql.sockalors ...

cd /tmp
ln -s /var/mysql/mysql.sock mysql.sock

Vous aurez besoin d'autorisations pour créer le répertoire et le lien, il vous suffit donc de préfixer les commandes ci-dessus avec sudo si nécessaire.

Brian Lowe
la source
Bonne réponse. Fix a fonctionné pour moi. Savez-vous pourquoi cela pourrait fonctionner une fois et ne pas fonctionner à nouveau? J'ai eu le même problème.
Nicole
16
C'est plutôt hacky. Je recommande beaucoup la réponse de @luismreis pour contourner ce raccourci caché MySQL.
MattiSG
2
Ça n'a pas marché pour moi ... Je n'ai aucun de ces fichiers. Mais la réponse des luismreis a fonctionné!
Grégoire
4
Ce n'est pas "hacky". C'est la bonne façon de faire fonctionner le localhostsocket, et cela peut être important si vous ne voulez pas la surcharge supplémentaire de l'envoi de paquets au routeur avant d'accéder à la base de données.
Kebman
1
Le chemin sur mon Ubuntu 10.04 n'était pas correct. Je devais le faire: cd /tmppuis: sudo ln -s /var/run/mysqld/mysqld.sock mysql.sock.
franzlorenzon
371

J'ai également eu cette erreur, mais je n'ai pu la corriger que par la suggestion ici .

Pour résumer, utilisez:

127.0.0.1

Au lieu de:

localhost

La raison en est que "localhost" est un nom spécial pour le pilote MySQL lui faisant utiliser le socket UNIX pour se connecter à MySQL au lieu du socket TCP.

luismreis
la source
1
Si cela fonctionne, vérifiez votre hostsfichier, il pourrait être manquant ou foiré
Fabrizio
3
aussi peut-être bon de mentionner: Lorsque vous utilisez MAMP comme moi, vous devez décocher la case "Autoriser l'accès local uniquement"
soupdiver
Cette solution génère une surcharge supplémentaire car le paquet est envoyé par le routeur en premier. Généralement, ce n'est pas un gros problème lors des tests, mais cela peut devenir un problème avec de gros paquets de données.
Kebman
3
@Fabrizio Non, ce n'est pas lié. Lorsque vous utilisez localhost comme nom, mysql utilisera à la place un socket Unix qui est géré via une entrée de fichier (mysql.sock, par exemple), pas Inet, peu importe si localhost est déclaré dans / etc / hosts ou non. Cependant, lorsque vous utilisez une adresse IP à la place, même 127.0.0.1, vous forcez mysql à ouvrir un socket Inet à la place.
Fran Marzoa
1
Cela signifie-t-il alors que toutes les autorisations que vous avez fournies sur la base de données MySQL à 'user'% 'localhost' seront rompues?
Octopus le
24

J'avais le même problème et voici comment je l'ai résolu:

J'avais ça et ça n'a pas marché:

$con = mysql_connect('localhost', 'root', '1234');

Je l'ai fait et ça a marché:

$con = mysql_connect(':/Applications/MAMP/tmp/mysql/mysql.sock', 'root', '1234');

Au lieu d'utiliser le serveur mysql, je me suis connecté directement au socket Unix. A travaillé pour moi.

Caio
la source
C'est aussi la seule solution qui a fonctionné pour moi. Je n'ai pas de /var/mysql/mysql.sock. Et je n'ai pas de /tmp/mysql.sock.
JeffB6688
avez-vous essayé 127.0.0.1 au lieu de localhost?
Mantisse
21

Le socket MySQL est situé, en général, dans /tmp/mysql.sockou /var/mysql/mysql.sock, mais PHP ne semble probablement pas au bon endroit.

  1. Vérifiez où se trouve votre prise avec:

     sudo /usr/libexec/locate.updatedb
  2. Lorsque la mise à jourb est terminée:

     locate mysql.sock
  3. Localisez ensuite votre php.ini:

     php -i | grep php.ini

    cela produira quelque chose comme:

     Configuration File (php.ini) Path => /opt/local/etc/php54
     Loaded Configuration File => /opt/local/etc/php54/php.ini
  4. Modifiez votre php.ini

     sudo vim /opt/local/etc/php54/php.ini
  5. Changez les lignes:

     pdo_mysql.default_socket=/tmp/mysql.sock
     mysql.default_socket=/tmp/mysql.sock
     mysqli.default_socket = /tmp/mysql.sock

    où /tmp/mysql.sock est le chemin d'accès à votre socket.

  6. Enregistrez vos modifications et quittez ESC + SHIFT: x

  7. Redémarrez Apache

     sudo apachectl stop
     sudo apachectl start
nom
la source
Je n'ai pas de php.ini; Je n'ai qu'un php.ini.default, il semble donc que la solution de contournement ici soit nécessaire: apple.stackexchange.com/questions/65802/… Cependant, cela n'a pas fonctionné pour moi.
user124384
@ user124384 Votre installation est probablement cassée: renommez votre php.ini.defaulten php.ini.
nom
Apache peut être redémarré avec une seule ligne:sudo apachectl restart
fbiazi
11

Je suis sur XAMPP sur Mac OS X, et la solution de Brian Lowe ci-dessus a fonctionné avec une légère modification .

Le fichier mysql.sock se trouve en fait dans le dossier "/ Applications / xampp / xamppfiles / var / mysql /". J'ai donc dû le relier à la fois dans / tmp et / var / mysql. Je n'ai pas vérifié lequel est utilisé par la ligne de commande PHP, mais cela a fait le correctif, donc je suis heureux :-)

sudo su
ln -s /Applications/xampp/xamppfiles/var/mysql/mysql.sock /tmp/mysql.sock
mkdir /var/mysql
ln -s /Applications/xampp/xamppfiles/var/mysql/mysql.sock /var/mysql/mysql.sock
Nirav Mehta
la source
1
ty - J'ai cherché quelques jours une solution et c'est celle qui a finalement arrangé les choses! =) XAMPP sur OS X aussi
ljubiccica
10

Mac OS X EL Capitan + MAMP Pro Procédez comme suit

cd /var
sudo mkdir mysql
sudo chmod 755 mysql
cd mysql
sudo ln -s /Applications/MAMP/tmp/mysql/mysql.sock mysql.sock

Alors fais ça

cd /tmp
sudo ln -s /Applications/MAMP/tmp/mysql/mysql.sock mysql.sock

J'espère que cela vous fera gagner du temps.

Jsonras
la source
C'est relier le mysql.dockdans le /tmpqui l'a résolu. Merci!
Mohammed J.Razem
6

La raison en est que php ne peut pas trouver le chemin correct de mysql.sock.

Veuillez vous assurer que votre mysql fonctionne en premier.

Ensuite, veuillez confirmer quel chemin est mysql.socksitué, par exemple/tmp/mysql.sock

puis ajoutez cette chaîne de chemin d'accès à php.ini:

  • mysql.default_socket = /tmp/mysql.sock
  • mysqli.default_socket = /tmp/mysql.sock
  • pdo_mysql.default_socket = /tmp/mysql.sock

Enfin, redémarrez Apache.

brucenan
la source
6

Lorsque vous rencontrez le problème suivant:

Erreur de lancement PHP "Avertissement: mysql_connect () http: //function.mysql-connect : 2002 Aucun fichier ou répertoire de ce type (tentative de connexion via unix: ///tmp/mysql.sock)"

Set valeur « mysql.default_socket » dans votre /etc/php.inià

 "mysql.default_socket = /var/mysql/mysql.sock". 

Redémarrez ensuite le service Web dans l'administrateur du serveur

cristian
la source
C'était la meilleure réponse pour moi - dans mon cas, j'utilise MAMP, j'ai ajouté à mon php.ini: mysqli.default_socket = /Applications/MAMP/tmp/mysql/mysql.sock mysql.default_socket = / Applications / MAMP / tmp /mysql/mysql.sock
Adamski
1

Une autre solution consiste à corriger l'emplacement du socket dans le fichier de configuration php.ini comme ceci:

pdo_mysql.default_socket=/tmp/mysql.sock

Bien sûr, le lien symbolique fonctionne aussi, donc c'est une question de préférence celui que vous changez.

Michael Böckling
la source
1

Lorsque vous installez php53-mysql en utilisant le port, il renvoie le message suivant qui est la solution à ce problème:

To use mysqlnd with a local MySQL server, edit /opt/local/etc/php53/php.ini
and set mysql.default_socket, mysqli.default_socket and
pdo_mysql.default_socket to the path to your MySQL server's socket file.

For mysql5, use /opt/local/var/run/mysql5/mysqld.sock
For mysql51, use /opt/local/var/run/mysql51/mysqld.sock
For mysql55, use /opt/local/var/run/mysql55/mysqld.sock
For mariadb, use /opt/local/var/run/mariadb/mysqld.sock
For percona, use /opt/local/var/run/percona/mysqld.sock
Sheric
la source
J'utilise Mountain Lion et j'ai installé MySQL à l'aide de macports.
Sheric
1

j'avais le même problème

[PDOException] SQLSTATE [HY000] [2002] Aucun fichier ou répertoire de ce type

[ErrorException] Avertissement: PDO :: __ construct (): [2002] Aucun fichier ou répertoire de ce type (essayant de se connecter via unix: ///var/mysql/mysql.sock) dans… htdocs / Symfony / vendor / doctrine-dbal / lib / Doctrine / DBAL / Driver / PDOConnection.php

La solution consiste donc à créer un lien symbolique vers le fichier chaussette, résolvant ainsi le problème. Procédez comme suit pour le résoudre:

$ sudo mkdir / private / var / mysql /

$ sudo ln -s /Applications/MAMP/tmp/mysql/mysql.sock /private/var/mysql/mysql.sock

source: http://www.reecefowell.com/2012/07/21/symfony2-cli-does-not-connect-to-mysql- while- browser - works - fine/

tanveer ahmad dar
la source
Postez votre réponse ici, plutôt qu'un lien vers un site Web externe.
ElmerCat du
0

J'ai les mêmes erreurs. Mysql fonctionnait en tant qu'application autonome avant de lancer phpMyAdmin.

Je viens d'arrêter mysql Puis sudo / Applications / XAMPP / xamppfiles / xampp stop sudo / Applications / XAMPP / xamppfiles / xampp start

Cela a bien fonctionné

minhas23
la source
0

Je viens d'avoir ce problème, mais il n'est apparu que lors du chargement de certaines pages (d'autres pages fonctionnaient bien). Il s'est avéré que je faisais des appels à MySQL après avoir fermé la connexion avec mysql_close(). Donc, comme l'a dit @brucenan: assurez-vous que MySQL est en cours d'exécution lorsque vous l'appelez .

RoberRM
la source
0

Vous pouvez le faire en aliasant simplement le php MAMP sur le terminal Apple:

alias phpmamp='/Applications/MAMP/bin/php/php7.0.0/bin/php'

Exemple: > phpmamp - v

Vous pouvez maintenant exécuter quelque chose comme: > phpmamp scriptname.php

Remarque: cela ne sera appliqué que pour la session de terminal en cours.

Naresh Chennuri
la source
0

Puisque vous pouvez utiliser MAMP, changez votre port en 3306 par défaut ou utilisez 127.0.0.1 dans le fichier database.php

$db['default'] = array(
    'dsn'   => '',
    'hostname' => 'localhost',// leave it for port 3306
    'username' => 'yourUserhere',
    'password' => 'yourPassword',
    'database' => 'yourDatabase',
    'dbdriver' => 'mysqli',
    'dbprefix' => '',
    'pconnect' => FALSE,
    'db_debug' => (ENVIRONMENT !== 'production'),
    'cache_on' => FALSE,
    'cachedir' => '',
    'char_set' => 'utf8',
    'dbcollat' => 'utf8_general_ci',
    'swap_pre' => '',
    'encrypt' => FALSE,
    'compress' => FALSE,
    'stricton' => FALSE,
    'failover' => array(),
    'save_queries' => TRUE
);

Ou avec les paramètres par défaut:

$db['default'] = array(
        'dsn'   => '',
        'hostname' => '127.0.0.1:8889',// leave it for port 8889
        'username' => 'yourUserhere',
        'password' => 'yourPassword',
        'database' => 'yourDatabase',
        'dbdriver' => 'mysqli',
        'dbprefix' => '',
        'pconnect' => FALSE,
        'db_debug' => (ENVIRONMENT !== 'production'),
        'cache_on' => FALSE,
        'cachedir' => '',
        'char_set' => 'utf8',
        'dbcollat' => 'utf8_general_ci',
        'swap_pre' => '',
        'encrypt' => FALSE,
        'compress' => FALSE,
        'stricton' => FALSE,
        'failover' => array(),
        'save_queries' => TRUE
    );
Cyber
la source
0

Par défaut, le client mySQL tente de se connecter via un fichier local appelé socket au lieu de se connecter à l'adresse de bouclage (127.0.0.1) pour localhost.

L'emplacement par défaut de ce fichier socket, au moins sur OSX, est /tmp/mysql.sock.

SOLUTION RAPIDE ET MOINS ÉLÉGANTE

Créez un lien symbolique pour tromper le système d'exploitation en trouvant le bon socket.

ln -s /Applications/MAMP/tmp/mysql/mysql.sock /tmp

SOLUTION APPROPRIÉE

Modifiez le chemin du socket défini dans le startMysql.shfichier dans /Applications/MAMP/bin.

un requin
la source