Typ von Datenbankfeldern (MySQL) bei PHP Abfrage
mbr
- php
Hallo Leute,
ich hoffe, dass das Topic nicht zu konfus ist, aber mir ist keine bessere Formulierung eingefallen.
Also: ich habe eine MySQL Datenbank mit einer Tabelle "tbl_farben_schriften" , in der die Felder "far_id", "far_RGB" und "far_typ" vorhanden sind. "far_id" und "far_typ" haben den Datentyp int(11), "far_RGB" hat den Datentyp varchar(7). So weit so gut.
In PHP führe ich nun folgende Abfrage aus:
//Farbdaten fuer Schriften holen
$sql="SELECT * FROM tbl_farben_schriften";
$erg=$db->query($sql);
if($erg)
{
$i=0;
while($FarbenSchriften[$i]=mysql_fetch_array($erg))
{
$meldung1.=gettype($FarbenSchriften[$i]['far_typ'])."<br>";
$i++;
}
}
$FarbenSchriftenAnzahl=$db->getAnzahl();
Das funktioniert auch erstmal. Aber wenn ich mir später im Skript die Variable $meldung1 ausgeben lasse, sehe ich, dass der Typ von $FarbenSchriften[$i]['far_typ'] "string" ist. Da ich später mit dem Operator === arbeite, funktioniert dann natürlich sowas nicht:
if($FarbenSchriften[21+$i]['far_typ']===2)
{
$bgColor=$FarbenSchriften[21+$i]['far_RGB'];
}
Daher nun meine Frage(n): Ist das wirklich ein Bug von PHP, dass die Typen der einzelnen Tabellenspalten nicht korrekt übergeben werden, oder mache ich irgendetwas falsch?
Ich habe in der Hilfe zu PHP (hier als deutsche CHM-Datei vorhanden) leider nichts gefunden zu dieser Problematik bei mysql_fetch_array()
Würdet ihr in so einem Fall einfach auf das === verzichten und nur == nehmen (dann funktioniert es ja anscheinend wieder)?
Oder wäre es "sauberer" den Typ von $FarbenSchriften[21+$i]['far_typ'] explizit auf Integer zu setzen?
Ich meine: ich könnte ja auch einfach die 2 in Anführungszeichen setzen, dann funktioniert es auch wieder, aber ich fände es schon schöner, wenn ich mich auf den Typ aus der Datenbank verlassen könnte...
liebe Grüße mbr
echo $begrüßung;
Daher nun meine Frage(n): Ist das wirklich ein Bug von PHP, dass die Typen der einzelnen Tabellenspalten nicht korrekt übergeben werden, oder mache ich irgendetwas falsch?
Nicht für jeden MySQL-Spaltentyp gibt es Pendant in PHP und umgekehrt. Alles was von MySQL zurückkommt bekommt den PHP-Typ String. (Eine Ausnahme sind NULL-Ergebnisse, die ebenfalls als PHP-Typ NULL ergeben.) Normalerweise stellt das kein Problem dar, weil PHP eine automatische Typumwandlung vornimmt, wenn es erforderlich ist. Man darf es ihm nur nicht untersagen, indem man einen typberücksichtigenden Vergleichsoperator === verwendet.
Würdet ihr in so einem Fall einfach auf das === verzichten und nur == nehmen (dann funktioniert es ja anscheinend wieder)?
Ja. Solange es keinen zwingenden Grund gibt, im weiteren Programmverlauf einen Integer zu verwenden, würde ich es als String belassen.
echo "$verabschiedung $name";
Hello Dedlfix,
da entscheide ich mich nun mal, auf dieses verwaiste Posting zu antworten, und schon tust Du ndas Gleiche. Da hätte ich es mir ja fast verkneifen können... :-)
Harzliche Grüße vom Berg
http://www.annerschbarrich.de
Tom
Hello,
Generell sind bei den Ergebnismengen von SQL-Datenbanken alle Werte vom Typ String. Sie werden schließlich auch textlich dargestellt, und nicht im Binärmodus. Das bedeutet, dass die Zahl Fünfundsechzig als '65' geliefert wird, und nicht als 'A' oder gar 41h.
Wenn Du die Spaltentypen einer Tabelle, die sich von Zeile zu Zeile bei einem intakten DBMS nicht ändern sollten, wissen musst, dann benutze Abfragen wie
Show columns from $tablename
Display columns from $tablename
oder ähnliche Abfragen (Je nach DBMS)
Wenn Du ganz pedantisch sein willst, müsstest Du diese Abfrage bei jedem Request tätigen, und zwar als Common-Request mit dem eigentlichen. Bei einem DBMS, das keine COMMON-Requests kann, müsstest Du die bezogenen Tabellen für die Typen-Abfrage und das eigentliche Query sogar gegen Veränderung sperren, und die beiden Statements damit binden.
Sinnvoller sind Transformations-Plausibilitäts-Prüfungen.
Nichts anderes macht ja das DBMS beim _Eintragen_ der Werte ind die Tabelle. Es prüft, ob ein Wert, der in eine als ZAHL gekennueichnete Spalte eingetragen werden soll, auch das Aussehen einer Zahl (aber immer noch textlich dargestellt) hat.
Beispielabfrage auf
Feldname gettype() Wert
Feldname: ID_ADRESSE string 1
Feldname: TABLENAME string 1
Feldname: ID_PARENT string 3
Feldname: LASTCLICK string 20050604011516
Feldname: FIRSTCLICK string 20030102000000
Feldname: CAT string 01.
Feldname: VORNAME string Hans
Feldname: NACHNAME string Dampf
Feldname: STATUS string
Feldname: IDX string
Feldname: IP string 192.168.101.99
Feldname: ID_FARBE string 1
Feldname: NUMI string 1
Feldname: DATUM string 2004-01-02 00:00:00
Feldname: PREIS string 99999999.99
Feldname: MARK string
bei einer Tabelle in einer MySQL-Datenbank
Harzliche Grüße vom Berg
http://www.annerschbarrich.de
Tom