quakenet:#php Tutorial

Author: Progman, zuletzt bearbeitet von progman @ 2004/08/06 11:00:18

Bitte beachten Sie, dass die Tutorialkapitel zusammenhängen. Wenn sie direkt auf ein Kapitel verlinkt wurden müssen Sie gegebenenfalls die vorherigen Kapitel auch lesen. Achten Sie beim lesen darauf, dass Sie kein Kapitel überspringen.

Ausgeben von Werten

  1. SELECT in PHP und MYSQL
  2. Syntax von SELECT
  3. Spaltennamen umbenennen

1. SELECT in PHP und MYSQL

Jetzt haben wir eine Tabelle erstellt und haben diese Tabelle mit ein paar Datensätzen gefüllt. Das wichtigste ist jetzt, wie man diese Daten nun ausließt. Dafür gibt es den sehr komplexen Befehl SELECT.

Der SELECT-Befehl erstellt, wenn er keine Fehler enthält, immer eine interne Ergebnistabelle. Diese Tabelle kann beliebig viele Spalten und Zeilen haben, kann aber auch leer sein.

In PHP schickt man ja ein Query mit mysql_query ab. Diese Funktion liefert beim (gültigen) SELECT-Befehl eine Resource-ID.

<?php
    $result
= mysql_query('Ein gültiger SELECT-Befehl') OR die(mysql_error());
    
var_dump($result);
?>

Dies könnte folgende Ausgabe ausgeben.

resource(2) of type (mysql result)
        

Die Funktion mysql_query liefert bei einem SELECT-Befehl immer eine Resource-ID. Sie liefert kein Array, keine Zahl und kein String zurück. Selbst wenn man nur einen einzigen Wert ausliest, liefert mysql_query trotzdem eine Resource-ID zurück. In diesem Fall ist die intern erstellte Ergebnistabelle 1x1 Felder groß. Typischer Fehler in PHP ist die direkte Ausgabe des mysql_query Rückgabewertes.

<?php
    $result
= mysql_query('SELECT Name FROM Userliste') OR die(mysql_error());
    echo
'Der Name des Users ist '.$result;
?>

Ausgabe:

Der Name des Users ist Resource id #2
        

Immer wenn man sowas wie "Resource id #XY" in der Ausgabe sieht, hat man einen Fehler gemacht ;)

2. Syntax von SELECT

Der SELECT-Befehl erzeugt intern eine Ergebnistabelle. Im SELECT Befehl gibt man die Werte, die man zurückgeliefert haben möchte, hinter dem Wort SELECT durch Kommas getrennt an. Dies könnte z.B. so aussehen.

mysql> SELECT 'foobar', 3.1415, "foobar";
+--------+--------+--------+
| foobar | 3.1415 | foobar |
+--------+--------+--------+
| foobar | 3.1415 | foobar |
+--------+--------+--------+
        

Dieses "mysql>" ist der Eingabepromt für ein MySQL-Befehl. Wenn man auf einem Linux-Server den Befehl mysql eingibt hat man die Möglichkeit MySQL-Befehle direkt an die Datenbank zu schicken. Wer kein Zugriff auf einen Linux-Server mit installierten MySQL hat kann PHPMyAdmin benutzen. Dort kann man, wenn man links auf den Datenbanknamen klickt, entweder im Untermenu SQL oder wenn man ein wenig runterscrollt direkt MySQL-Befehle eingeben.

Mit dem Programm mysql und in PHPMyAdmin sehen sie nach dem Eingeben des MySQL-Querys eine Tabelle. Diese Tabelle hat 3 Spalten und 2 Zeilen. Aber in Wirklichkeit hat diese Tabelle nur eine Zeile. Die erste der beiden Zeilen gibt den Namen der Spalten der Ergebnistabellen an. Es ist jetzt reiner Zufall dass sie den gleichen Namen haben wie die Werte der Spalten. Wenn man Daten aus einer Tabelle ausliest haben die Spalten der Ergebnistabelle die selben Namen wir die Spalten der Tabellen aus denen man Informationen auslesen will.

Das die Spaltennamen und Werte in dem Beispiel oben wirklich reiner Zufall ist, sieht man am nächsten Beispiel.

mysql> SELECT NOW(), 'NOW()', "NOW()";
+---------------------+-------+-------+
| NOW()               | NOW() | NOW() |
+---------------------+-------+-------+
| 2002-12-14 17:44:47 | NOW() | NOW() |
+---------------------+-------+-------+
        

Hier sieht man einmal den Unterschied zwischen NOW() und 'NOW()'. Im ersten Fall wird der Rückgabewert von der MySQL-Funktion NOW() ausgegeben, in anderem Fall ein einfacher String 'NOW()'. Bei Strings ist es egal ob man ' oder " benutzt. Man sollte aber das Zeichen wählen, was man nicht als PHP-String benutzt. Wenn man also in PHP den Query mit " zusammenbaut sollte man ' als MySQL-String Zeichen nehmen. Damit erspart man sich eine Menge escaperei.

3. Spaltennamen umbenennen

Greifen wir nochmal das Beispiel von vorhin auf.

mysql> SELECT NOW(), 'NOW()', "NOW()";
+---------------------+-------+-------+
| NOW()               | NOW() | NOW() |
+---------------------+-------+-------+
| 2002-12-14 17:44:47 | NOW() | NOW() |
+---------------------+-------+-------+
        

Hier haben die Spalten alle den selben Namen. In PHP ist dies aber nicht erwünscht. Denn da heißt es "Gibt den Wert der Spalte XY aus". Der Programmierer hat dann keine Ahnung, welchen Wert er nun in der Variable gespeichert hat.

Deswegen sollte man die Spaltennamen umbenennen. Dies macht man indem man hinter dem Wert oder der Funktion ein AS bla schreibt. An der Stelle "bla" schreibt man dann einen Text unter den man dann diesen Spaltenwert erreichen kann. Dieser sollte ein sinnvollen und eindeutigen Namen haben.

mysql> SELECT NOW() AS Jetzt, 'NOW()' AS String1, "NOW()" AS String2;
+---------------------+---------+---------+
| Jetzt               | String1 | String2 |
+---------------------+---------+---------+
| 2002-12-14 18:43:06 | NOW()   | NOW()   |
+---------------------+---------+---------+
        

Da ein SELECT-Befehl recht lang werden kann, sollte man an gewissen stellen im MySQL-Query ein Zeilenumbruch schreiben und bestimmte Blocksegmente einrücken. Es eignet sich hinter dem Wort SELECT ein Zeilenumbruch zu erzeugen. Desweiteren sollte hinter jeder Spaltenangabe auch ein Zeilenumbruch erzeugt werden. Und als letzes sollte man die Spaltenangaben um 4 Zeichen einrücken. Dies sieht dann so aus.

mysql> SELECT
    ->     NOW() AS Jetzt,
    ->     'NOW()' AS String1,
    ->     "NOW()" AS String2;
+---------------------+---------+---------+
| Jetzt               | String1 | String2 |
+---------------------+---------+---------+
| 2002-12-14 18:46:39 | NOW()   | NOW()   |
+---------------------+---------+---------+
        

Hier sieht man sofort, ohne den query auszuführen, wieviele Spalten in der Ergebnistabelle vorhanden sind und, falls eine "AS xyz" Angabe vorhanden ist, auch unter welchem Spaltennamen die einzelnen Werte zu erreichen sind.

Fragen zum aktuellen Thema

  1. Was erzeugt MySQL intern bei einem SELECT-Befehl?
  2. Wie kann ich den Name der Spalte der Ergebnistabelle ändern?
Was erzeugt MySQL intern bei einem SELECT-Befehl?

Bei einer SELECT Abfrage erstellt MySQL intern eine Ergebnistabelle. Auf diese kann man dann mit der Resource-ID von mysql_query zugreifen.

Wie kann ich den Name der Spalte der Ergebnistabelle ändern?

Wenn man hinter dem Ausdruck (z.B. Wert oder Funktion) ein "AS bla" schreibt ('bla' ist ein beliebiger Text) kann man den Namen der Spalte der Ergebnistabelle ändern. Wenn man das nicht macht, heißt die Spalte so wie der Ausdruck. Dies kann bei Verwendung von Funktionen sehr schlecht sein.

Nach oben