Problem mit Vergleichsoperator

en2k

Erfahrenes Mitglied
Hi

Folgendes Problem: Ich lass eine Variable (Ergebnis eines MYSQL-Queries) ausgeben und dann mittels des Vergleichsoperators !== überprüfen. Und zwar wie folgt:

PHP:
$updateresult = mysql_db_query("blabla", "UPDATE usw LIMIT 1;");
echo ($updateresult);
if ($updateresult !== 1)
    {
         ......
    }

So, echo sagt mir, dass $updateresult den Wert 1hat, und wenn mich nicht alles täuscht, dann sollte man doch von der Funktion mysql_db_query im erfolgreichen Update-Fall die Anzahl der erfolgreich geänderten Datensätze zurückbekommen (also einen Integer). Wieso arbeitet er dann die Schleife trotzdem ab?

Ciao, Nino
 
zum einen ist die Funktion veraltet seit PHP 4.0.6, wenn du also ein neueres PHP hast, was auf jeden Fall sinnvoll wäre, benutze lieber mysql_query.

@aquasonic: nein sollte es nicht. gegenüber zu != (bzw ==) vergleicht !== bzw (===) neben dem Wert auch den Datentyp. So wäre bei $i = "1"; der Vergleich $i == 1 zwar wahr, bei $i === 1 aber falsch, da $i eine 1 als Stringt und nicht vom Datentyp int enthält.

Mi dem Rückgabewert täuschsts du dich allerdings, da sowohl mysql_query als auch mysql_db_query eine Ressource bzw TRUE (boolean) zurückgeben (und FALSE natürlich be Fehler).
Im Falle von Update ist daher also mit einem TRUE zu rechnen.
Ergo müsste dein Vergleich $updateresult === TRUE bzw. $updateresult == 1 lauten (da allo 0 fremden Zahlen TRUE entsprechen).

Auf die 1 kamst du warhscheinlich wegen dem echo ($updateresult). Für sowas solltest du dann lieber var_dump() benutzen, da dies dir auch den genauen Datentyp ausgibt. Die Ausgabe eines Boolean-Wertes mit echo jedoch gibt dir nur 1 oder 0 aus.
 
Ah OK, das wusste ich nicht, wieder etwas gelernt :)

Aber ich denke mal in seinem Fall meinte er schon != und nicht !== ?!
 
ja je nachdem halt ;)

!= 1 oder eben !== TRUE

eigentlich kann er es auch gleich verkürzen zu
PHP:
if( mysql_db_query("blabla", "UPDATE usw LIMIT 1;") )
    echo "updated";
else
    echo "fehler: ".mysql_error();

dann spart er sich eine Variable und den Operator gleich mit ;)

wobie angebmerkt sei, dass bei der Verwendung von mysql_query() der Tabellenname wegfällt, da dieser mit mysql_select_db vorher schon ausgewählt sein muss / sollte -> mysql_query("UPDATE...");
 
Öhm, also nochmal:

!= : vergleicht nur das Ergebnis ohne Rücksicht auf den Datentyp.
!==: vergleicht das Ergebnis und den Datentyp.
und mysql_query oder mysql_db_query liefern dann nur true oder false (1 oder 0) zurück, was dann auch der Grund war, dass es nicht funktioniert hat, da ich dann einen Bool'schen Typ mit einem Integer verglichen hab!? Komisch, in meiner Dokumentation steht was, dass bei einer "UPDATE"-Anfrage die Anzahl der tatsächlich geänderten Datensätze zurückgeliefert wird (MySQL 3.23.51-Doku).. Nicht mal auf die kann man sich mehr verlassen. :(

Ciao, Nino
 
du schaust ja auch in der mySQL-Doku. Du musst schon in der PHP-Befehlsrefernz schauen. Dort steht bei mir dann folgendes:

Returns a positive MySQL result resource to the query result, or FALSE on error. The function also returns TRUE/FALSE for INSERT/UPDATE/DELETE queries to indicate success/failure.

und mysql_query oder mysql_db_query liefern dann nur true oder false (1 oder 0) zurück, was dann auch der Grund war, dass es nicht funktioniert hat, da ich dann einen Bool'schen Typ mit einem Integer verglichen hab!?
korrekt. bei select anweisung liefern sie eine ressource zurück, die jedoch ebenfalls mit einem TRUE/FALSE Vergleich überprüft werden kann. Alternativ geht auch ein vergleich ob is_resource() auf dein Handle, z.B. is_resource($mein_query_rueckgabewert) TRUE ist.
 
Zurück