Bisher haben wir immer alle Datensätze abgefragt, aber zum Glück können wir auch gezielt einzelne Datensätze abfragen. Dabei ändert sich nur der Text (Wert) der Variable $query , alles andere bleibt gleich. Fürs erste lernen wir das Attribut WHERE kennen, damit fragen wir Datensätze ab, die einen oder mehreren Kriterien entsprechen.
Die Abfrage dafür muss so aussehen:
<?php $query = "SELECT * FROM phonebook WHERE id = '1'"; ?>
Wie ihr wisst, muss danach wieder das alte Script folgen:
<?php $query = "SELECT * FROM phonebook WHERE id = '1'"; $result = mysql_query($query); while($row = mysql_fetch_object($result)) { echo "$row->name </br>"; } ?>
Aber wie schon oben erwähnt, ändert sich nur der Text (Wert) von $query.
Mit dieser Abfrage wählen wir den Datensatz aus, welcher die Id 1 hat, und nur dieser Datensatz wird dann ausgegeben.
Wir können aber auch andere Kriterien setzen, z.B. so:
<?php $query = "SELECT * FROM phonebook WHERE id != '1'"; ?>
Hiermit geben wir alle Datensätze aus, die als ID nicht den Wert 1 haben. Oder wir fragen die Datensätze ab, in denen die id kleiner als 10 ist.
<?php $query = "SELECT * FROM phonebook WHERE id < '10'"; ?>
Dies geht natürlich auch mit größer (>) aber auch mit allen anderen Operatoren die ihr von den Schleifen/if-Anweisungen her kennt. Wir können auch andere Spalten überprüfen lassen, z.B. alle Datensätze ausgeben, in denen als name Max angegeben wurde. Dies sieht dann so aus:
<?php $query = "SELECT * FROM phonebook WHERE name LIKE 'Max'"; ?>
Anstatt das Gleichheitszeichens wurde jetzt LIKE benutzt. Man könnte zwar ein Gleichheitszeichen benutzen, allerdings sollt ihr beide Varianten sehen. Man kann auch NOT LIKE benutzen, dies ergibt den selben Effekt wie !=.
Eventuell möchte man ja auch mehrere Datensätze abfragen, dafür gibt es das Attribut: IN ()
<?php $query = "SELECT * FROM phonebook WHERE id IN ('1', '3')"; ?>
Dies würde die Datensätze 1 und 3 abfragen. Das gleiche geht auch mit Text. Natürlich kann man die Werte auch durch Variablen ersetzen und den Variablen dann Werte zuweisen, z.B. aus einem Formular.
Manchmal möchte man ja nur Datensätze abfragen, in denen der Name mit M anfängt. Für unbekannte Zeichen benutzt man in MySQL das: Prozentzeichen (%).
<?php $query = "SELECT * FROM phonebook WHERE name LIKE 'M%'"; ?>
Man kann das Prozentzeichen immer benutzen, wenn man die genaue Zeichenfolge nicht kennt, also wenn man alle Namen ausgeben möchte, die ein a haben: Die Abfrage sieht so aus:
<?php $query = "SELECT * FROM phonebook WHERE name LIKE '%m%'"; ?>
Man kann auch mehrere Kriterien setzen, man benutzt dazu AND,OR und XOR. Sie haben die gleiche Funktion wie bei einer if-Anweisung.
<?php $query = "SELECT * FROM phonebook WHERE name LIKE 'Max' AND id < '10'"; ?>
Diese Abfrage würde alle Datensätze ausgeben die als name Max haben und als id einen kleineren Wert als 10.
Möchte man die Ausgabe sortieren, z.B. so, dass der neuste Beitrag immer oben steht (dafür kann man auch gut das id-Feld benutzen).
Man kann aber auch andere Felder (z.B. das URL-Feld) sortieren lassen, z.B. alphabetisch. Hierfür benötigt man ORDER BY
<?php $query = "SELECT * FROM phonebook ORDER BY id"; ?>
Diese Abfrage würde die Einträge der id nach aufsteigend (1,2,3,4) ausgeben, wenn wir am Schluss noch ein DESC schreiben, wird die Ausgabe der id nach absteigend (4,3,2,1) ausgegeben.
<?php $query = "SELECT * FROM phonebook ORDER BY id DESC"; ?>
Manchmal sieht man auch anstatt einem DESC ein ASC, dies hat die gleiche Wirkung, wie die Abfrage von oben (1,2,3,4), aber diese wird von PHP als Standard eingesetzt, wenn es nicht angegeben wurde. Wir können jetzt auch die anderen Felder sortiert ausgeben lassen
<?php $query = "SELECT * FROM phonebook ORDER BY name"; ?>
Dies würde die Ausgabe nach der Spalte name alphabetisch (a,b,c,d) ausgeben. Die Angabe von DESC würde dies wieder umdrehen (d,c,b,a). Möchten wir für die Sortierung mehrere Kritieren angeben, müssen wir diese durch Komma trennen.
<?php $query = "SELECT * FROM phonebook ORDER BY name, id DESC"; ?>
Diese Abfrage sortiert die Ausgabe erst nach dem name (a,b,c,d) und dann nach der id allerdings falsch herum (4,3,2,1).
Möchte man nur eine gewisse Anzahl von Datensätzen ausgeben, setzt man den Befehl LIMIT ein.
<?php $query = "SELECT * FROM phonebook LIMIT 3"; ?>
Diese Abfrage würde nur 3 Datensätze ausgeben, denn mit LIMIT bestimmen wir, das nur eine gewisse Anzahl von Datensätzen ausgeben wird.
<?php $query = "SELECT * FROM phonebook LIMIT 10,5"; ?>
Hiermit werden 5 Datensätze ab dem 10. abgefragt. Somit realisiert man z.B. später eine Blätterfunktion.
Natürlich kann man auch alle Funktionen verbinden:
<?php $query = "SELECT * FROM phonebook WHERE name LIKE 'Max' AND id < '20' ORDER BY name, id DESC LIMIT 10,5"; ?>
Dies würde den Datensätze ausgeben, in denen als name Max steht und die id kleiner ist als 20.
Die Abfrage wird dann bei name alphabetisch sortiert (a,b,c) und die id absteigend sortiert (3,2,1).
Anschließend werden nur 5 Datensätze vom 10. ab ausgegeben.
Davor entsprachen die Datensätze 1 bis 9 auch den Kriterien, wurden aber durch das LIMIT nicht ausgegeben.
Aber Achtung, die Reihenfolge der einzelnen Attribute darf nicht willkürlich sein.
Zuerst muss dort SELECT * FROM table stehen.
Als nächstes kommt WHERE mit den Kriterien. Danach kommt ORDER BY mit den genaueren Bestimmungen zu Ausgabe. Zum Schluss kommt LIMIT.
Abfrage auf der ganzen Seite benutzen
Möchte man die Abfrage einer Tabelle auf der ganzen Seite benutzen, könnte man die Seite in die While-Schleife schreiben, das wäre aber sehr umständlich. Es geht auch einfacher.
Wenn wir nur 1 Wert als Ausgabe haben, dann kann die while-Schleife auch entfallen.
<?php $query = "SELECT * FROM phonebook WHERE id = '1'"; $result = mysql_query($query); $row = mysql_fetch_object($result); echo "$row->name"; ?>
Damit wir nur 1 Wert erhalten, können wir uns die Eigenschaft des id Feldes zu Nutzen machen, denn es gibt nur ein Feld in der Tabelle, das den Wert 1 enthält. Dies haben wir durch den Primary (Primärschlüssel) erreicht.
Man könnte auch LIMIT benutzen.
<?php $query = "SELECT * FROM phonebook LIMIT 1"; $result= mysql_query($query); $row = mysql_fetch_object($result); echo "$row->url"; ?>