Verbindung zur Datenbank checken - PHP?
Hi, ich hab folgende Funktion in einer Klasse dbConenction:
private mixed $connection;
public function __construct()
{
return $this->connect();
}
private function connect()
{
try {
$host = "localhost";
$username = "USER_NAME";
$pwd = "PWD";
$database = "DB_NAME";
$this->connection = new mysqli($host, $username, $pwd, $database);
if ($this->connection->connect_error) {
throw new Exception("Connection to database failed. | " . $this->connection->connect_error);
}
return $this->connection;
} catch (Exception $exception) {
$this->connection = null;
databaseErrorHandling($exception);
return null;
}
}
Die Verbindung zur Datenbank funktioniert auch, ich kann Queries ausführen. Doch mein Problem, wenn ich zum Beispiel den Username für die Datenbank ändere, soll eigentlich durch
if ($this->connection->connect_error)
eine Exception geworfen werden, weil die Verbindung ja nicht aufgebaut werden kann, da der Username falsch ist. Das Gleiche funktioniert auch nicht, wenn ich zum Beispiel das Passwort ändere. Hab in den Docs von PHP nachgelesen und dort haben die das genauso gemacht...
$servername = "localhost";
$username = "username";
$password = "password";
// Create connection
$conn = new mysqli($servername, $username, $password);
// Check connection
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
Jemand eine Idee, warum das nicht funktioniert, so wie es funktionieren sollte :D, oder Verbesserungsvorschläge?
Danke für jede Hilfe!!!
4 Antworten
Ob Fehler angezeigt werden oder nicht, hängt vom gesetzten error_level ab. Wenn ich den bspw. auf 0 setze:
error_reporting(0);
kann ich nachfolgend so viele Exceptions werfen, wie ich lustig bin, ohne dazu eine Fehlermeldung auf der Webseite zu erhalten (es sei denn, der Server verabschiedet sich irgendwann).
Die möglichen Fehlerstufen kannst du hier nachschlagen. Bedenke, dass genaue Fehlermeldungen auf einem Produktionssystem möglichst vermieden werden sollten. Anwender brauchen nicht mit der internen Technik konfrontiert werden.
Statt eine Exception zu werfen, würde ich allerdings mit boolschen Werten arbeiten, denn die verbrauchen weniger Speicher und sind vollkommen ausreichend. Die genaue Fehlerursache kannst du dir ja trotzdem in ein Log schreiben.
Für die Behandlung des Ausnahmefalls kann man im einfachsten Fall das Skript beenden:
die('There was an internal error. Please come back later.');
oder schöner, auf eine spezielle Fehlerseite weiterleiten.
header('Location: error.html');
exit;
Mir fällt zumindest spontan auf, dass ein Anführungszeichen fehlt.
$host = "localhost; < hier.
Hab mich dann wohl hier in gutefrage verschrieben :)
if ($conn->connect_errno) {
echo "Verbindungsprobleme " . $conn->connect_error;
}
Ich geb Verbindungsfehler so aus, breche also nicht mit die() ab.
die exeption läuft in databaseErrorHandling()
was passiert denn da? da wird das irgendwie verworfen bzw läuft ins leere.
Ne, da wird nur ne Mail an mich gesendet und der Fehler in ein LogFile geschrieben. Ich hab auch schon mal probiert, das throw new Exception auszukommentieren und dort dann so was wie die(„Verbindung fehlgeschlagen“) zu schreiben, um wenigstens sehen zu können, dass php merkt, die Verbindung funktioniert nicht, doch da wurde mir das die() auch nicht angezeigt :(. Es muss dementsprechend an dem Connect-> error liegen, oder?
in
if ($this->connection->connect_error) {
throw new Exception("Connection to database failed. | " . $this->connection->connect_error);
}
schmeisst du eine exeption.. das heisst ertmal nix wenn diese nicht behandelt wird (logfile, programmabbruch, consolen-ausgabe, etc) und das sehe ich hier nicht, dass das iwie behandelt wird.. mach man anstatt das throw exception ein echo rein.
In meinem Code steht da ein Server, hab den für gutefrage aber zu localhost geändert. Daran kann’s also nicht liegen, trotzdem danke! :)