Ich werde ein einfaches Beispiel zeigen, wie man mithilfe der PDO-Klasse von PHP eine Verbindung zu MySQL herstellt. Zu den Vorteilen von PDO gehört nur, dass es schnell ist und bei Verwendung der PDO::prepare()-Methode SQL-Injection-Angriffe verhindert, indem die PDO::quote()-Methode aufgerufen wird. Der andere Vorteil besteht darin, dass mehrere Datenbanken unterstützt werden. Tauchen wir also direkt in den Code ein:
$hostname = ‚localhost‘;
$username = ‚Ihr_Benutzername‘;
$password = ‚Ihr_Passwort‘;
versuchen {
$db = neues PDO(„mysql:host=$hostname;dbname=mysql“, $username, $password);
echo ‚Mit Datenbank verbunden‘;
}
Catch(PDOException $e) {
echo $e->getMessage();
}Schwerwiegender Fehler bei neuer PDO-Instanz
Nur ein wichtiger Hinweis: Wenn Sie in Ihrer Entwicklungsumgebung den folgenden schwerwiegenden Fehler erhalten:
Schwerwiegender Fehler: Nicht abgefangene Ausnahme „PDOException“ mit der Meldung „SQLSTATE[42000] [1049] Unbekannter Datenbank-„Benutzer“ in C:\Programme\Apache Software Foundation\Apache2.2\htdocs\test\trunk\code\login\1\classes\std.pdo_singleton.class.inc:30 Stack-Trace: #0 C:\Programme\Apache Software Foundation\Apache2.2\htdocs\test\trunk\code\login\1\classes\std.pdo_singleton.class. inc(30): PDO->__construct(‚mysql:host=loca…‘, ‚username‘, ‚password‘) #1 C:\Programme\Apache Software Foundation\Apache2.2\htdocs\test\trunk\code\login\1\classes\std.mysql.class_test.inc(43): db::getConnect() #2 C:\Programme\Apache Software Foundation\Apache2. 2\htdocs\test\trunk\code\login\1\connect.php(6): MySqlDb->confirmUserPass(‚usertest‘, ‚passtest‘) #3 {main} wird in C:\Program Files\Apache Software Foundation\Apache2.2\htdocs\test\trunk\code\login\1\classes\std.pdo_singleton.class.inc in Zeile 30 geworfen
Sieht ziemlich chaotisch aus und ist schwer zu entziffern. Wenn ich versuche, den Fehlercode zu entschlüsseln, schaue ich mir normalerweise den ersten Fehler an, der mich erkennen lässt, warum er eine „Unbekannte Datenbank“ gemeldet hat, als er existierte. Die zusätzlichen Zitate gaben mir auch einen Hinweis auf das Problem. Daher kam ich zu dem Schluss, dass das Problem darin bestand, dass die Werte von host und/oder dbname in zusätzliche Anführungszeichen gesetzt wurden. Folgendes erzeugt den vorherigen Fehler:
$db = new PDO(„mysql:host=’localhost‘;dbname=’mysql'“, $username, $password);
Wenn Sie also keine Variablen verwenden, fügen Sie die Werte von Host und Datenbankname nicht in einfache Anführungszeichen ein. Mit anderen Worten, verwenden Sie stattdessen den folgenden Code:
$db = neues PDO(„mysql:host=localhost;dbname=mysql“, $username, $password);
Dies ist ein einfacher Test zum Herstellen einer Verbindung zu Ihrer MySQL-Datenbank oder einer anderen Support-Datenbank. Nur zu Ihrer Information: Wenn Sie eine Verbindung zu PostgreSQL herstellen möchten, einer weiteren beliebten und robusten Datenbank, verwenden Sie den folgenden Code anstelle der Instanziierungszeile:
$db = new PDO(„pgsql:dbname=pdo;host=localhost“, „username“, „password“ );
Wenn Sie sich in einer Entwicklungsumgebung befinden und Ihre Fehler direkt auf dem Bildschirm anzeigen möchten, können Sie die angezeigten Fehler angeben. Sie müssen Ihre display_errors-Einstellungen in Ihrer php.ini-Datei auf „on“ setzen. Legen Sie also Ihre Fehlerattribute nach der Instanziierung der PDO-Klasse wie folgt fest:
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
Es gibt drei Arten von Fehlerberichtseinstellungen für PDO::ATTR_ERRMODE:
PDO::ERRMODE_SILENT = Fehlercodes
PDO::ERRMODE_WARNING = E_WARNING
PDO::ERRMODE_EXCEPTION = Ausnahmen auslösen
Hier ist ein Beispiel für die Implementierung von PDO::ATR_ERRMODE:
$hostname = ‚localhost‘;
$username = ‚Ihr_Benutzername‘;
$password = ‚Ihr_Passwort‘;
versuchen {
$db = new PDO(„mysql:host=$hostname;dbname=articles“, $username, $password);
echo ‚Mit Datenbank verbunden‘; // Auf Verbindung prüfen
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);
$sql = ‚Wählen Sie * aus Tutorialref aus, wobei die ID=1 ist‘;
$result = $db->query($sql);
foreach ($result as $row) {
echo $row[‚id‘] .‘ – ‚. $row[‚author‘] . “;
}
$db = null; // Datenbankverbindung schließen
}
Catch(PDOException $e) {
echo $e->getMessage();
}
Verwechseln Sie dies nicht mit den Fehlern, die durch die PHP-Einstellung von error_reporting generiert werden. Die Fehler von PDO::ATTR_ERRMODE gelten für die SQL-Abfrage und ihre Ergebnisse. Ich werde in einem zukünftigen Artikel auf die Fehlereinstellungen und die verschiedenen Ausgaben der php.ini-Fehlerberichtseinstellungen und PDO::ATTR_ERRMODE-Berichtseinstellungen eingehen.