php: Datenbank

Datenbank

Datenbankverbindung aufbauen:

In PHP existieren drei Varianten um auf eine MySQL Datenbank zuzugreifen.
Die älteste nutzt die MySQL Erweiterung , die aber seit PHP 5.5.0 als veraltet markiert wurde und in PHP 7 komplett entfernt wurde.
Die zweite Möglichkeit ist mittels der MySQL Improved Extension (MySQLi) und die letzte Möglichkeit ist mittels PHP Data Objects (PDO).
<?php
$pdo = new PDO('mysql:host=localhost;dbname=test', 'username', 'password');
?>

Datenbankabfrage:

Nachdem ihr die Datenbankverbindung aufbauen habt und diese in der Variable $pdo gespeichert habt, könnt ihr nun mittels der Funktion query($sql) eine Abfrage an die Datenbank senden.
<?php
$pdo = new PDO('mysql:host=localhost;dbname=test', 'username', 'password');

$sql = "SELECT email, vorname, nachname FROM users";
foreach ($pdo->query($sql) as $row) {
echo $row['vorname']." ".$row['nachname']."<br />";
echo "E-Mail: ".$row['email']."<br /><br />";
}
?>
Im obigen SQL-Statement haben wir die gewünschten Spalten angegeben.
Wir können aber auch alle Spalten abfragen, indem wir ein * verwenden.
Möchten wir die Daten aus unserer Nutzertabelle ausgeben, dann können wir dies wie folgt machen:
<?php
$pdo = new PDO('mysql:host=localhost;dbname=test', 'username', 'password');

$sql = "SELECT * FROM users";
foreach ($pdo->query($sql) as $row) {
echo $row['vorname']." ".$row['nachname']."<br />";
echo "E-Mail: ".$row['email']."<br /><br />";
}
?>

Daten sortieren:

Möchten wir eine bestimmte Sortierung erreichen, dann können wir dies mittels der Anweisung ORDER BY erreichen.
<?php
$pdo = new PDO('mysql:host=localhost;dbname=test', 'username', 'password');

$sql = "SELECT * FROM users ORDER BY vorname";
foreach ($pdo->query($sql) as $row) {
echo $row['vorname']." ".$row['nachname']."<br />";
echo "E-Mail: ".$row['email']."<br /><br />";
}
?>
ORDER BY sortiert standardmäßig alphabetisch von klein nach groß, also von 0 nach 9 oder von A nach Z.
Möchten wir eine umgekehrte Sortierung haben, dann lässt sich dies mittels der Anweisung DESC erreichen:
$sql = "SELECT * FROM users ORDER BY id DESC";
Dieser SQL-Befehl gibt alle Benutzer aus, angefangen beim Benutzer mit der höchsten ID, sprich, dem neuesten Benutzer in unserer Tabelle.

Daten begrenzen:

Bisher wurden immer alle Datensätze abgefragt. Dies ist bei sehr großen Tabellen mit vielen tausend oder Millionen Einträgen wenig wünschenswert.
Dort möchten wir stattdessen oft beispielsweise nur die ersten 100 Einträge abfragen. Dazu können wir die LIMIT Anweisung verwenden.
<?php
$pdo = new PDO('mysql:host=localhost;dbname=test', 'username', 'password');

$sql = "SELECT * FROM users ORDER BY vorname LIMIT 3";
foreach ($pdo->query($sql) as $row) {
echo $row['vorname']." ".$row['nachname']."<br />";
echo "E-Mail: ".$row['email']."<br /><br />";
}
?>
Falls ihr nicht unbedingt an den ersten drei Einträgen interessiert seid, sondern vielleicht an den Einträgen 5 bis 8, dann könnt ihr dies auch über LIMIT lösen:
$sql = "SELECT * FROM users ORDER BY vorname LIMIT 5, 3";

Komplexere Datenabfragen:

Hier im zweiten Teil geht es um das Filtern von Einträgen, beispielsweise suchen wir alle Nutzer mit einem gewissen Vor- oder Nachnamen.
Dazu verwenden wir die Anweisung WHERE. Ebenfalls lernen wir den Einsatz von prepared statements in PDO.

WHERE-Statements:

Mittels der WHERE-Anweisung können wir gezielt unsere Datenbank durchsuchen und nur gewisse Datensätze ausgeben.
Dabei kommt die WHERE-Anweisung vor der ORDER BY-Anweisung und vor der LIMIT-Anweisung.
So könnt ihr also beispielsweise mittels WHERE nach bestimmten Einträgen suchen, mittels ORDER BY sortieren und mittels LIMIT euch nur die ersten Einträge ausgeben lasst.
<?php
$pdo = new PDO('mysql:host=localhost;dbname=test', 'username', 'password');

$sql = "SELECT * FROM users WHERE id = 1";
foreach ($pdo->query($sql) as $row) {
echo $row['vorname']." ".$row['nachname']."<br />";
echo "E-Mail: ".$row['email']."<br /><br />";
}
?>
Hier können wir auch auf die foreach-Schleife verzichten, da wir nur einen Datensatz zurückerhalten und es alternativ wie folgt schreiben.
<?php
$pdo = new PDO('mysql:host=localhost;dbname=test', 'username', 'password');

$sql = "SELECT * FROM users WHERE id = 1";
$user = $pdo->query($sql)->fetch();
echo $user['vorname']." ".$user['nachname']."<br />";
echo "E-Mail: ".$user['email']."<br /><br />";
?>

Logische Operatoren AND / OR

Im obigen Fall haben nur eine Spalte auf einen Wert untersucht.
Mittels den logischen Operatoren AND und OR können wir ähnlich wie bei if-Anweisung mehrere Spalten überprüfen:
// Findet alle Einträge mit Vornamen Max und Nachnamen Mustermann:
$sql = "SELECT * FROM users WHERE vorname = 'Max' AND nachname = 'Mustermann'";

// Findet alle Einträge mit Vornamen Max oder mit Nachnamen Mustermann:
$sql = "SELECT * FROM users WHERE vorname = 'Max' OR nachname = 'Mustermann'";

// Findet alle Einträge mit Vornamen Max und Nachnamen Mustermann
// oder die als E-Mail Adresse info@php-einfach.de angegeben haben:
$sql = "SELECT * FROM users WHERE (vorname = 'Max' AND nachname = 'Mustermann') OR (email = 'info@php-einfach.de)";

Vergleichsoperatoren

MySQL bietet auch eine Reihe von Vergleichsoperatoren , damit könnt ihr beispielsweise überprüfen ob eine Spalten nicht einem gewissen Wert entspricht, alle Einträge mit einer Spalte größer oder kleiner einem gewissen Wert usw. Die wichtigsten Funktionen sind:
// Findet alle Einträge die nicht Musermann heißen
$sql = "SELECT * FROM users WHERE nachname != 'Mustermann'";

// Findet alle Einträge mit id < 5
$sql = "SELECT * FROM users WHERE id < 5";

// Findet alle Einträge mit id >= 5
$sql = "SELECT * FROM users WHERE id >= 5";

// Findet alle Einträge mit den IDs 2, 3, 5 und 7
$sql = "SELECT * FROM users WHERE id IN (2,3,5,7)";

// Findet alle Einträge, außer die mit den IDs 2, 3, 5 und 7
$sql = "SELECT * FROM users WHERE id NOT IN (2,3,5,7)";

// Findet alle Einträge bei denen die Spalte last_order den speziellen Wert NULL hat
$sql = "SELECT * FROM users WHERE last_order IS NULL";

// Findet alle Einträge bei denen die Spalte last_order nicht den speziellen Wert NULL hat
$sql = "SELECT * FROM users WHERE last_order IS NOT NULL";

Datenbankeingabe:

So sieht ein einfache Datenbank Input aus.
$statement = $pdo->prepare("INSERT INTO beispiel (user, text) VALUES (:user, :text)");
$result = $statement->execute(array('user' => 'muster', 'text' => 'hallo'));
Dabei wird in die Tabelle beispiel einen neuen Eintrag gemacht. Wobei in der Spalte user den Eintrag muster und in der Spalte text hallo geschrieben wird.

Datenbankeingabe löschen:

So löscht man die Tabelleninhalte einer Tabelle.
$statement = $pdo->prepare("DELETE FROM beispiel");
$statement->execute(array('0'));
Dabei werden in der Tabelle beispiel alle Einträge gelöscht.
Marc Disch Blog Vefko