Warnung: mysql_connect (): [2002] Keine solche Datei oder kein solches Verzeichnis (versucht, eine Verbindung über Unix herzustellen: ///tmp/mysql.sock) in

246

Ich versuche, mit dem Terminal auf meinem Apple (mit PHP) eine Verbindung zu meiner MySQL-Datenbank herzustellen.

Gestern hat es gut funktioniert und jetzt bekomme ich plötzlich den Fehler im Titel.

Das Skript funktioniert, wenn ich es mit meinem Browser ausführe (ich habe XAMPP installiert), aber Terminal weigert sich, eine Verbindung zur Datenbank herzustellen.

Hier ist die Datei, die ich zum Herstellen einer Verbindung einbinde (das Skript funktioniert, wenn ich dies nicht einbinde, aber dann keine Verbindung zur Datenbank herstellt):

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

Das sollte funktionieren, da es mit meinem Browser funktioniert.

Der Befehl, den ich am Terminal verwende, ist php scriptname.php.

Nr 28
quelle

Antworten:

415

Aus irgendeinem Grund werden bei mysql unter OS X die Speicherorte der erforderlichen Socket-Datei etwas falsch angegeben, aber zum Glück ist die Lösung so einfach wie das Einrichten einer symbolischen Verknüpfung.

Möglicherweise haben Sie einen Socket (der als Datei mit der Länge Null angezeigt wird) als /tmp/mysql.sockoder /var/mysql/mysql.sock, aber eine oder mehrere Apps suchen am anderen Speicherort danach. Finden Sie es mit diesem Befehl heraus:

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

Anstatt den Socket zu verschieben, Konfigurationsdateien zu bearbeiten und daran zu denken, bearbeitete Dateien lokal und von Servern fernzuhalten, auf denen die Pfade korrekt sind, erstellen Sie einfach einen symbolischen Link, damit Ihr Mac den erforderlichen Socket findet, auch wenn er an der falschen Stelle sucht !

Wenn du /tmp/mysql.sockaber nein hast /var/mysql/mysql.sockdann ...

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

Wenn du /var/mysql/mysql.sockaber nein hast /tmp/mysql.sockdann ...

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

Sie benötigen Berechtigungen, um das Verzeichnis und den Link zu erstellen. Stellen Sie den obigen Befehlen bei Bedarf einfach sudo voran.

Brian Lowe
quelle
Gute Antwort. Fix hat bei mir funktioniert. Wissen Sie, warum es einmal und dann nicht mehr funktionieren könnte? Ich hatte das gleiche Problem.
Nicole
16
Das ist ziemlich hacky. Ich empfehle eher die Antwort von @luismreis, um diese versteckte MySQL-Verknüpfung zu umgehen.
MattiSG
2
Hat bei mir nicht funktioniert ... Ich habe keine dieser Dateien. Aber die Antwort von luismreis hat funktioniert!
Gregoire
4
Das ist nicht "hacky". Dies ist der richtige Weg, um den localhostSocket zum Laufen zu bringen, und es kann von Bedeutung sein, wenn Sie nicht möchten, dass der zusätzliche Aufwand durch das Senden von Paketen an den Router entsteht, bevor auf die Datenbank zugegriffen wird.
Kebman
1
Der Pfad auf meinem Ubuntu 10.04 war nicht korrekt. Ich musste das machen: cd /tmpund dann : sudo ln -s /var/run/mysqld/mysqld.sock mysql.sock.
Franzlorenzon
370

Ich hatte auch diesen Fehler, konnte ihn aber nur durch den Vorschlag hier beheben .

Um es zusammenzufassen, verwenden Sie:

127.0.0.1

Anstatt:

localhost

Der Grund dafür ist, dass "localhost" ein spezieller Name für den MySQL-Treiber ist, der den UNIX-Socket verwendet, um eine Verbindung zu MySQL anstelle eines TCP-Sockets herzustellen.

luismreis
quelle
1
Wenn dies funktioniert, überprüfen Sie Ihre hostsDatei, es könnte fehlen oder durcheinander sein
Fabrizio
3
auch vielleicht gut zu erwähnen: Wenn Sie MAMP wie mich verwenden, müssen Sie das Kontrollkästchen "Nur lokalen Zugriff zulassen"
deaktivieren
Diese Lösung verursacht zusätzlichen Overhead, da das Paket zuerst vom Router gesendet wird. Normalerweise kein großes Problem beim Testen, aber es kann ein Problem mit großen Datenpaketen werden.
Kebman
3
@ Fabizio Nein, es ist nicht verwandt. Wenn Sie localhost als Namen verwenden, verwendet mysql stattdessen einen Unix-Socket, der über einen Dateieintrag (z. B. mysql.sock) verarbeitet wird, nicht über einen Inet-Socket, unabhängig davon, ob localhost in / etc / hosts deklariert ist oder nicht. Wenn Sie jedoch stattdessen eine IP-Adresse verwenden, sogar 127.0.0.1, zwingen Sie mysql, stattdessen einen Inet-Socket zu öffnen.
Fran Marzoa
1
Bedeutet dies dann, dass alle Zuschüsse, die Sie in der MySQL-Datenbank für 'Benutzer'% 'localhost' bereitgestellt haben, nicht mehr funktionieren?
Octopus
24

Ich hatte das gleiche Problem und so habe ich es behoben:

Ich hatte das und es hat nicht funktioniert:

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

Ich habe das gemacht und es hat funktioniert:

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

Anstatt den MySQL-Server zu verwenden, habe ich mich direkt mit dem Unix-Socket verbunden. Hat für mich gearbeitet.

Caio
quelle
Dies ist die einzige Lösung, die auch für mich funktioniert hat. Ich habe keine /var/mysql/mysql.sock. Und ich habe keine /tmp/mysql.sock.
JeffB6688
Haben Sie 127.0.0.1 anstelle von localhost ausprobiert?
Mantisse
21

Der MySQL-Socket befindet sich im Allgemeinen in /tmp/mysql.sockoder /var/mysql/mysql.sock, aber wahrscheinlich sieht PHP am falschen Ort aus.

  1. Überprüfen Sie, wo sich Ihre Steckdose befindet mit:

     sudo /usr/libexec/locate.updatedb
  2. Wenn das aktualisierteb beendet wird:

     locate mysql.sock
  3. Dann suchen Sie Ihre php.ini:

     php -i | grep php.ini

    Dies gibt ungefähr Folgendes aus:

     Configuration File (php.ini) Path => /opt/local/etc/php54
     Loaded Configuration File => /opt/local/etc/php54/php.ini
  4. Bearbeiten Sie Ihre php.ini

     sudo vim /opt/local/etc/php54/php.ini
  5. Ändern Sie die Zeilen:

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

    Dabei ist /tmp/mysql.sock der Pfad zu Ihrem Socket.

  6. Speichern Sie Ihre Änderungen und beenden Sie ESC + SHIFT: x

  7. Starten Sie Apache neu

     sudo apachectl stop
     sudo apachectl start
Substantiv
quelle
Ich habe keine php.ini; Ich habe nur eine php.ini.default, daher scheint die Problemumgehung hier notwendig zu sein: apple.stackexchange.com/questions/65802/… Bei mir hat dies jedoch nicht funktioniert.
user124384
@ user124384 Ihre Installation ist wahrscheinlich fehlerhaft: Benennen Sie Ihre php.ini.defaultin um php.ini.
Nomen
Apache kann mit einer einzigen Zeile neu gestartet werden:sudo apachectl restart
fbiazi
11

Ich bin auf XAMPP unter Mac OS X und Brian Lowes obige Lösung hat mit einer geringfügigen Änderung funktioniert .

Die Datei mysql.sock befindet sich tatsächlich im Ordner "/ Applications / xampp / xamppfiles / var / mysql /". Also musste es sowohl in / tmp als auch in / var / mysql verknüpft werden. Ich habe nicht überprüft, welches von der PHP-Befehlszeile verwendet wird, aber dies hat das Problem behoben, daher bin ich glücklich :-)

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
quelle
1
ty - Ich habe ein paar Tage nach einer Lösung gesucht und diese hat endlich alles richtig gemacht! =) XAMPP auch unter OS X
ljubiccica
10

Mac OS X EL Capitan + MAMP Pro Tun Sie dies

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

Dann mach das

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

Hoffe das spart dir etwas Zeit.

Jsonras
quelle
Es verbindet das mysql.dockin dem /tmp, was es gelöst hat. Vielen Dank!
Mohammed J. Razem
6

Der Grund ist, dass PHP nicht den richtigen Pfad von finden kann mysql.sock .

Bitte stellen Sie sicher, dass Ihre MySQL zuerst ausgeführt wird.

Dann bestätigen Sie bitte, welcher Pfad der ist mysql.sock , die sie beispiel/tmp/mysql.sock

Fügen Sie dann diese Pfadzeichenfolge zu php.ini hinzu:

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

Starten Sie schließlich Apache neu.

Brucenan
quelle
6

Wenn Sie mit folgendem Problem konfrontiert sind:

PHP-Fehler "Warnung: mysql_connect () http: //function.mysql-connect : 2002 Keine solche Datei oder kein solches Verzeichnis (versucht, eine Verbindung über Unix herzustellen: ///tmp/mysql.sock)"

Setzen Sie den Wert "mysql.default_socket" in Ihrem /etc/php.inito

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

Starten Sie dann den Webdienst im Serveradministrator neu

Cristian
quelle
Dies war die beste Antwort für mich - in meinem Fall, in dem ich MAMP verwende, habe ich meiner php.ini Folgendes hinzugefügt: mysqli.default_socket = /Applications/MAMP/tmp/mysql/mysql.sock mysql.default_socket = / Applications / MAMP / tmp /mysql/mysql.sock
Adamski
1

Eine andere Lösung besteht darin, den Socket-Speicherort in der Konfigurationsdatei php.ini wie folgt zu korrigieren:

pdo_mysql.default_socket=/tmp/mysql.sock

Natürlich funktioniert der Symlink auch, daher ist es eine Frage der Präferenz, welchen Sie ändern.

Michael Böckling
quelle
1

Wenn Sie php53-mysql über den Port installieren, wird die folgende Meldung zurückgegeben, die die Lösung für dieses Problem darstellt:

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
quelle
Ich verwende Mountain Lion und habe MySQL mithilfe von Macports installiert.
Sheric
1

Ich hatte das gleiche Problem

[PDOException] SQLSTATE [HY000] [2002] Keine solche Datei oder kein solches Verzeichnis

[ErrorException] Warnung: PDO :: __ construct (): [2002] Keine solche Datei oder kein solches Verzeichnis (versucht, eine Verbindung über Unix herzustellen: ///var/mysql/mysql.sock) in… htdocs / Symfony / vendor / doctrine-dbal / lib / Doctrine / DBAL / Driver / PDOConnection.php

Die Lösung besteht also darin, einen Symlink zur Sock-Datei zu erstellen, um das Problem zu beheben. Gehen Sie wie folgt vor, um das Problem zu beheben:

$ sudo mkdir / private / var / mysql /

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

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

tanveer ahmad dar
quelle
Veröffentlichen Sie Ihre Antwort hier und nicht als Link zu einer externen Website.
ElmerCat
0

Ich habe die gleichen Fehler. MySQL wurde als eigenständige Anwendung ausgeführt, bevor ich phpMyAdmin startete.

Ich habe gerade mysql gestoppt. Dann starten sudo / Applications / XAMPP / xamppfiles / xampp sudo / Applications / XAMPP / xamppfiles / xampp

Es hat gut funktioniert

minhas23
quelle
0

Ich hatte gerade dieses Problem, aber es trat nur beim Laden bestimmter Seiten auf (andere Seiten funktionierten einwandfrei). Es stellte sich heraus, dass ich MySQL anrief, nachdem ich die Verbindung mit geschlossen hatte mysql_close(). Also, wie @brucenan sagte: Stellen Sie sicher, dass MySQL läuft, wenn Sie es aufrufen .

RoberRM
quelle
0

Sie können dies tun, indem Sie einfach das MAMP-PHP auf dem Apple-Terminal aliasen:

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

Beispiel: > phpmamp - v

Jetzt können Sie so etwas ausführen wie: > phpmamp scriptname.php

Hinweis: Dies wird nur für die aktuelle Terminalsitzung angewendet.

Naresh Chennuri
quelle
0

Da Sie möglicherweise MAMP verwenden, ändern Sie entweder Ihren Port auf den Standardwert 3306 oder verwenden Sie 127.0.0.1 in der 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
);

Oder mit den Standardeinstellungen:

$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
quelle
0

Der mySQL-Client versucht standardmäßig, eine Verbindung über eine lokale Datei herzustellen, die als Socket bezeichnet wird, anstatt eine Verbindung zur Loopback-Adresse (127.0.0.1) für localhost herzustellen.

Der Standardspeicherort dieser Socket-Datei, zumindest unter OSX, ist /tmp/mysql.sock .

SCHNELLE, WENIGER ELEGANTE LÖSUNG

Erstellen Sie einen Symlink, um das Betriebssystem zu täuschen, den richtigen Socket zu finden.

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

RICHTIGE LÖSUNG

Ändern Sie den in der startMysql.shDatei in definierten Socket-Pfad /Applications/MAMP/bin.

ein Hai
quelle