Kommen wir zur Datenverwaltung. Damit sind sämtliche Verarbeitungsprozesse wie Einfügen, Ändern, Löschen und Ausgeben von Datensätzen einer Datenbanktabelle gemeint. Die Verarbeitung erfolgt über die MySQL-Anweisungen INSERT, UPDATE, DELETE und SELECT.
Achtung: Im folgenden Abschnitt gehen wir davon aus, dass Sie die in den vorherigen Abschnitten vorgestellte Datenbank samt Datenbanktabelle erzeugt haben.
INSERT – Datensätze einfügen
Die erzeugte Datenbanktabelle Mitglieder enthält noch keine Datensätze, die Sie bearbeiten könnten. Daher sollten Sie als Erstes einen oder mehrere Datensätze, je nach Bedarf, hinzufügen. Dabei wird Ihnen die MySQLi-Methode query(), die Sie bereits kennengelernt haben, behilflich sein.
<?php
// Verbindungs-Objekt samt Zugangsdaten festlegen
@$db = new mysqli('localhost', 'matthias', 'geheim', 'Verein');
// Verbindung überprüfen
if (mysqli_connect_errno()) {
printf("Verbindung fehlgeschlagen: %s\n", mysqli_connect_error());
exit();
}
// Datensatz-Inhalte festlegen
$sql_befehl = "
INSERT INTO Mitglieder (
MitgliedID,
MitgliedVorname,
MitgliedNachname,
Aufgabe,
Geburtsdatum
) VALUES (
'',
'Matthias',
'Kannengiesser',
'Leitung',
'1974-11-20'
)";
if ($db->query($sql_befehl)) {
// Meldung bei Erfolg
echo "Datensatz erfolgreich hinzugefügt!";
} else {
// Meldung bei Fehlschlag
echo "Datensatz konnte nicht hinzugefügt werden!";
}
// Verbindung zum Datenbankserver beenden
$db->close();
?>
Das Beispiel enthält sämtliche erforderlichen Prozesse. Sie sollten sich vor allem den SQL-Befehl genauer betrachten. Mit INSERT INTO bestimmen Sie die Tabelle, in die Sie den Datensatz hinzufügen wollen. Anschließend werden sämtliche benötigten Felder aufgelistet. Die Inhalte bzw. Werte der Felder sind im VALUES-Abschnitt anzugeben. Achten Sie vor allem auf die einfachen Anführungszeichen. Da der gesamte String in doppelte Anführungszeichen eingeschlossen ist, müssen Sie hier einfache Anführungszeichen verwenden.
Der SQL-Befehl kann im vorliegenden Fall etwas gekürzt werden, da Sie bereits während der Erzeugung der Tabelle festgelegt haben, dass das Feld MitgliedID ein Primärschlüsselfeld ist, das automatisch eine Wertveränderung erfährt. Die Variable $sql_befehl könnte somit wie folgt angepasst werden:
$sql_befehl = "
INSERT INTO Mitglieder (
MitgliedID,
MitgliedVorname,
MitgliedNachname,
Aufgabe,
Geburtsdatum
) VALUES (
'',
'Matthias',
'Kannengiesser',
'Leitung',
'1974-11-20'
)";
Sollten Sie bei der Übergabe der Felder die Reihenfolge einhalten, in der Sie die Datenbanktabelle angelegt haben, können Sie die Angabe sogar noch weiter anpassen:
$sql_befehl = "
INSERT INTO Mitglieder VALUES (
'',
'Matthias',
'Kannengiesser',
'Leitung',
'1974-11-20'
)";
Gleichzeitiges Speichern mehrerer Datensätze
MySQL unterstützt auch, abweichend vom SQL-Standard, das gleichzeitige Speichern mehrerer Datensätze in einer Zelle. Die Syntax lautet dann wie folgt:
// Mehrere Datensätze festlegen
$sql_befehl = "
INSERT INTO Mitglieder (
MitgliedID,
MitgliedVorname,
MitgliedNachname,
Aufgabe,
Geburtsdatum
) VALUES (
'',
'Matthias',
'Kannengiesser',
'Leitung',
'1974-11-20'
),(
'',
'Caroline',
'Kannengiesser',
'Leitung',
'1979-01-04'
),(
'',
'Thomas',
'Mustermann',
'Mitglied',
'1967-10-10'
)";
oder ohne Feldbezeichnungen:
// Mehrere Datensätze festlegen
$sql_befehl = "
INSERT INTO Mitglieder VALUES (
'',
'Matthias',
'Kannengiesser',
'Leitung',
'1974-11-20'
),(
'',
'Caroline',
'Kannengiesser',
'Leitung',
'1979-01-04'
),(
'',
'Thomas',
'Mustermann',
'Mitglied',
'1967-10-10'
)";
UPDATE – Datensätze bearbeiten
Zur Bearbeitung von Datensätzen wird die MySQL-Anweisung UPDATE verwendet. Diese Anweisung kann gleich mehrere Datensätze und Felder ändern und sollte daher sehr sorgfältig eingesetzt werden. Sie werden nun erfahren, wie die Bearbeitung von Datensätzen aussieht.
<?php
// Verbindungs-Objekt samt Zugangsdaten festlegen
@$db = new mysqli('localhost', 'matthias', 'geheim', 'Verein');
// Verbindung überprüfen
if (mysqli_connect_errno()) {
printf("Verbindung fehlgeschlagen: %s\n", mysqli_connect_error());
exit();
}
// Datensätze aktualisieren (bearbeiten)
$sql_befehl = "
UPDATE Mitglieder
SET Aufgabe = 'Chef'
WHERE MitgliedNachname = 'Kannengiesser'
";
if ($db->query($sql_befehl)) {
// Meldung bei Erfolg
echo "Anzahl geänderter Datensätze: " . $db->affected_rows;
} else {
// Meldung bei Fehlschlag
echo "Datensatz konnte nicht bearbeitet werden!";
}
// Verbindung zum Datenbankserver beenden
$db->close();
?>
Es werden sämtliche Datensätze bearbeitet, die im Feld MitgliedNachname Kannengiesser enthalten. Innerhalb des jeweiligen Datensatzes wird das Feld Aufgabe bearbeitet.
Natürlich können Sie auch ohne Weiteres mehrere Felder gleichzeitig bearbeiten. Die einzelnen Änderungen werden durch Kommas getrennt.
// Datensatz-Bearbeitung festlegen
$sql_befehl = "
UPDATE Mitglieder
SET Aufgabe = 'Chef',
MitgliedVorname = 'Matze',
WHERE MitgliedNachname = 'Kannengiesser'
";
DELETE – Datensätze löschen
Zum Löschen von Datensätzen wird die MySQL-Anweisung DELETE verwendet. Diese Anweisung kann ebenfalls gleich mehrere Datensätze und Felder löschen und sollte daher genau so sorgfältig wie die MySQL-Anweisung UDPATE eingesetzt werden. Hier ein Beispiel zum Löschen von Datensätzen:
<?php
// Verbindungs-Objekt samt Zugangsdaten festlegen
@$db = new mysqli('localhost', 'matthias', 'geheim', 'Verein');
// Verbindung überprüfen
if (mysqli_connect_errno()) {
printf("Verbindung fehlgeschlagen: %s\n", mysqli_connect_error());
exit();
}
// Datensätze löschen
$sql_befehl = "
DELETE FROM Mitglieder
WHERE MitgliedNachname = 'Kannengiesser' AND Geburtsdatum = '1974-11-20'
";
if ($db->query($sql_befehl)) {
// Meldung bei Erfolg
echo "Anzahl gelöschter Datensätze: " . $db->affected_rows;
} else {
// Meldung bei Fehlschlag
echo "Datensatz konnte nicht gelöscht werden!";
}
// Verbindung zum Datenbankserver beenden
$db->close();
?>
An diesem Beispiel lässt sich zusätzlich erkennen, wie man den WHERE-Abschnitt des SQL-Befehls erweitern und somit den zu löschenden Datensatz genauer eingrenzen kann. Schließlich wäre es schade, wenn sämtliche Kannengiesser aus der Tabelle entfernt würden.
SELECT – Datensätze ausgeben
Es stehen Ihnen unzählige Möglichkeiten zur Verfügung, die Daten aus einer Datenbank abzufragen und auszugeben. Wir werden Ihnen jedoch lediglich einige ausgewählte Varianten vorstellen.
Beispiel – Ausgabe eines Datensatzes und Zugriff auf Datenfelder
<?php
// Verbindungs-Objekt samt Zugangsdaten festlegen
@$db = new mysqli('localhost', 'matthias', 'geheim', 'Verein');
// Verbindung überprüfen
if (mysqli_connect_errno()) {
printf("Verbindung fehlgeschlagen: %s\n", mysqli_connect_error());
exit();
}
// Datensatz-Ausgabe festlegen
$sql_befehl = "SELECT * FROM Mitglieder";
if ($resultat = $db->query($sql_befehl)) {
// Datensatzzeile als Array übergeben
$datensatz = $resultat->fetch_array();
// Ausgabe
echo $datensatz[0]; // 3
echo $datensatz[1]; // Caroline
echo $datensatz["Aufgabe"]; // Chef
// Speicher freigeben
$resultat->close();
} else {
// Meldung bei Fehlschlag
echo "Zugriff fehlgeschlagen!";
}
// Verbindung zum Datenbankserver beenden
$db->close();
?>
Die MySQL-Anweisung liefert sämtliche Spalten (Datenfelder) und Zeilen (Datensätze) der im FROM-Abschnitt bezeichneten Tabelle, also sämtliche Datensätze der Datenbanktabelle. Die echo-Zeilen geben einzelne Feldinhalte aus. Die Methode fetch_array() sorgt dafür, dass die Inhalte in Form eines Arrays zur Verfügung gestellt werden.
Beispiel – Ausgabe sämtlicher Datensätze und Datenfelder
<?php
// Verbindungs-Objekt samt Zugangsdaten festlegen
@$db = new mysqli('localhost', 'matthias', 'geheim', 'Verein');
// Verbindung überprüfen
if (mysqli_connect_errno()) {
printf("Verbindung fehlgeschlagen: %s\n", mysqli_connect_error());
exit();
}
// Datensatz-Ausgabe festlegen
$sql_befehl = "SELECT * FROM Mitglieder";
if ($resultat = $db->query($sql_befehl)) {
// Durchlaufen der Datenbankabfrage
while($datensatz = $resultat->fetch_array() ){
// Datenfelder – linear abrufen
echo $datensatz[0] . "\n</br>";
echo $datensatz[1] . "\n</br>";
echo $datensatz[2] . "\n</br>";
echo $datensatz[3] . "\n</br>";
echo $datensatz[4] . "\n</br>";
// Datenfelder – assoziativ abrufen
echo $datensatz["MitgliedID"] . "\n</br>";
echo $datensatz["MitgliedVorname"] . "\n</br>";
echo $datensatz["MitgliedNachname"] . "\n</br>";
echo $datensatz["Aufgabe"] . "\n</br>";
echo $datensatz["Geburtsdatum"] . "\n</br>";
// Datenfelder – Inhalte extrahieren und
// als Variablen zur Verfügung stellen
extract($datensatz);
echo $MitgliedID . "\n</br>";
echo $MitgliedVorname . "\n</br>";
echo $MitgliedNachname . "\n</br>";
echo $Aufgabe . "\n</br>";
echo $Geburtsdatum . "\n</br>";
}
// Speicher freigeben
$resultat->close();
} else {
// Meldung bei Fehlschlag
echo "Zugriff fehlgeschlagen!";
}
// Verbindung zum Datenbankserver beenden
$db->close();
?>
Die while-Schleife durchläuft mithilfe von fetch_array() sämtliche Datensätze, die durch SELECT geliefert wurden. Sie gibt die Feldinhalte in Form eines Arrays aus. Die PHP-Funktion extract() ermöglicht es Ihnen, mithilfe der Feldbezeichnungen auf die Feldinhalte zuzugreifen und diese auszugeben. Die Ausgabe kann durch zusätzliche HTML-Strukturen und CSS optimiert werden.
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<title>Mitgliedsdaten aus der Datenbank Verein</title>
<style type="text/css">
<!--
table {
width: 500px;
border: thin solid #000000;
}
body {
font-family: Arial, Helvetica, sans-serif;
}
tr {
background-color: #FFCC33;
text-align: center;
}
thead {
background-color: #CCCCCC;
font-weight: bold;
text-align: center;
}
-->
</style>
</head>
<?php
// Verbindungs-Objekt samt Zugangsdaten festlegen
@$db = new mysqli('localhost', 'matthias', 'geheim', 'Verein');
// Verbindung überprüfen
if (mysqli_connect_errno()) {
printf("Verbindung fehlgeschlagen: %s\n", mysqli_connect_error());
exit();
}
// Tabellenkopf
echo "
<table>
<thead>
<td>Mitglied-ID</td>
<td>Vorname</td>
<td>Nachname</td>
<td>Aufgabe</td>
<td>Geburtsdatum</td>
</thead>
";
// Datensatz-Ausgabe festlegen
$sql_befehl = "SELECT * FROM Mitglieder";
if ($resultat = $db->query($sql_befehl)) {
// Durchlaufen der Datenbankabfrage
while($datensatz = $resultat->fetch_array() ){
// Datenfelder – Inhalte extrahieren und
// als Variablen zur Verfügung stellen
extract($datensatz);
// Tabelleninhalt
echo "
<tr>
<td>$MitgliedID</td>
<td>$MitgliedVorname</td>
<td>$MitgliedNachname</td>
<td>$Aufgabe</td>
<td>$Geburtsdatum</td>
</tr>
";
}
// Speicher freigeben
$resultat->close();
} else {
// Meldung bei Fehlschlag
echo "Zugriff fehlgeschlagen!";
}
// Tabellenende
echo "</table>";
// Verbindung zum Datenbankserver beenden
$db->close();
?>
<body>
</body>
</html>
Bild 7.4: Ausgabe im Browser
Einsatz von mysqli_fetch_object() oder fetch_object()
Mithilfe der MySQLi-Methode fetch_object() wird anstelle eines Arrays ein Objekt erzeugt. Auf die einzelnen Spalten kann über die Eigenschaften des Objekts zugegriffen werden. Diese erhalten ganz einfach die Feldnamen der Datenbanktabelle als Bezeichnungen zugewiesen. Für die Ausgabe ist dann die in PHP übliche Objekt-Syntax: Objekt-> Eigenschaft zu verwenden.
<?php
// Verbindungs-Objekt samt Zugangsdaten festlegen
@$db = new mysqli('localhost', 'matthias', 'geheim', 'Verein');
// Verbindung überprüfen
if (mysqli_connect_errno()) {
printf("Verbindung fehlgeschlagen: %s\n", mysqli_connect_error());
exit();
}
// Datensatz-Ausgabe festlegen
$sql_befehl = "SELECT * FROM Mitglieder";
if ($resultat = $db->query($sql_befehl)) {
// Durchlaufen der Datenbankabfrage
while($datensatz = $resultat->fetch_object() ){
// Datenfelder – objekt abrufen
echo $datensatz->MitgliedID . "\n</br>";
echo $datensatz->MitgliedVorname . "\n</br>";
echo $datensatz->MitgliedNachname . "\n</br>";
echo $datensatz->Aufgabe . "\n</br>";
echo $datensatz->Geburtsdatum . "\n</br>";
}
// Speicher freigeben
$resultat->close();
} else {
// Meldung bei Fehlschlag
echo "Zugriff fehlgeschlagen!";
}
// Verbindung zum Datenbankserver beenden
$db->close();
?>
Der Unterschied zwischen fetch_array() und fetch_object() ist nur marginal. Die Performance ist bei beiden gleich. Sie haben somit die Qual der Wahl.
Zusätze für SELECT
Die SELECT-Syntax ist jedoch noch viel umfangreicher. So können die Felder für die Ausgabe auch durch arithmetische oder String-Operatoren erzeugt werden. Eine Abfrage kann sich über verschiedene Tabellen des gesamten relationalen Datenbankmodells erstrecken. Alternativ wird die Selektion mit Bedingungen verknüpft. Hier eine Übersicht der SELECT-Befehle:
Element | Beschreibung | SELECT | Liste der Spalten, die ausgegeben werden sollen, einschließlich generierter Spalten. | FROM | Liste der Tabellen, die abgefragt werden. | WHERE | Suchbedingung zur Eingrenzung von Datensätzen. Über WHERE können auch verschiedene Tabellen verknüpft werden. | HAVING | Analog zu einer Funktion wie WHERE, allerdings mit der Möglichkeit, Felder des eigenen SELECT mit einzubeziehen. | GROUP BY | Angabe der Spalte, die zur Gruppierung von gleichartigen Datensätzen verwendet werden soll. | ORDER BY | Legt die Ausgabereihenfolge der selektierten Datensätze fest. | LIMIT | Beschränkung der Anzahl der auszugebenden Datensätze. |
Um eine Ausgabe zu erhalten, werden folgende Datensätze der Datenbanktabelle Mitglieder vorausgesetzt:
$sql_befehl = "
INSERT INTO Mitglieder VALUES (
'',
'Matthias',
'Kannengiesser',
'Leitung',
'1974-11-20'
),(
'',
'Caroline',
'Kannengiesser',
'Leitung',
'1979-01-04'
),(
'',
'Thomas',
'Mustermann',
'Mitglied',
'1967-10-10'
)";
Beispiel – limit
<?php
// Verbindungs-Objekt samt Zugangsdaten festlegen
@$db = new mysqli('localhost', 'matthias', 'geheim', 'Verein');
// Verbindung überprüfen
if (mysqli_connect_errno()) {
printf("Verbindung fehlgeschlagen: %s\n", mysqli_connect_error());
exit();
}
// Datensatz-Ausgabe festlegen
$sql_befehl = "SELECT * FROM Mitglieder LIMIT 2";
if ($resultat = $db->query($sql_befehl)) {
// Durchlaufen der Datenbankabfrage
while($datensatz = $resultat->fetch_object() ){
// Datenfelder – objekt abrufen
echo $datensatz->MitgliedID . "\n</br>";
echo $datensatz->MitgliedVorname . "\n</br>";
echo $datensatz->MitgliedNachname . "\n</br>";
echo $datensatz->Aufgabe . "\n</br>";
echo $datensatz->Geburtsdatum . "\n</br>";
}
// Speicher freigeben
$resultat->close();
} else {
// Meldung bei Fehlschlag
echo "Zugriff fehlgeschlagen!";
}
// Verbindung zum Datenbankserver beenden
$db->close();
?>
Ausgabe
1
Matthias
Kannengiesser
Leitung
1974-11-20
2
Caroline
Kannengiesser
Leitung
1979-01-04
Beispiel – order by
<?php
// Verbindungs-Objekt samt Zugangsdaten festlegen
@$db = new mysqli('localhost', 'matthias', 'geheim', 'Verein');
// Verbindung überprüfen
if (mysqli_connect_errno()) {
printf("Verbindung fehlgeschlagen: %s\n", mysqli_connect_error());
exit();
}
// Datensatz-Ausgabe festlegen
$sql_befehl = "SELECT * FROM Mitglieder order by MitgliedVorname";
if ($resultat = $db->query($sql_befehl)) {
// Durchlaufen der Datenbankabfrage
while($datensatz = $resultat->fetch_object() ){
// Datenfelder – objekt abrufen
echo $datensatz->MitgliedID . "\n</br>";
echo $datensatz->MitgliedVorname . "\n</br>";
echo $datensatz->MitgliedNachname . "\n</br>";
echo $datensatz->Aufgabe . "\n</br>";
echo $datensatz->Geburtsdatum . "\n</br>";
}
// Speicher freigeben
$resultat->close();
} else {
// Meldung bei Fehlschlag
echo "Zugriff fehlgeschlagen!";
}
// Verbindung zum Datenbankserver beenden
$db->close();
?>
Ausgabe
1
Caroline
Kannengiesser
Leitung
1979-01-04
2
Matthias
Kannengiesser
Leitung
1974-11-20
3
Thomas
Mustermann
Mitglied
1967-10-10
Beispiel – Kombination
<?php
// Verbindungs-Objekt samt Zugangsdaten festlegen
@$db = new mysqli('localhost', 'matthias', 'geheim', 'Verein');
// Verbindung überprüfen
if (mysqli_connect_errno()) {
printf("Verbindung fehlgeschlagen: %s\n", mysqli_connect_error());
exit();
}
// Datensatz-Ausgabe festlegen
$sql_befehl = "SELECT * FROM Mitglieder order by MitgliedVorname LIMIT 2";
if ($resultat = $db->query($sql_befehl)) {
// Durchlaufen der Datenbankabfrage
while($datensatz = $resultat->fetch_object() ){
// Datenfelder – Objekt abrufen
echo $datensatz->MitgliedID . "\n</br>";
echo $datensatz->MitgliedVorname . "\n</br>";
echo $datensatz->MitgliedNachname . "\n</br>";
echo $datensatz->Aufgabe . "\n</br>";
echo $datensatz->Geburtsdatum . "\n</br>";
}
// Speicher freigeben
$resultat->close();
} else {
// Meldung bei Fehlschlag
echo "Zugriff fehlgeschlagen!";
}
// Verbindung zum Datenbankserver beenden
$db->close();
?>
Ausgabe
2
Caroline
Kannengiesser
Leitung
1979-01-04
1
Matthias
Kannengiesser
Leitung
1974-11-20
Hinweis: Teilweise gelten einige dieser Befehle auch für UPDATE, DELETE und INSERT.
|