2010-09-09 21 views
5

Ich bin auf der Suche nach einer Möglichkeit, nur den Verbindungsteil einer PHP/MySQL-Verbindung zu testen. Ich migriere von einem LAMP-Server, der auf Vista gebaut wurde, zu dem gleichen auf Ubuntu und habe Probleme, mysqli zum Laufen zu bringen. Ich weiß, dass alle richtigen Module installiert sind, und PhpMyAdmin funktioniert einwandfrei. Ich habe eine Site migriert und keine der mysqli-Verbindungen funktioniert. Der Fehler, den ich bekomme, ist der "Aufruf an die Member-Funktion xxx() für Nicht-Objekt", der normalerweise erscheint, wenn entweder die Abfrage selbst fehlerhaft ist oder die Abfrage von einer schlechten Verbindung vorbereitet wird. Ich weiß, dass die Abfrage selbst gut ist, weil sie auf dem anderen Server mit genau der gleichen Datenbankstruktur und Daten funktioniert. Das gibt mir die Verbindung. Ich habe versucht, einen sehr einfachen Test-Verbindung zu schreiben und es in einer Schleife setzen wie ..Testen von PHP/Mysqli Verbindung

if(***connection here ***) 
{ echo "connected"; } 
else 
{ echo "not connected"; } 

Es Echos „verbunden“, was toll ist. Aber nur um zu überprüfen, änderte ich das Passwort in der Verbindung, so dass ich wusste, dass es nicht in der Lage wäre, eine Verbindung herzustellen und es immer noch "verbunden". Also, der if/else Test ist eindeutig nicht der Weg zu gehen ....

+0

Können Sie mir bitte zeigen, wie Sie die *** Verbindung tun hier *** (Sie können den Benutzer und das Passwort weglassen)? – 2ndkauboy

+0

"Aufruf an Member-Funktion xxx() auf Non-Objekt" Fehler hat nichts mit Datenbankverbindung zu tun. –

Antwort

11

mysqli_connect() gibt immer ein MySQLi-Objekt zurück. Um nach Verbindungsfehlern zu suchen, verwenden Sie:

$mysqli_connection = new MySQLi('localhost', 'user', 'pass', 'db'); 
if ($mysqli_connection->connect_error) { 
    echo "Not connected, error: " . $mysqli_connection->connect_error; 
} 
else { 
    echo "Connected."; 
} 
+1

Das hat funktioniert. Danke, Lek. Natürlich hat es nur das Geheimnis vertieft. Ich weiß jetzt, dass die Datenbank tatsächlich verbindet, was bedeutet, dass mein Skript tatsächlich das Bit bei der Abfrage selbst ausspuckt. Dies ist noch weniger sinnvoll, da die Abfrage selbst auf anderen Servern ausgeführt wird. Ich habe sogar eine einfache Testabfrage geschrieben, die leider immer noch den Nicht-Objekt-Fehler zurückgibt. –

+0

else { echo "Verbunden."; } hinzufügen; –

0

Sie brauchen dann mehr Fehlerbehandlung bei den verschiedenen Datenbankaufrufen. Schnell/schmutzige Methode ist einfach tun

$whatever = mysqli_somefunction(...) or die("MySQL error: ". mysqli_error()); 

Alle Funktionen zurückgeben boolean FALSE, wenn ein Fehler aufgetreten, oder ein entsprechendes mysqli-Objekt mit den Ergebnissen. Ohne die Fehlerprüfung, dann würden Sie tun:

$result = $mysqli->query("blah blah will cause a syntax error"); 
$data = $result->fetchRow(); // $result is "FALSE", not a mysqli_object, hence the "call to member on non-object" 
+1

Die Verwendung von 'mysql_error()' mit MySQLi ist dumm;) – Lekensteyn

+0

Ja, Tippfehler. Jetzt behoben. –

+0

sterben Ich bin immer schlecht. Senden Sie mindestens 503 Status und ** nie ** irgendwelche sensiblen Informationen wie mysql Fehlermeldung. Verwenden Sie stattdessen trigger_error(). Obwohl es hier ziemlich nutzlos ist, da PHP Fehlermeldung ist schon ziemlich informativ, wenn überhaupt –

0

Für Test PHP-Verbindung in Sie Terminal ausführen:

$ php -r 'var_dump(mysql_connect("localhost:/tmp/mysql.sock", "MYSQL_USER", "MYSQL_PASS"));'