empty() und is_null() nach MySQL Query (MySql 5.0)

Mik3e

Erfahrenes Mitglied
Hi,

Kurze Frage:
In meinre Tabelle gibt es ein Attribut "deleted" vom Typ DATETIME, Default value ist NULL. Leicht zu durchschauen: Wenn ein Datensatz gelöscht wird, wird in dieses Feld ein Timestampt eingetragen und er ist somit als "gelöscht" markiert.

Mein Problem:
Ich lese die Datensätze aus der Tabelle aus und bei einigen wird beim Attribut "deleted" NULL zurückgeliefert (da ja nicht alle gelöscht sind).

Jedoch erhalte ich bei jedem Datensatz mit [phpf]is_null[/phpf] den Wert FALSE. Ich bin mir sicher, dass es daran liegt, das MySQL bei der Übergabe (ich verwende PEAR) nicht wirklich NULL übergibt oder dieses reservierte Wort von PHP anders interpretiert wird als von MySQL..

Mit [phpf]empty[/phpf] resp. $x=='' funktioniert es...
Nachdem ich das allerdings nicht wirklich elegant finde frage ich mal, ob jemand einen Kniff kennt wie die NULL Werte zwischen Tabellenattribut und Variable korrekt übergeben werden können?!

Danke & Ciao,
Mike
 
Bei mir ist alles, wie ich es erwarten würde, außer das die int-id zum string wird.

System: Win2k SP4, Apache 2, PHP 5.0.3, 4.1.10a-nt
PHP:
<pre>
<?
include "DB.singleton.php";

$res = DB::getInstance()->query("select * from `nullTest`");

$row = mysql_fetch_assoc($res);

mysql_free_result($res);

echo "\n\n";

var_dump($row);

echo "\n"
    .(($row['nullValue']==null)
        ?'gleich null'
        :'ungleich null')
    ."\n"
    .(($row['nullValue']===null)
        ?'identisch null'
        :'nicht identisch null')
    ."\n"
    .(is_null($row['nullValue'])
        ?'is null'
        :'is not null')
    ."\n"
    .(isset($row['nullValue'])
        ?'is set'
        :'is not set')
    ."\n"
    .(empty($row['nullValue'])
        ?'empty'
        :'not empty');

/*  Ausgabe:
 *
 *  array(2) {
 *    ["id"]=>
 *    string(1) "1"
 *    ["nullValue"]=>
 *    NULL
 *  }
 *
 *  gleich null
 *  identisch null
 *  is null
 *  is not set
 *  empty
 *
 */
?>
</pre>
Ich hatte mit einer früheren PHP- und MySQL-Version mal feststellen müssen, dass der entsprechende Array-Index gar nicht existiert, wenn der Wert in MySQL null ergibt. Vielleicht prüfst Du selbst auch mal mit [phpf]print_r[/phpf] oder [phpf]var_dump[/phpf]. Vielleicht lässt sich das Verhalten ja auch in der PHP-Ini konfigurieren. Was das angeht, kann ich mir mittlerweile alles vorstellen.

Gruß hpvw
 
Mojn mojn...

Komisch.. Das sich möglicherweise etwas zu MySQL 5.x geändert hat!?
Was ich mir noch vorstellen kann, ist, dass die funktion [phpf]is_null()[/phpf] nicht das selbe Ergebnis liefert wie die Abfrage "==null". Obwohl das eigentlich sehr unlogisch wäre und bei dir offensichtlich auch funktioniert...

Eventuell pfuscht mir auch die PEAR::DB dazwischen (NULL wird vielleicht in "" konvertiert), obwohl ich mir das eigentlich nicht vorstellen kann...

Mein System:
WinXP SP2, IIS 5, PHP 5.0.13; MySQL 5

Ciao,
Mike
 
Mik3e hat gesagt.:
Eventuell pfuscht mir auch die PEAR::DB dazwischen (NULL wird vielleicht in "" konvertiert), obwohl ich mir das eigentlich nicht vorstellen kann...
Das ist ja nicht so schwer herauszubekommen.
Gebe mit [phpf]var_dump[/phpf] das Ergebnis der PEAR-Klasse aus und mache die gleiche Abfrage noch mal von Hand in einem Testskript mit [phpf]mysql_connect[/phpf], [phpf]mysql_select_db[/phpf], [phpf]mysql_query[/phpf] und [phpf]mysql_fetch_assoc[/phpf] (nur zur Erinnerung, man vergisst ja den herkömmlichen Weg irgendwann, wenn man immer nur noch mit vorgefertigten Klassen arbeitet) und gib auch hier die einzelnen Zeilen mit [phpf]var_dump[/phpf] aus.

Gruß hpvw
 
Hi,

Ne, das kann es auch nicht sein.. Hab mir die Doku durchgelesen.. PEAR übergibt die Daten 1:1 an den Resultset. Irgendwie auch logisch, da die DB Klasse im Hintergrund ja auch nur mit den normalen PHP Funktionen der mysqllib (bzw. mysqli) arbeitet...

Im Prinzip ist es ja auch egal, wenn es mit empty() funktioniert... Dennoch bin ich etwas verwundert.. Aber Du weißt ja, dass ich noch wesentlich "gröbere" Probleme habe, drum kann ich mich nicht wirklich mit so kleinen Phänomenen stundenlang beschäftigen ;)

Hab Dir übrigens wieder ne Mail zur Abwechslung geschickt ;)

Ciao,
Mike
 
Zurück