mbr: Typ von Datenbankfeldern (MySQL) bei PHP Abfrage

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

  1. 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";

    1. 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

      --
      Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
      Nur selber lernen macht schlau

  2. 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

    --
    Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
    Nur selber lernen macht schlau