PHP 7.* MySQL-Datenbank Klasse (+ Download)

PHP 7.* MySQL-Datenbank Klasse (+ Download) Thumbnail
Veröffentlicht am 10. Mai 2020

Mit dieser PHP MySQL (MySQLi) Datenbank Klasse brauchst Du nervigen Code nicht immer wieder zu schreiben, sondern kannst zukünftig ganz einfach diese Klasse benutzen.

Anzeige

Diese Klasse ist ganz einfach und flexibel für jedes Deiner Projekte aufgebaut. Ganz nach dem Motto: Keep it small, keep it simple.

Außerdem habe ich eine Methode eingebaut, um SQL-Injection Angriffe zu verhindern. Diese solltest Du unbedingt verwenden, um dich vor potenziellen Angriffen zu schützen.

Ab PHP 7.0 wurde das veraltete MySQL Modul (mysql_) entfernt, sodass man auf MySQLi (mysqli_) zurückgreifen muss. Alternativ kann man auch das MySQL PDO Interface verwenden. Beide haben Vor- und Nachteile. Beispielsweise die Verwendung von Prepared Statements wird von PDO unterstützt.

Nutzbar ist diese Klasse für alle aktuellen PHP Versionen (einschließlich PHP 7.4) – Stand Mai 2020.

Anzeige

Die unten stehende Klasse darfst Du frei und kostenlos für Deine Projekte (auch kommerziell) verwenden und natürlich beliebig erweitern und verändern. Und so verwendest Du sie:

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. Anschließend kopierst du den kompletten unten stehenden Code dort hinein.

<?php
/**
* Simple MySQLi Database class for PHP7.*
* The class contains main functions for your database. For a detailed documentation, see: https://webdeasy.de/php-database-class
* created 08.11.2017
* updated: 10.05.2020
* 
* @author LH
*/
class Database {

	private $host, $database, $username, $password, $connection;
	private $port = 3306;
	
	/**
	* 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
	* @return the result of the executed query 
	*/
	function query($query) {
		return $this->connection->query($query);
	}

	/**
	* Escape your parameters to prevent SQL Injections! Usage: See documentation (link at the top of the file)
	*
	* @param string $string - your parameter to escape
	* @return the escaped string 
	*/
	function escape($string) {
		return $this->connection->escape_string($string);
	}
}
?>

2. Datenbank Klasse einbinden

Dein Programmcode läuft in einer anderen PHP-Datei. Dort fügst Du folgenden Code ein um die Klasse einzubinden:

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

Wo ist eigentlich der Unterschied zwischen require und include? Das!

3. Instanz erstellen

Um eine Verbindung zur 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 Klasse entnehmen. So könnte ein Aufruf aussehen:

Anzeige
$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 25).

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

4. Parameter maskieren!

Anschließend folgt der wohl wichtigste Schritt. Um SQL-Injections vorzubeugen, muss jeder Parameter, den Du im Query verwendest maskiert (escaped) werden. Dadurch kann verhindert werden, dass schädliche SQL-Anweisung – ob absichtlich oder unabsichtlich – in dein Query und somit in dein Serversystem gelangen. Folgende Zeilen sollten unbedingt vor jede Abfrage:

$parameter = $_REQUEST["id"];
$parameter = $database->escape($parameter);

In diesem Beispiel wird der Parameter id der per Request an PHP übergeben und durch die zweite Zeile maskiert.

5. Eigene SQL Queries ausführen

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

Anzeige

Beispiel für ein Insert-Query:

$query = "INSERT INTO users (id, name) VALUES (1, 'Peter Parker');";
$database->query($query);

Beispiel für ein Select-Query mit Ausgabe des Results:

$query = "SELECT name FROM users WHERE id = 1";
$result = $database->query($query);

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

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

$database->close();

Letztendlich sind das die Funktionen der Datenbank Klasse. Ich habe sie so einfach wie möglich gehalten, aber trotzdem versucht alle wichtigen und sicherheitsrelevanten Funktionen einzubauen. Und Ja: Mir ist bewusst, dass PHP und die MySQLi Klasse noch deutlich mehr Funktionen zu bieten hat. Diese Klasse ist aber gerade für einfache, schnelle und flexible Anwendung gedacht, die nur eine einfache Datenbankverbindung erfordern.

Sicherheitshinweise oder Verbesserungsvorschläge gerne in die Kommentare, damit ich sie ergänzen kann! 🙂

Ähnliche Beiträge
Beteilige dich an der Unterhaltung

2 Kommentare

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