PHP MySQL Datenbank Klasse (einfach & sicher)

Mit dieser PHP MySQL Datenbank Klasse kannst du innerhalb weniger Sekunden eine Verbindung zu deiner Datenbank aufbauen und sichere SQL Queries ausführen.

Einfach, flexibel und dennoch sicher: Diese PHP MySQL Datenbank Klasse nutzt die mysqli-Erweiterung und Prepared Statements, wodurch SQL-Injection Angriffe automatisch verhindert werden. Dadurch ist sie auch prima für Einsteiger geeignet.

PHP MySQL Datenbank Klasse

Für eine bessere Kontrolle über den Code habe ich ein GitHub Repository angelegt. Nutzbar ist diese Klasse für alle aktuellen PHP Versionen (einschließlich PHP 8.2).

Du darfst diese Klasse frei und kostenlos für deine Projekte (auch kommerziell) verwenden und natürlich beliebig erweitern und verändern. Über Issues oder Pull Requests im Repo würde ich mich auch freuen – lasst uns diese Klasse stetig verbessern.

Schritt 1: Datenbank Klasse ins Projekt kopieren

Für den ersten Schritt kopierst du dir die komplette Klasse und erstellst in deiner Projektstruktur eine neue Datei, z.B. Database.php mit folgendem Inhalt:

<?php

/**
 * Simple PHP MySQLi Database class for PHP7.* & PHP8.*
 * ----------------------------------------
 * This class provides a simple way to connect to your database and execute your queries.
 * It uses prepared statements to prevent SQL injections.
 * 
 * @author LH
 * @link https://webdeasy.de/en/php-mysql-database-class
 */
class Database {

  private $host, $database, $username, $password, $connection;  // connection credentials
  private $port = 3306; // default port

  private $affected_rows;  // properties to save before executing next query

  /**
   * Sets the connection credentials to connect to your database.
   *
   * @param string $host - the host of your database
   * @param string $username - the username of your database
   * @param string $password - the password of your database
   * @param string $database - your database name
   * @param integer $port - the port of your database
   * @param boolean $autoconnect - to auto connect to the database after settings connection credentials
   */
  function __construct($host, $username, $password, $database, $port = 3306, $autoconnect = true) {
    $this->host = $host;
    $this->database = $database;
    $this->username = $username;
    $this->password = $password;
    $this->port = $port;

    if ($autoconnect) $this->open();
  }

  /**
   * Open the connection to your database.
   */
  function open() {
    $this->connection = new mysqli($this->host, $this->username, $this->password, $this->database, $this->port);
  }

  /**
   * Close the connection to your database.
   */
  function close() {
    $this->connection->close();
  }

  /**
   *
   * Execute your query
   *
   * @param string $query - your sql query
   * @param array $parameters - your parameters to bind to your query
   * @return mysqli_result result of the executed query 
   */
  function query($query, $parameters = array()) {
    // reset data of last query
    $this->affected_rows = 0;

    // prepare the query
    $stmt = $this->connection->prepare($query);

    // check if prepare statement failed
    if ($stmt === false) {
      die("Error in prepare statement: " . $this->connection->error);
    }

    // check if parameters are given
    if (!empty($parameters)) {
      $types = "";
      $bindParams = [];

      // get the types of the parameters
      foreach ($parameters as $param) {
        if (is_int($param)) {
          $types .= "i";
        } elseif (is_double($param)) {
          $types .= "d";
        } else {
          $types .= "s";
        }
        $bindParams[] = $param;
      }

      // bind the parameters to the query
      $stmt->bind_param($types, ...$bindParams);
    }

    // execute the query
    if ($stmt->execute()) {
      $result = $stmt->get_result();
      $this->affected_rows = $stmt->affected_rows;
      $stmt->close();
      return $result;
    } else {
      die("Error executing query: " . $stmt->error);
    }
  }

  /**
   * Get the amount of affected rows of the last executed query.
   * @return integer
   */
  function get_affected_rows() {
    return $this->affected_rows;
  }

  /**
   * Get the last inserted id of the last executed query.
   * @return integer
   */
  function get_last_inserted_id() {
    return $this->connection->insert_id;
  }
}

Schritt 2: PHP MySQL Datenbank Klasse einbinden

Dein restlicher Programmcode sollte in einer anderen PHP-Datei geschrieben sein. Dort fügst Du folgenden Code ein um die Klasse einzubinden:

require_once("path/to/your/file/Database.php");

Schritt 3: Datenbank Instanz erstellen

Um eine Verbindung zu deiner MySQL Datenbank aufzubauen, müssen wir eine Instanz der Klasse erstellen. Dazu benötigen wir die Zugangsdaten zur Datenbank. Die optionalen Parameter des Konstrukturs kannst du der Readme entnehmen. So könnte ein Aufruf aussehen:

$database = new Database("localhost", "testuser", "verySafePassword", "yourDatabase");

Mit den übergebenen Zugangsdaten wird versucht eine Verbindung zur Datenbank aufzubauen. Das passiert automatisch, falls der Parameter $autoconnect auf true steht (s. Zeile 27).

Falls Du keine Fehler angezeigt bekommst, ist die Verbindung zur Datenbank erfolgreich hergestellt. Jetzt kannst Du deine SQL-Abfragen formulieren.

Schritt 4: Eigene SQL Queries ausführen

Die Queries kannst du der Funktion query($query, $params) übergeben. Das Query wird an die Datenbank geschickt und die Funktion gibt das Result als Ergebnis zurück.

Die Funktion erwartet zwei Parameter: zum einen den Query-String und ein Array mit Parametern. Alle Werte ersetzt du durch ein ? in deinem Query. Diese dienen als Platzhalter und werden im $params Array übergeben. Die Anzahl der Fragezeichen und die Anzahl der Parameter des $params Arrays müssen übereinstimmen. Ich denke am verständlichsten wird das, wenn wir uns Codebeispiele dazu anschauen.

Beispiel: Insert Query

$query = "INSERT INTO users (id, name) VALUES (?, ?);";
$params = array(1, "Peter Parker");

$database->query($query, $params);

Beispiel: Select Query

$query = "SELECT name FROM users WHERE id = ?";
$params = array(1);

$result = $database->query($query, $params);

while($row = mysqli_fetch_assoc($result)) {
  echo "Name: " . $row["name"];
}

Beispiel: Update Query

$query = "UPDATE users SET name = ?, nickname = ?, updated = now() WHERE id = ?";
$params = array("Tony Stark", "Iron Man", 42);

$result = $database->query($query, $params);

Beispiel: Delete Query

$query = "DELETE FROM users WHERE registered < ?";
$params = array(date("Y-m-d"));  // returns the current date

$result = $database->query($query, $params);

Beispiel: Letzte eingefügte ID auslesen

$query = "INSERT INTO users (id, name) VALUES (?, ?);";
$params = array(1, "Peter Parker");

$database->query($query, $params);

echo $database->get_last_inserted_id();

Beispiel: Geänderte Zeilen auslesen

$query = "DELETE FROM users WHERE id = ?";
$params = array(42);

$result = $database->query($query, $params);

echo "Deleted rows: " . $database->get_affected_rows();

Hinweis: Diese Funktion gibt den Wert für affected_rows und num_rows zurück.

Außerdem solltest du am Ende Deines Programms noch die close()-Funktion aufrufen, um geöffnete Datenbankverbindungen zu schließen.

$database->close();

Zusammenfassung

Diese PHP MySQL Datenbank Klasse ist so klein wie möglich und stellt nur die notwendigsten Funktionen bereit. Gerade als Anfänger sollte diese Klasse deshalb genau das richtige für dich sein. Trotzdem sind natürlich alle sicherheitsrelevanten Aspekte bedacht.

Beschreibungen aller Funktionen findest du hier im GitHub Repository. Sicherheitshinweise oder Verbesserungsvorschläge gerne als Issue ins GitHub Repository.

Ähnliche Beiträge
Beteilige dich an der Unterhaltung

7 Kommentare

  1. Gast sagt:

    Hallo!,Ihre class Database mit Insert funktioniert nicht,wenn die Datensätzeaus Formular eingegeben werden gibt ein weisses leeres Blatt aus.GrußGast

    1. Lorenz sagt:

      Das kommt aber vermutlich nicht von der Datenbankklasse, sondern hat eher etwas mit dem Übertragen der Daten an das PHP-Skript zu tun…

      Viele Grüße

      LH

      1. Gast sagt:

        Danke!,Ich hatte oft mit prozedurale Datenbank Scripte in php geschrieben,und schon sauber sql-injection bereinigt Datensätze ausgelesen.Ich bin neu was die Datenbank klasse betrefft,das heißt nichtdas ich nicht db class instanzieren kann.Ich habe schon andereKlassen mit einem php Skript ausgelesen und ausgeführt.GrußGast

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

bold italic underline strikeThrough
insertOrderedList insertUnorderedList outdent indent
removeFormat
createLink unlink
code

Das könnte dich auch interessieren