Pete: NULL-Felder in Sybase

Hallo,

ich fülle mit PHP Daten in eine Sybase-Datenbank. Es gibt einige Felder, die mit NULL gefüllt werden sollen, wenn nichts eingetragen wird. Die Ausgabe des SQL-Codes zeigt auch, dass nichts weitergegeben wird. Aber in der Datenbank ist in den leeren Feldern nun ein Leerzeichen, weswegen es sich auch nicht auf NULL überprüfen lässt. So muss ich nun bei allen Feldern zuerst die Leerzeichen entfernen (ich mach das mit 'trim'), bevor ich feststellen kann, ob in das Feld was eingetragen wurde. Ein etwas umständlicher Weg - sollte ja eigentlich nicht Sinn der Sache sein. Wahrscheinlich muss das an PHP liegen, aber keine Ahnung wo das sein könnte. Vielleicht könnt ihr mir einen Tipp geben, woran es liegen könnte.

Viele Grüsse
Pete

  1. Hi,

    ich weiß nicht, ob ich dein Problem wirklich verstanden habe, aber wenn ja:
    Was gibst du bei dem Query als Wert an, du könntest es mit einem expliziten NULL versuchen oder alternativ mit gar keiner Belegung
    INSERT INTO tab (SpalteMitNullwert, SpalteOhneNullwert) VALUES (NULL, 'Hallo');
    INSERT INTO tab (SpalteOhneNullwert) VALUES ('Hallo');

    Oder kann es sein, dass deine Datenbank einen Default-Wert besitzt, für den Fall das nichts festgelegt wurde?

    1. Hallo,
      die Daten für den Query kommen aus einem Formular. Das sieht in etwa so aus:

      insert into tab (vorname, name) values ('$HTTP_POST_VARS[vorname]', '$HTTP_POST_VARS[name]');

      Wenn dann nichts im Formular ausgefüllt wurde, bleibt das Feld leer und es dürfte eigentlich nichts in die Datenbank eingetragen werden, oder liege ich da falsch? Defaultwert ist keiner festgelegt. Vielleicht sollte ich das mit der expliziten Zuweisung von NULL mal versuchen. Dachte halt, dass automatisch auf NULL gesetzt wird, wenn nichts im Formularfeld eingetragen wird.

      Viele Grüsse
      Pete

      1. Hallo,

        ja, ich vermute (!) du liegst da falsch.

        insert into tab (vorname, name) values ('$HTTP_POST_VARS[vorname]', '$HTTP_POST_VARS[name]');

        Meine Ansicht nach sieht die Abfrage ja dann bei leeren Eingaben so aus:
        insert into tab (vorname, name) values ('', '');
        Das was hier steht, sind aber nicht NULL-Werte sondern leere Strings - Ein NULL-Wert wäre es, wenn das Feld nicht angesproche würde oder dort NULL stünde...

        1. Hallo,
          so etwas ähnliches hatte ich mir fast schon gedacht. Hmm, jetzt ist nur die Frage, wie ich das hinbekomme? Die Daten werden von dem Formular an die insert-Datei weitergegeben. Wie kann ich erreichen, dass dort NULL eingetragen wird? Bzw. ein Feld weggelassen wird? Das Formular ist ewig lang. Ich könnte alle Felder überprüfen, ob dort was eingetragen wurde? Aber wie gebe ich dann den Wert NULL an den insert-Befehl weiter? Irgendwie steh ich gerade voll vor dem Wald...

          Pete

          1. Hi,

            das ist wohl war, bei einem langen Formular ist das wohl wirklich eine ziemlich aufwendige Sache. Aber gehen würde es in etwa so:

            $db_feld1 = ($HTTP_POST_VARS['feld1'] == "") ? "NULL" : "'".$HTTP_POST_VARS['feld1']."'";
            $db_feld2 = ($HTTP_POST_VARS['feld2'] == "") ? "NULL" : "'".$HTTP_POST_VARS['feld2']."'";
            $db_feld3 = ($HTTP_POST_VARS['feld3'] == "") ? "NULL" : "'".$HTTP_POST_VARS['feld3']."'";

            // In jedem db-String steht jetzt entweder nur NULL oder '<inhalt>'.
            // --> Insert
            mysql_query("INSERT INTO tab (f1, f2, f3) VALUES ($db_feld1, $db_feld2, $db_feld3)");

            // je nach Inhalt sieht dann der DB-Interpreter "aha, NULL" oder er fügt einen String ein.

            -------

            Einzige Frage wäre, ob es evtl. mit einem for-each noch eine elegantere Lösung für die geposteten Variablen gäbe, so nach dem Motto Array automatisch verwandeln oder so. Aber so auf Anhieb weiß ich nicht, ob es die Gedanken Wert wäre, kommt darauf an, ob das Skript mal irgendwann gewartet werden muss...

            1. Hallo,

              vielen Dank für die Tipps. Ich denke, ich werde es jetzt so machen, dass ich die Feldnamen in ein Array schreibe und mit einer foreach-Schleife alle Felder durchlaufe. Wenn in der POST-Variable nichts drinsteht, passiert nichts, wenn doch, dann wird der SQL-Befehl um die Felder ergänzt. Muss ich aber wohl zweimal durchlaufen: einmal für die Feldnamen und einmal für die VALUES. Wenn dann das Feld nicht in der INSERT-Anweisung auftaucht, müsste es in der Datenbank automatisch auf NULL gesetzt werden. Ok, vielen Dank erst mal...

              Pete