Category: SQL / MySQL


Wer mit PHP Daten in eine Datenbank bzw. in eine Tabelle schreiben möchte, der kennt normalerweise auch die Struktur der Tabelle. In einigen Fällen braucht man aber vielleicht trotzdem zur Laufzeit genauere Informationen zu den Feldern.

Hier können die folgenden PHP-Funktionen hilfreich sein:

string mysql_field_type(resource $result , int $field_offset) (Achtung: deprecated)
string mysql_field_name(resource $result , int $field_offset) (Achtung: deprecated)
int mysql_field_len(resource $result , int $field_offset) (Achtung: deprecated)

Achtung! Alle diese Funktionen sind, wie die ganze PHP-MySQL-API veraltet. Der Einsatz ist also nur dort sinnvoll, wo ohnehin noch mit der alten MySQL-Extension gearbeitet wird. Generell sollte in Zukunft eher auf mysqli oder PDO_MYSQL gesetzt werden.

Dennoch soll ein kleines Beispiel zeigen, wie die Funktionen genutzt werden können, um Detailinformationen zu den verwendeten Feldern zu erhalten.
————————————



————————————
Ausgabe:

Feldanzahl: 3
Feldname : diameter (int:11)
Feldname : pizza (string:20)
Feldname : veggie (string:3)

Manchmal gibt es den Wunsch, Daten in einer SQL-Abfrage direkt bei Abfrage/Ausgabe anzupassen. Z.B. wenn man sich in der Nachverarbeitung einen Schritt sparen möchte. Zwei Hilfsmittel bestehen mit den Ausdrücken CASE und IF. Möchte man z.B. Werte vor der Ausgabe umbenennen, so kann der CASE-Ausdruck helfen.

Beispiel:
In einer Pizzadatenbank liegt die Information, ob eine Pizza vegetarisch ist, als ‚ja‘ oder ’nein‘ vor.
In der Ausgabe soll aber explizit ‚vegetarisch‘ oder gar nix stehen.

Ich gehe mal von dieser Tabelle aus :

diameter pizza veggie
17 Tonno no
18 Quattro Stagioni no
17 Prosciutto no
18 Hawaii no
18 Bolognese no
35 Peperoni yes
36 Margherita yes
18 Spinaci yes
38 Vegetale yes

Das könnte man dann so machen:

SELECT pizza,
CASE veggie WHEN 'yes' THEN 'vegetarisch'
ELSE '' END AS 'veggie'
FROM `mydb`

Dann kommt man zu dieser Ausgabe:

pizza veggie
Tonno
Quattro Stagioni
Prosciutto
Hawaii
Bolognese
Peperoni vegetarisch
Margherita vegetarisch
Spinaci vegetarisch
Vegetale vegetarisch

Möchte man nun noch je nach Durchmesser der Pizza eine Bezeichnung gross/klein vergeben, so ist dies wegen der Schwankungen in der Größenangabe nicht mehr so leicht mit CASE zu regeln, da die Vergleichsoperatoren größer (>) und kleiner (<) hier nicht funktionieren. Mit einem zusätzlichen IF-Ausdruck kann, je nach Durchmesser, eine Einteilung in gross oder klein vorgenommen werden:
SELECT pizza,
CASE veggie WHEN ‚yes‘ THEN ‚vegetarisch‘
ELSE “ END AS ‚veggie‘ ,
IF(diameter >30, ‚gross‘, ‚klein‘) AS groesse
FROM `mydb`

Hierbei werden dem IF drei Parameter mitgegeben.
– Bedingungsausdruck
– Ausdruck, wenn Bedingungsausdruck wahr
– Ausdruck, wenn Bedingungsausdruck nicht wahr

Wir erhalten somit folgende Ergebnistabelle:

pizza veggie groesse
Tonno klein
Quattro Stagioni klein
Prosciutto klein
Hawaii klein
Bolognese klein
Peperoni vegetarisch gross
Margherita vegetarisch gross
Spinaci vegetarisch klein
Vegetale vegetarisch gross