SELFPHP

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


Datenbanktabelle erstellen


Nachdem Sie nun eine Datenbank erstellt haben, erzeugen Sie eine Tabelle. Eine Tabelle wird ebenfalls mithilfe der MySQLi-Methode query() erzeugt. Das folgende Skript sorgt dafür, dass Ihnen die Tabelle Mitglieder innerhalb der Datenbank Verein zur Verfügung gestellt wird.

<?php

// Verbindungs-Objekt samt Zugangsdaten festlegen
@$db = new mysqli('localhost', 'matthias', 'geheim');

// Verbindung überprüfen
if (mysqli_connect_errno()) {
  printf("Verbindung fehlgeschlagen: %s\n", mysqli_connect_error());
  exit();
}

// SQL-Befehl – Anlegen der Datenbank
$sql_befehl = "CREATE DATABASE IF NOT EXISTS Verein";

if ($db->query($sql_befehl)) {
  // Meldung bei erfolgreicher Erstellung der Datenbank
  echo "Datenbank erfolgreich angelegt.";
  // Datenbankwechseln (verwenden)
  //Alternative: $db->query("USE Verein");
  $db->select_db("Verein");  
} else {
  // Meldung bei Fehlschlag
  echo "Datenbank konnte nicht angelegt werden!";
  exit();
}

// SQL-Befehl – Anlegen der Datenbanktabelle
$sql_befehl = "CREATE TABLE IF NOT EXISTS Mitglieder (
MitgliedID INTEGER NOT NULL AUTO_INCREMENT,
MitgliedVorname CHAR(40),
MitgliedNachname CHAR(40),
Aufgabe CHAR(40),
Geburtsdatum DATE,
PRIMARY KEY (MitgliedID)
)";

if ($db->query($sql_befehl)) {
  // Meldung bei erfolgreicher Erstellung der Datenbanktabelle
  echo "Datenbanktabelle erfolgreich angelegt.";  
} else {
  // Meldung bei Fehlschlag
  echo "Datenbanktabelle konnte nicht angelegt werden!";
}

// Verbindung zum Datenbankserver beenden
$db->close();

?>

Das Skript erscheint Ihnen vielleicht etwas lang. Die Sicherheitsabfragen führen dazu, dass das Skript schnell an Umfang gewinnt. Bei Prozessen, die vom Erfolg anderer Prozesse abhängig sind, sollten Sie jedoch immer prüfen, ob der vorhergehende Prozess samt Operationen erfolgreich abgeschlossen wurde oder nicht. Es wird überprüft, ob die Datenbank, die erzeugt werden soll, bereits vorhanden ist. Sollte dies nicht der Fall sein, wird sie erzeugt. Anschließend wird auf die Datenbank Verein verwiesen. Dann kommt es zur Festlegung der Tabellenfelder und deren Datentypen.


Primärschlüsselfeld

Die vorliegende Tabelle enthält noch eine Besonderheit, und zwar einen Primärschlüssel, welcher durch die MitgliedID symbolisiert wird. Eine Tabelle benötigt in der Regel einen Primärschlüssel, über den der einzelne Datensatz eindeutig identifiziert werden kann. Sie können hierfür mehrere Spalten einsetzen. Sinnvoller ist es jedoch meist, einzelne Felder zu verwenden. Mit dem Zusatz PRIMARY KEY erklären Sie das zuvor definierte Feld MitgliedID zum Schlüsselfeld. Hier sind dann automatisch nur noch eindeutige Einträge zulässig. Der Zusatz NOT NULL legt fest, dass dieses Feld nicht leer bleiben darf. Der Anwender ist somit gezwungen, hier einen Wert einzugeben.


Primärschlüsselfeld und AUTO_INCREMENT

Das Problem, in ein Schlüsselfeld immer eindeutige Einträge eingeben zu müssen, lässt sich mithilfe von AUTO_INCREMENT lösen. Sobald ein Feld als auto_increment-feld deklariert wurde, werden beim Hinzufügen neuer Datensätze automatisch passende Einträge in dem Feld eingesetzt. Der Anwender muss sich um dieses Feld gar nicht mehr kümmern. MySQL ermittelt automatisch den bisher höchsten Eintrag und erhöht diesen um den Wert 1. Diese Lösung des Problems ist der bequemste und gleichzeitig der sicherste Weg.


Datentypen

MySQL unterstützt eine Reihe von Spaltentypen, die in drei Kategorien unterteilt werden können: Numerische Typen, Datums- und Zeit-Typen sowie Zeichenketten-Typen.

Der jeweilige Typ sollte möglichst genau auf die Daten abgestimmt sein, die Sie speichern wollen. Durch die Spaltentypen erhalten Sie eine gewisse Eingabekontrolle, da falsche Daten eventuell schon bei der Eingabe mit einer Fehlermeldung abgewiesen werden. Wenn ein Feld beispielsweise nur ganzzahlige Werte enthalten soll, ist der Typ INTEGER zu wählen. Hier eine Zusammenstellung der wichtigsten Spaltentypen (Datentypen):{PSP}
TypBedeutung
TINYINTEine sehr kleine Ganzzahl. Der vorzeichenbehaftete Bereich ist -128 bis 127, der vorzeichenlose Bereich ist 0 bis 255.
SMALLINTEine kleine Ganzzahl. Der vorzeichenbehaftete Bereich ist -32768 bis 32767, der vorzeichenlose Bereich ist 0 bis 65535.
MEDIUMINTEine Ganzzahl mittlerer Größe. Der vorzeichenbehaftete Bereich ist -8388608 bis 8388607, der vorzeichenlose Bereich ist 0 bis 16777215.
INT/INTEGEREine Ganzzahl normaler Größe. Der vorzeichenbehaftete Bereich ist -2147483648 bis 2147483647, der vorzeichenlose Bereich ist 0 bis 4294967295.
BIGINTEine große Ganzzahl. Der vorzeichenbehaftete Bereich ist -9223372036854775808 bis 9223372036854775807, der vorzeichenlose Bereich ist 0 bis 18446744073709551615.
FLOATEine kleine Fließkommazahl (einfacher Genauigkeit). Der Wertebereich umfasst -3.402823466E+38 bis -1.175494351E-38, 0 und 1.175494351E-38 bis 3.402823466E+38.
DOUBLE / REALEine normal große Fließkommazahl (doppelter Genauigkeit). Der Wertebereich umfasst -1.7976931348623157E+308 bis -2.2250738585072014E-308, 0 und 2.2250738585072014E-308 bis 1.7976931348623157E+308.
DATEEin Datum. Der unterstützte Wertebereich ist '1000-01-01' bis '9999-12-31'. MySQL zeigt DATE-Werte im 'YYYY-MM-DD'-Format an, gestattet jedoch, DATE-Spalten Werte als Zeichenkette oder als Zahl zuzuweisen.
DATETIMEEine Datums-Zeit-Kombination. Der unterstützte Wertebereich ist '1000-01-01 00:00:00' bis '9999-12-31 23:59:59'. MySQL zeigt DATETIME-Werte im 'YYYY-MM-DD HH:MM:SS'-Format an, gestattet jedoch, DATETIME-Spalten Werte als Zeichenkette oder als Zahl zuzuweisen.
TIMESTAMPEin Zeitstempel. Der Wertebereich ist '1970-01-01 00:00:00' bis irgendwann im Jahr 2037.
TIMEEin Zeit-Typ. Der Wertebereich ist '-838:59:59' bis '838:59:59'. MySQL zeigt TIME-Werte im 'HH:MM:SS'-Format an, gestattet jedoch, TIME-Spalten Werte entweder als Zeichenkette oder als Zahle zuzuweisen.
CHAREine Zeichenkette fester Länge, die beim Speichern rechts steht und mit Leerzeichen bis zur angegebenen Länge aufgefüllt wird. Der Wertebereich liegt zwischen 1 bis 255 Zeichen.
VARCHAREine Zeichenkette variabler Länge. Der Wertebereich liegt zwischen 1 bis 255 Zeichen.
TINYBLOB / TINYTEXTEine BLOB- oder TEXT-Spalte mit einer maximalen Länge von 255 (28 – 1) Zeichen.
BLOB / TEXTEine BLOB- oder TEXT-Spalte mit einer maximalen Länge von 65535 (216 – 1) Zeichen.
MEDIUMBLOB / MEDIUMTEXTEine BLOB- oder TEXT-Spalte mit einer maximalen Länge von 16777215 (224 – 1) Zeichen.
LONGBLOB / LONGTEXTEine BLOB- oder TEXT-Spalte mit einer maximalen Länge von 4294967295 (232 – 1) Zeichen.


Bei der Definition von Feldern ist neben der Typangabe gelegentlich auch noch die Feldlänge anzugeben. Das gilt vor allem für die Typen CHAR und VARCHAR.
MitgliedNachname CHAR(40)

Bei ganzzahligen Typen wie INTEGER (INT), SMALLINT und BIGINT können Sie mit UNSIGNED noch bestimmen, ob ein Wert mit oder ohne Vorzeichen dargestellt werden soll:
ProduktNr INTEGER UNSIGNED

Für Felder wie MitgliedID, welche lediglich positive Werte enthalten, kann es sinnvoll sein, UNSIGNED zu verwenden.


Anzahl der Datenbanktabellen in einer Datenbank

Sollten Sie in Erfahrung bringen wollen, wie viele Datenbanktabellen innerhalb einer Datenbank vorhanden sind, können Sie folgendes Skript einsetzen, um eine entsprechende Auflistung zu erhalten.
<?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();
}

// SQL-Befehl
$sql_befehl = "SHOW TABLES";

if ($resultat = $db->query($sql_befehl)) {
  // Meldung bei erfolgreicher Abfrage
  while($daten = $resultat->fetch_object() ){
    // Namen der Datenbankentabellen ausgeben
    echo $daten->Tables_in_verein . "\n</br>";
  }
  // Anzahl der Abfragezeilen
  $anzahl = $resultat->num_rows;
  // Ausgabe
  printf("Abfrage enthält %d Tabelle(n).\n</br>", $anzahl);
  // Speicher freigeben
  $resultat->close();  
} else {
  // Meldung bei Fehlschlag
  echo "Zugriff fehlgeschlagen!";
}

// Verbindung zum Datenbankserver beenden
$db->close();

?>