SELFPHP

SELFPHP-Druckversion
Original Adresse dieser Seite:
http://www.selfphp.de/praxisbuch/praxisbuchseite.php?site=273&group=48
© 2001-2017 E-Mail SELFPHP OHG, info@selfphp.de
© 2005-2017 E-Mail PHP5 Praxisbuch - Matthias Kannengiesser, m.kannengiesser@selfphp.de


Datenverwaltung


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'
)";
{PSP}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();

?>
{PSP}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();

?>
{PSP}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.{PSP}
<!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{PSP}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:

ElementBeschreibung
SELECTListe der Spalten, die ausgegeben werden sollen, einschließlich generierter Spalten.
FROMListe der Tabellen, die abgefragt werden.
WHERESuchbedingung zur Eingrenzung von Datensätzen. Über WHERE können auch verschiedene Tabellen verknüpft werden.
HAVINGAnalog zu einer Funktion wie WHERE, allerdings mit der Möglichkeit, Felder des eigenen SELECT mit einzubeziehen.
GROUP BYAngabe der Spalte, die zur Gruppierung von gleichartigen Datensätzen verwendet werden soll.
ORDER BYLegt die Ausgabereihenfolge der selektierten Datensätze fest.
LIMITBeschrä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'
)";
{PSP}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();

?>
{PSP}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.