|
Unsere ersten MySQL Befehle mit PHP
Als Grundlage benötigen wir die Tabelle adressen welche wir im
Kursteil Erste Schritte
erstellt haben. Desweiteren müssen wir eine offene, aktive Datenbankverbindung
zu dieser Datenbank haben, wo Ihr die Tabelle erstellt habt. Wie man die
Verbindung herstellt habt Ihr ja im Kursteil Verbindung herstellen
kennengelernt.
Einträge in unsere Tabelle adressen mit PMA
Unsere Tabelle hat noch keine Daten, deshalb beschäftigen wir uns erst damit,
wie wir diese mit Daten füllen können. Das einfachste ist über
PHPMyAdmin. Dazu klicken wir im PHPMyAdmin links auf die Tabelle, wo wir die
Daten hinzufügen möchten. Dann haben wir in der oberen Leiste
mehrere Optionen.
Dort klicken wir auf einfügen, um neue Datensätze hinzuzufügen.
Wie bereits besprochen müsst Ihr bei id nichts eintragen. Mit
anzeigen kann man sich alle Datensätze anzeigen lassen, sofern man
Einträge hat.
Merke: wenn du den Datensatz mit PMA einfügst, zeigt PMA
dir den SQL Befehl an, den es ausgeführt hat ! Schau ihn Dir an !
Einträge in unsere Tabelle mit PHP - INSERT
Um etwas in eine Tabelle einzufügen benötigt man den SQL Befehl insert.
Um Befehle an SQL zu schicken braucht man den PHP Befehl mysql_query($sql_befehl);.
Wir erstellen einen Eintrag mit dem Befehl:
INSERT INTO adressen (name, adresse, plz, ort, telefon) VALUES ("Heiko Müller", "Musterstraße 1",
12345, "Bremen", "0421-1234567");
Ein Beispiel:
<?php $server = "localhost"; $datenbank = "php-kurs"; $username = "web1"; $passwort = "abcdef";
$link = mysql_connect($server, $username, $passwort); if (!$link) die(mysql_error());
$db = mysql_select_db($datenbank, $link);
if ($db) { $sql_befehl = 'INSERT INTO adressen (name, adresse, plz, ort, telefon) VALUES ("Heiko Müller", "Musterstraße 1", 12345, "Bremen", "0421-1234567");';
mysql_query($sql_befehl, $link); }
mysql_close($link); ?>
|
Wie Ihr seht gibt man in den ersten runden Klammern die Felder an, die man
gerne mit Daten füllen möchte. In den zweiten runden Klammern folgen
dann die jeweiligen Werte, in genau der gleichen Reihenfolge wie wir es in der
ersten runden Klammer angegeben haben. In dem Beispiel habe ich den SQL Befehl
der Übersicht wegen über mehrere Zeilen gestreckt ; dies ist durchaus
möglich und praktikabel. Wenn Ihr ganz lange SQL Abfragen habt macht dies
sogar Sinn, um den Überblick zu behalten.
In Anführungszeichen habe ich den Wert gesetzt der in das Feld eingetragen
werden soll. Möchte ich Anführungszeichen selbst mit speichern, dann
muss ich diese mit \ maskieren, wie bereits in dem Kursteil Mein erstes Programm
beschrieben. Alternativ kann ich auch die einfachen ' Anführungszeichen nehmen.
WICHTIG !!! In Gästebüchern, Kontaktskripten und
ähnlichen gibt man die Daten nicht selbst vor die gespeichert werden, sondern
fremde Leute. Vertraue nie darauf, dass das was du speicherst dann auch wirklich
in Ordnung ist. Durch eine bestimmte Eingabe kann man so eigene SQL Befehle von
aussen auf einem fremden Server ausführen, was ein hohes Sicherheitsrisiko
darstellt. Mehr zu dem Thema könnt Ihr hier (Klick)
lesen wenn Ihr möchtet. Es handelt sich dabei um sogenannte SQL Injektionen.
Bevor Ihr Daten in die SQL speichert, die Ihr von aussen bekommen habt, benutzt
den Befehl addslashes($texteingabe_von_user); um euer Skript
sicherer zu machen. Addslashes sorgt dafür, dass kein ungewollter zusätzlicher
SQL Code mit eingefügt und ausgeführt wird.
Werte in unserer Datenbank ändern - UPDATE
Wie ändern wir nun einen Eintrag ? Dafür gibt es den UPDATE
Befehl. Angenommen unser Herr Müller hat nun eine neue Telefonnummer,
dann könnten wir diese mit folgendem Befehl ändern: (diesmal ohne die
Datenbank zu öffnen, das Skript habt Ihr ja und könnt diese Zeile
einfach nur in euer bestehendes Skript einfügen):
<?php mysql_query('UPDATE adressen SET telefon="04221-98765" WHERE id=1');
mysql_query('UPDATE adressen SET telefon="04221-98765" WHERE name="Heiko Müller"');
mysql_query('UPDATE adressen SET telefon="04221-98765" WHERE name LIKE "%Müller%"'); ?>
|
Um SQL Befehle zu üben, kann man diese auch direkt in PMA unter dem
Menüpunkt SQL eingeben und direkt das Ergebnis sehen !
Hier haben wir zwei mysql_querys. Update bedeutet wir wollen Daten ändern.
mit SET sagen wir ihm welches Feld wir in dieser Tabelle aktualisieren wollen
und hinter dem Gleichheitszeichen was wir diesem Feld zuweisen wollen. Jetzt
müssen wir noch bestimmen welchen Datensatz dies betrifft, was wir mit dem
Where Befehl machen. Geben wir diesen Where Befehl nicht an, dann wird die Telefonnummer
bei allen Einträgen in der Datenbank geändert !
Bei der ersten Query bestimmen wir den Datensatz anhand der eindeutig zuordenbaren
id=1. Bei dem zweiten Query ändern wir alle Einträge, wo der name
Heiko Müller ist. Gibt es Heiko Müller mehrfach, so wird bei allen
die Telefonnummer gesetzt.
In der dritten Query beschreiben wir ganz schwammig, welche Datensätze wir
geändert haben möchten. LIKE bedeutet soviel wie "die ungefähr so aussehen wie ...".
Es werden alle Einträge geändert, die im Feld name irgendwo Müller stehen haben, egal
was davor oder danach steht. Dieses "egal was davor oder danach kommt" signalisieren wir durch das
Prozentzeichen. Schreiben wir nur LIKE "%Müller", dann wären nur die Müllereinträge
betroffen, wo VOR dem Müller noch irgendetwas steht - dahinter dürfte nichts mehr stehen. Würden
wir LIKE "Müller%" schreiben, dann wären dies alle Einträge die Müller am ANFANG
stehen hätten und dahinter irgendwas. Davor dürfte nichts stehen.
Datensätze selektieren und mit php ausgeben - SELECT
Jetzt wollen wir nicht nur speichern oder ändern, sondern auch mal Daten
aus der Datenbank holen und lesen. Dies geschieht mit dem SELECT Befehl.
<?php $server = "localhost"; $datenbank = "php-kurs"; $username = "web1"; $passwort = "abcdef";
$link = mysql_connect($server, $username, $passwort); if (!$link) die(mysql_error());
$db = mysql_select_db($datenbank, $link);
if ($db) { $re = mysql_query("SELECT * FROM adressen WHERE id=1", $link);
# Jetzt können wir die Daten als Array oder Objekt bekommen # wir nehmen die Daten in einem Array
$daten = mysql_fetch_array($re, MYSQL_ASSOC);
print_r($daten); }
mysql_close($link); ?>
|
Ausgabe: | Array ( [id] => 1 [name] => Heiko Müller [adresse] => Musterstraße 1 [plz] => 12345 [ort] => Bremen [telefon] => 04221-98765 ) |
In der mysql_query speichere ich das Ergebnis in der Variablen $re.
Dieses Ergebnis aus der Abfrage benötige ich um Datensätze aus der
Datenbank zu holen. Zum Daten holen benutze ich das mysql_fetch_array($re, MYSQL_ASSOC);.
Man könnte es auch mit mysql_fetch_object(); holen,
allerdings haben wir uns hier mit Arrays beschäftigt und bleiben dabei.
Das MYSQL_ASSOC bedeutet, dass in dem Array die Feldernamen mit übernommen
werden und auch an die dazugehörigen Inhalte gebunden werden. So steht in
id auch 1 drin und in telefon auch die Telefonnummer !
Wir könnten im weiteren Programm die Daten nun benutzen mit:
<?php echo "Er heisst" . $daten["name"] . " und seine Telefonnummer lautet: " . $daten["telefon"]; ?>
|
Mehrere Einträge holen und anzeigen lassen - SELECT
Tragt mit PHPMyAdmin noch ein paar Einträge zum probieren ein. Wir
werden jetzt alle Einträge auslesen, die wir in dieser Tabelle
finden.
<?php $server = "localhost"; $datenbank = "php-kurs"; $username = "web1"; $passwort = "abcdef";
$link = mysql_connect($server, $username, $passwort); if (!$link) die(mysql_error());
$db = mysql_select_db($datenbank, $link);
if ($db) { $re = mysql_query("SELECT * FROM adressen", $link);
while($daten = mysql_fetch_array($re, MYSQL_ASSOC)) { echo $daten["name"] . "-"; echo $daten["adresse"] ."-"; echo $daten["plz"] . "-"; echo $daten["ort"] . "-"; echo $daten["telefon"] ."<br>"; } }
mysql_close($link); ?>
|
Ausgabe: | Heiko Müller-Musterstraße 1-12345-Bremen-04221-98765 Peter Klein-Heldenstraße 15-98765-Hamburg-040 - 8458345 Monika Krause-Kaya Yanar Straße 4711-45923-Berlin-0411 - 88392 |
Wir könnten anstatt dem Sternchen in dem Select auch bestimmte Felder
angeben, die wir auslesen wollen. Dies spart Speicher bei großen Abfragen,
es stehen aber auch nur die Felder zum Auslesen zur Verfügung, welche wir
in dem Select angegeben haben.
Beispiel:
SELECT name,telefon FROM adressen
Die Select Abfrage weiter eingrenzen
Wir könnten diese Select Abfrage auch noch weiter begrenzen. Dies würden
wir wieder mit dem Where Befehl machen. Wir könnten uns zum Beispiel nur
alle Einträge anzeigen lassen, die aus Bremen kommen:
SELECT * FROM adressen WHERE ort="BREMEN";
Auch die Where Bedingung kann weiter verknüpft werden, so könnten wir
an das Where noch eine Bedingung hinten dranhängen, zum Beispiel zusätzlich
NUR die Einträge die auch noch (AND) den Namen Müller haben:
SELECT * FROM adressen WHERE ort="BREMEN" AND name LIKE "%Müller%";
Statt AND können wir auch OR verwenden, was nicht UND bedeutet, sondern ODER.
Es gibt viele verschachtelte Möglichkeiten. Man muss sich nur zuerst klar
darüber werden, was man genau aus der Datenbank möchte und dann muss
man versuchen dieses klar in SQL zu formulieren.
Alle Einträge wählen, wo der Ort NICHT Bremen ist und der name NICHT
so ähnlich wie Müller ist.
SELECT * FROM adressen WHERE ort!="Bremen" AND name NOT LIKE "%Müller%";
Zum Anfang solltet Ihr euch mit den normalen Abfragen begnügen.
Es gibt Abfragen, an denen selbst spezialisten einen halben Tag daran rumarbeiten
können, um sämtliche Bedingungen mit einzubinden. Man kann verschiedene
Tabellen miteinander verknüpfen, über mehrere Datenbanken mit einer einzigen
Abfrage gehen und daraus die kompliziertesten Gebilde bauen.
Datensätze in der Datenbank löschen - DELETE
Wir haben Datensätze gespeichert, geändert und ausgelesen. Wie lösche
ich nun einen Datensatz ? Hierfür benötigen wir den DELETE Befehl von
MySQL.
DELETE FROM adressen WHERE id=1;
Es wird der Eintrag aus der Tabelle adressen gelöscht, wo die id=1 ist.
Wie bei allen SQL Befehlen könnten wir auch hier weiter begrenzen und
Bedingungen hinzufügen.
Merke: Gerade der Delete Befehl ist kritisch. Wenn man die
Bedingung vergisst zu formulieren kann man unter Umständen schon alle 3000
Einträge aus einer Tabelle löschen, anstatt nur eines eintrags. Arbeitet
man an Tabellen die schon viele Einträge haben, freut man sich immer wieder
wenn man vorher mit PHPMyAdmin eine Kopie der Tabelle und des Inhalts exportiert
und abspeichert.
|