wake-up-neo.com

Verwirrendes Nur-PDO-Problem: Verbindung über Socket kann nicht hergestellt werden/Zugriff verweigert/Verbindung zum Server kann nicht hergestellt werden (freigegebener Host)

Das Problem änderte sich von dem, was es war. Ich lasse die ursprüngliche Frage unten, um schlechte Bewertungen von Antworten zu verhindern, wie ich es hatte, nachdem jemand seine Frage bearbeitet hatte:

Also arbeite ich an einem (wirklich lahmen) Shared Hosting, auf dem PDO installiert ist, aber es funktioniert nicht. Mit Standardparametern

<?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();
    }
?>

es wirft diese Nachricht:

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

Mit einem einfachen mysql_connect funktioniert es.

Und der Socket-Pfad scheint korrekt zu sein (sowohl phpinfo als auch diese Abfrage:

show variables like 'socket';

bestätigen.

Localhost leitet auf 10.103.0.14 um (diese Daten stammen von mysql_get_Host_info () und in phpMyAdmin)

Wenn ich in der PDO localhost durch 127.0.0.1 ersetze, bekomme ich es

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

Und wenn ich localhost durch 10.103.0.14 ersetze:

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

Beide IP-Adressen (127.0.0.1 und 10.103.0.14) funktionieren mit mysql_connect.

Anscheinend kommt das Problem also von der PDO-Verbindung.

Weiß jemand, woher das kommen könnte und/oder eine Möglichkeit, das Problem zu beheben?

Einige Server-Daten:

Die PHP Version: 5.2.10 Sie können die phpinfo des Servers anzeigen: http://web.lerelaisinternet.com/abcd.php?v=5 Keine Befehlszeile möglich. (Ich weiß, dass es die Aufgabe des technischen Supports sein sollte, aber sie sind wirklich langsam).

Vielen Dank

Vorherige Frage:

So finden Sie die mysql.sock auf einem gemeinsam genutzten Host (ein schwieriger Weg ...)

Das heutige Problem ist also: Die PDO-Verbindung funktioniert nicht auf einem gemeinsam genutzten Host, und es sollte (auf dem Server installiert) werden. Nur eine einfache PDO-Verbindung:

<?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();
    }
?>

wirft diese Nachricht:

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

Eine reguläre MySQL-Verbindung:

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

funktioniert gut.

Es kann also anscheinend keine .sock. Finden. Ich denke, die Angabe der korrekten Adresse sollte funktionieren. Ich habe versucht, einige "klassische" mysql-Pfade zu verwenden, die ich im Internet gefunden habe An dieser Adresse (/var/lib/mysql/mysql.sock)[.____.(( Die PHP-Version ist 5.2.10) Sie können die phpinfo des Servers sehen: http : //web.lerelaisinternet.com/abcd.php? v = 5

Also versuche ich herauszufinden, wo zum Teufel es ist !!! Ich habe versucht, in der phpMyAdmin-Benutzeroberfläche nachzuschauen, aber ich konnte die Informationen nicht finden. Außerdem scheint es, dass phpMyAdmin eine Verbindung zu einem anderen Server herstellt hat eine andere IP-Adresse, und wenn Sie versuchen, eine Verbindung mit PHP herzustellen, wird der Fehler "Falsches Kennwort" angezeigt. Der mysql_connect stellt auch eine Verbindung zu dieser Adresse her. Ich denke, er leitet mit einem internen Passwort/Login auf einen anderen Server um.

Wenn Sie eine Idee haben, wie Sie diese Informationen erhalten können (der technische Support des Providers ist "Beheben des Problems" ... es war 1 Monat ...). Vielleicht kommt das Problem auch von woanders, aber das gleiche Zeug funktioniert auf anderen Shared Hosts ...

Die Notwendigkeit von PDO besteht darin, dass ich das Symfony-Framework mit Doctrine für diese Website verwende und das Doctrine-Plugin PDO benötigt ... Ich möchte die Website nicht von Grund auf neu erstellen!

Danke für Ihre Hilfe !

15
Julien

Dies wurde bereits als beantwortet markiert, aber nicht wirklich gelöst (ohne die Datenbanken zu ändern). Also, falls jemand wie ich dieses Problem auch hat ...

Der einfachste Weg, dieses Problem zu beheben, besteht darin, zunächst den Socket-Pfad abzurufen (entweder über die Datei php.ini oder über: phpmyadmin oder über die Konsole (oder in mysql oder mysqli).

... um die folgende Abfrage auszuführen (alles außer PDO):

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

Dann ändern Sie in der PDO-Verbindungszeichenfolge den Socket anstelle eines Hostnamens:

$ dbc = new PDO ("mysql: unix_socket =/var/run/mysqld/mysqld.sock; dbname = $ DBName"), $ Benutzer, $ Kennwort, Array (PDO :: ATTR_PERSISTENT => true)); // mit beständigen Verbindungen

Das hat für mich funktioniert.

21
Brent

FWIW, ich hatte dieses Problem und habe meinen Host von 'localhost' in '127.0.0.1' geändert. 

Ich habe keine Ahnung, warum localhost nicht funktionierte, aber das hat den Trick gebracht.

Seltsam ist, wir haben Unmengen von Servern und es funktioniert auf fast jedem Server, der 'localhost' verwendet.

15
zmonteca

Läuft Ihr Server mit SeLinux (erzwungen)? Wenn ja, versuchen Sie es als root auszuführen:

# setsebool -P httpd_can_network_connect on
7
Rodrigo Renie

Können Sie 127.0.0.1 anstelle von localhost als Servernamen verwenden?

IIRC entscheidet bei einigen mySQL-Treibern/Adaptern, ob der Socket für den Verbindungsaufbau verwendet wird oder nicht.

4
Pekka 웃

Führen Sie die Abfrage mit der funktionierenden Verbindung aus:

show variables like 'socket';

(verhält sich wie eine select-Anweisung) ... und Sie erhalten den Pfad des laufenden Sockets. 

Überprüfen Sie dann die Dateiberechtigungen.

4
symcbean

Ich hatte das Problem, dass die Produktionsversion einwandfrei funktionierte und eine Testversion keine Verbindung zu PDO herstellen konnte:/ Beide Versionen befanden sich auf denselben Servern, test in einem Unterverzeichnis.

Das Update ersetzte in DSN den localhost für ip.

'mysql:Host=localhost;dbname=db'

wurden

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

versuchen:

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

daraufhin sollte die konfigurierte Steckdose angezeigt werden.

2
Rufinus

Ich fand diese Seite, nachdem ich genau das gleiche Problem hatte. Ich bin auf einem Server, auf dem nur Apache & PHP ausgeführt wird - MySQL ist auf einem anderen Rechner installiert. Ich habe sowohl den DNS-Namen des Servers als auch seine IP-Adresse ausprobiert und bestätigt, dass ich einen Ping-Vorgang durchführen kann. Eine PHP -Anwendung auf derselben Maschine spricht mit der Datenbank gut und verwendet die alte Syntax mysql_connect (). Aber PDO aus der CLI warf diesen Fehler. 

Die Lösung für mich war, meinen DSN zu überprüfen. Jeder Tippfehler im DSN selbst wird still ignoriert, und PDO geht davon aus, dass Sie localhost meinen. Mein Problem war, dass ich "name =" anstelle von "dbname =" im DSN hatte.

1
phpguru

Ich habe den Grund für das seltsame Verhalten gefunden. Wenn sich die Bindungsadresse von 127.0.0.1 oder 0.0.0.0 (alle Adressen) unterscheidet, kann PDO keine Verbindung zu 127.0.0.1 herstellen.

1
Franz

Das Problem in der Mysql-Konfiguration Sie müssen die Option skip-networking In der Konfigurationsdatei my.conf deaktivieren. Dies sollte einwandfrei funktionieren. Referenz http: //www.wolfcms .org/forum/post7098.html # p7098

0
Ahmed Aswani

Mein Problem kann sich vom OP unterscheiden, aber ich dachte, es lohnte sich zu posten. Ich habe ein Software-Upgrade auf einer VM durchgeführt, dann einen Neustart durchgeführt und die Fehlermeldung des OP erhalten. Es stellte sich heraus, dass es ein Out-of-Memory-Problem war, das den Start von mysql verhinderte. Durch das Löschen einiger großer Dateien wurde das Problem behoben.

0
David

Ich habe gerade ein ähnliches Problem gelöst. Meine Vermutung ist, dass Sie wahrscheinlich Ihre mysql_connect () - Anweisung durch das PDO-Äquivalent ersetzt haben. Vergessen Sie nicht, dass Sie noch eine Menge anderen Codes haben, der von dieser alten Verbindungsanweisung abhängig ist. Versuchen Sie, den mysql_connect an Ort und Stelle zu halten, während Sie den PDO-Code schreiben.

0
user1389749

Was für mich funktionierte, war die Angabe der Portnummer wie folgt:

mySQL: Hostname; Port = 3306; Datenbankname = Datenbankname;

Dies führte dazu, dass eine Verbindung zu einer lokalen Datenbank hergestellt werden konnte. Jetzt arbeite ich daran, dass es mit einer Remote-DB funktioniert. 

0
Nick Res