MySQL Datenbankverbindung mit PDO und PHP

Veröffentlicht von mario am

Heute möchte ich ein kleines Stück Wissen über die Programmiersprache PHP weitergeben.

Wie ich zur Programmierung gekommen bin erkläre ich in diesem Beitrag: Mein Weg in die Welt der Programmierung

In diesem Beitrag zeige ich dir wie du eine MySQL Datetenbankverbindung mit PDO in PHP aufbaust.

Um eine Verbindung mit einer Datenbank aufzubauen wird in der Regel PDO verwendet, diese Abkürzung steht für PHP Data Objects und ermöglicht es dir mit einem einfachen Code eine Datenbankverbindung aufzubauen, dabei ist es egal welche Datenbank im Hintergrund läuft, denn PDO hat diverse Treiber für die einzelnen Datenbanken implementiert und du als Programmierer musst nicht viel an Code ändern wenn du die Datenbank wechselst.

PDO gibt es seit PHP 5.1, oder als PECL-Erweiterung für PHP 5.0.

Hier die grundlegende Verbindung zur Datenbank:

$db = new PDO('mysql:host=localhost;dbname=test', $username, $password);

Um die Verbindung wieder zu beenden muss das PDO-Objekt gelöscht werden in dem du den Wert NULL zuweist:

$db = new PDO('mysql:host=localhost;dbname=test', $username, $password);$db = new PDO('mysql:host=localhost;dbname=test', $username, $password);

// hier kommt die Programmlogik

$db = NULL;

Ansonsten beendet PHP die Verbindung automatisch wenn das Script zu ende ist.

Ich persönlich erstelle für die Datenbankverbindung meist eine eigene Klasse:

/**
 * Datenbank
 */
class DB {

    /**
     * Aufbau der Datenbankverbindung mit PDO
     */
    public function connect() {

        try {
            $datasource = "mysql:host=localhost;dbname=test";
            return new \PDO($datasource, "root", "root");
        } catch (PDOException $exc) {
            echo $exc->getTraceAsString();
            die();
        }
    }

}

Datenbankabfragen

Um Daten in die Datenbank und aus der Datenbank zu bekommen kannst du wie folgt Vorgehen.

Aber Vorsicht, diese Beispiele solltest du als Sicherheitsgründen nicht in einem Projekt verwenden, hier zeige ich nur das Grundprinzip und weiter unten zeige ich eine Variante die mehr Sicherheit bringt.

Daten in der Datenbank speichern

Als erstes zeige ich dir wie du etwas in deine Datenbank bekommst.

Für die Datenbankverbindung nehme ich für alle weiteren Beispiele die oben gezeigte Klasse DB.

Diese Variante ist nicht zu empfehlen, zeigt aber gut das Grundprinzip:

// Datenbankverbindung
$db = mysqli_connect("localhost","username","password","my_db");

$sql = "INSERT INTO users (username, email, password) VALUES ('Testuser', 'test@email.com', '123456')";
mysqli_query($db, $sql);

// Datenbankverbindung schließen
mysqli_close($db);

Mit diesem Script holst du Daten aus der Datenbank:

// Datenbankverbindung
$db = mysqli_connect("localhost","username","password","my_db");

$sql = "SELECT * FROM users";
mysqli_query($db, $sql);

// Datenbankverbindung schließen
mysqli_close($db);

Prepared Statements

Die oberen Beispiele sind sehr anfällig für Manipulationen, deshalb solltest du nie Daten von Benutzern Vertrauen.

Das Prepared Statement gibt dir ein gewisses Maß an Sicherheit, natürlich ist man nie gehen alle Angriffe geschützt.

In diesem Beispiel werden die Werte nicht wie oben direkt in den SQL-Befehl geschrieben, sondern erstmal mit Doppelpunkt als Platzhalter hineingeschrieben :username, :email, :passwort

Mit der Funktion prepare() wird der SQL-Befehl erst aufbereitet.

Mit bindValue() wird dem Platzhalter der richtige Wert zugewiesen und mit execute() wird der Befehl ausgeführt.

Über die Sicherheit wird hier noch nicht eingegangen, du solltest zum Beispiel nie das Passwort im Klartext in die Datenbank speichern.

// Datenbankverbindung
$db = new DB();

// Daten
$username = "Testuser";
$email = "test@email.com";
$password = "123456";

// SQL-Befehl
$sql = "INSERT INTO users (username, email, password) VALUES (:username, :email, :password)";

$statement = $db->connect()->prepare($sql);

$statement->bindValue(':username', $username);
$statement->bindValue(':email', $email);
$statement->bindValue(':password', $password);

$inserted = $statement->execute();

// Feedback ob der Eintrag funktioniert hat oder nicht
if ($inserted) {
    echo "Eintrag erfolgreich!";
} else {
    echo "Eintrag fehlgeschlagen";
}

Die Abfrage funktioniert ähnlich:

Hier werden alle Daten abgefragt die zum Username passen.

// Datenbankverbindung
$db = new DB();

$username = "Testuser";

$sql = "SELECT * FROM users WHERE username = :username";
$statement = $this->connect()->prepare($sql);
$statement->bindValue(':username', $username);
$statement->execute();
$value = $statement->fetch();

Mehr Sicherheit

Um noch mehr Sicherheit für dein Script zu bekommen kannst du noch einige Dinge beachten.

Ausgabe von Daten aus einer Datenbank.

Es kann passieren dass zum Beispiel schadhafter JavaScript Code in der Datenbank gespeichert wurde, das ist nicht weiter schlimm, denn er sind ja nur einzelne Zeichen in der Datenbank, aber wenn es ausgegeben wird, dann wird der Code am Rechner des Benutzers ausgeführt.

Um das zu verhindern sollte jede Ausgabe durch die PHP Funktion htmlspecialchars() laufen.

Hier ein Beispiel:

// Beispieltext für die Ausgabe
$text = "Schlimmer <b>Code</b>...";

// erste Ausgabe
echo $text;

// zweite Ausgabe
echo htmlspecialchars($text);

Ergebnis erste Ausgabe, hier wird der HTML-Code direkt ausgeführt:

Schlimmer Code

Zweite Ausgabe, hier werden die HTML-Zeichen umgewandelt und nicht vom Browser ausgeführt:

Schlimmer <b>Code</b>…

Bei der zweiten Ausgabe werden folgende Zeichen umgewandelt:

  • & wird zu &amp;
  • " wird zu &quot;
  • ' wird zu &apos; oder &#039;
  • < wird zu &lt;
  • > wird zu &gt;

Passwörter in einer Datenbank speichern

Für eine sichere Verschlüsselung des Passwortes solltest du die PHP-Funktion password_hash() verwenden.

In diesem Beispiel wird das Passwort in einen sicheren Hash umgewandelt, dass in die Datenbank gespeichert werden kann.

Der Zusatz PASSWORD_DEFAULT gibt an welcher Verschlüsselungsalgorithmus verwendet werden soll, mit PASSWORD_DEFAULT wird bcrypt standardmäßig verwendet.

$password = "SicheresPasswort12345";
$passwordHash = password_hash($password, PASSWORD_DEFAULT);

echo $passwordHash;

Die Ausgabe sieht dann zum Beispiel so aus: $2y$10$1GouW6JnUaJV1X8YrsX1munpOKYK7.uDG/y1Ck3B4C0i44OY10ZGa

Bei jedem Aufruf des Scriptes kommt ein anderer Hash-Wert heraus obwohl das eingegebene Passwort immer gleich ist, das ist auch gut so, denn so wird in der Datenbank immer ein unterschiedlicher Hash-Wert gespeichert, auch wenn mehrere Benutzer das selbe Passwort verwenden.

Um beim Login zu überprüfen ob das Passwort stimmt kommt folgender Code ins Spiel.

Die Funktion password_verify() bekommt als ersten Wert das eingegebene Passwort des Benutzers und als zweites den Hash-Wert aus der Datenbank und vergleicht so die Richtigkeit.

// Passwort von User z.B. Loginformular
$password = "SicheresPasswort12345";

// Passwort-Hash aus der Datenbank
$passwortHash = "$2y$10$1GouW6JnUaJV1X8YrsX1munpOKYK7.uDG/y1Ck3B4C0i44OY10ZGa";

// Passwort überprüfen
if (password_verify($password, $passwortHash)) {
    echo "Passwort stimmt";
} else {
    echo "Passwort falsch";
}

0 Kommentare

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

4 × zwei =

*