mysql null vs. php null

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • mysql null vs. php null

    hi leute,

    wie schon im betreff geschrieben unterscheiden sich ja die null-werte.
    ich wollte mal eine kleine session-verwaltung auf die beine stellen. hier die datenbanktabelle dazu:
    Code:
    CREATE TABLE `user_session` (
      `session_id` varchar(32) NOT NULL default '',
      `account_name` varchar(20) default NULL,
      `last_timestamp` varchar(10) NOT NULL default '',
      `session_data` text NOT NULL,
      PRIMARY KEY  (`session_id`),
      UNIQUE KEY `account_name` (`account_name`)
    )
    nicht angemeldete benutzer bekommen in der dazugehörigen php-klasse den wert null: private $account_name=null;

    mein insert, wenn eine neue session gestartet wird, sieht dazu so aus:
    PHP-Code:
    $sql="INSERT INTO `user_session` 
    (`session_id`, `account_name`, `last_timestamp`, `session_data`)
    VALUES
    ('"
    .session_id()."', '$this->account_name',  '".time()."', '".serialize($this->data)."')"
    tja, $this->account_name ist php-null, aber mysql versucht einen leeren string einzutragen: "Duplicate entry '' for key 2"

    wie bekomme ich nun php-null als mysql-null in die datenbank?

  • #2
    du behandelst $this->account_name in mysql als string.

    so sollte es passen ....

    PHP-Code:
    $sql "INSERT INTO `user_session` 
        (`session_id`, `account_name`, `last_timestamp`, `session_data`)
    VALUES
        ('"
    .session_id()."',
         "
    .(isnull($this->account_name
                ? 
    "NULL"
                
    "'".mysql_real_escape_string($this->account_name)."'").",
         '"
    .time()."',
         '"
    .serialize($this->data)."')"
    INFO: Erst suchen, dann posten![color=red] | [/color]MANUAL(s): PHP | MySQL | HTML/JS/CSS[color=red] | [/color]NICE: GNOME Do | TESTS: Gästebuch[color=red] | [/color]IM: Jabber.org |


    Kommentar


    • #3
      danke, funktioniert (mit is_null)

      ich habe jetzt aber noch ein grundlegendes verständnisproblem.

      in php ist null nichts und 'null' bzw. "null" ein string.
      wie kann ich mir das in mysql vorstellen? gibt es dort auch diesen unterschied?
      ansonsten könnte ja account_name nicht 'NULL' (als string) sein.

      Kommentar


      • #4
        Re: mysql null vs. php null

        wie bekomme ich nun php-null als mysql-null in die datenbank?
        Indem Du zuerst 'von Hand' eine php-null in ein sql-NULL (ohne apostrophe) übersetzt.
        Beim späteren Abfragen bekommst Du aber automatisch eine php-Null zurückgeliefert,
        weil mysql_fetch_xxx das automatisch macht.

        Du könntest auch mysql_real_escape_string(php-null) versuchen?? ich denke es geht nicht.

        Kommentar


        • #5
          @3DMax
          ich habe an mysql ja auch nur NULL gegeben. nicht als string. die " sind nur die string-teile für den php string zur überhabe an mysql.

          und is_null() ist korrekt. vertue mich da immer ob _ oder nicht. in mysql ist's nämlich genau anders, wenn nicht irre. ISNULL(), IFNULL(), usw. ....
          INFO: Erst suchen, dann posten![color=red] | [/color]MANUAL(s): PHP | MySQL | HTML/JS/CSS[color=red] | [/color]NICE: GNOME Do | TESTS: Gästebuch[color=red] | [/color]IM: Jabber.org |


          Kommentar


          • #6
            Original geschrieben von 3DMax
            danke, funktioniert (mit is_null)

            ich habe jetzt aber noch ein grundlegendes verständnisproblem.

            ansonsten könnte ja account_name nicht 'NULL' (als string) sein.
            indem du echo $sql machst. Dann siehst Du, dass im $sql-String NULL vorkommt,
            nicht 'NULL' oder "NULL".

            Kommentar


            • #7
              danke euch beiden, im übersetzten sql-query erscheint tatsächlich nur NULL ohne ' oder ".

              meine erkennnis daraus: innerhalb von sql werden zeichenketten in ' eingeschlossen. kann man das so zusammenfassen?

              Kommentar


              • #8
                oder auch " das ist dir überlassen.
                INFO: Erst suchen, dann posten![color=red] | [/color]MANUAL(s): PHP | MySQL | HTML/JS/CSS[color=red] | [/color]NICE: GNOME Do | TESTS: Gästebuch[color=red] | [/color]IM: Jabber.org |


                Kommentar


                • #9
                  ich greife diesen thread einfach nochmal auf.

                  der hinweis mit mysql_real_escape_string() hat mich jetzt ein wenig nachdenklich gemacht.
                  serialize($this->data)
                  ist das array, wo später mal alle zur session gehörigen daten reinkommen. vielleicht user_agent usw.

                  dort müsste ich doch auch mysql_real_escape_string() anwenden oder?
                  oder anders gefragt, sollte grundsätzlich auf alle strings diese funktion als präventivschutz angewandt werden?

                  Kommentar


                  • #10
                    sollte grundsätzlich [...] angewandt werden?
                    JA
                    INFO: Erst suchen, dann posten![color=red] | [/color]MANUAL(s): PHP | MySQL | HTML/JS/CSS[color=red] | [/color]NICE: GNOME Do | TESTS: Gästebuch[color=red] | [/color]IM: Jabber.org |


                    Kommentar


                    • #11
                      Original geschrieben von Abraxax
                      JA
                      das war deutlich

                      jetzt mal noch eine naive frage. ich habe mir gerade eine db-klasse geschrieben, mit der methode public function query($sql).
                      macht es sinn, dort zentral mysql_real_escape_string() grundsätzlich auf das komplette $sql auszuführen?

                      [edit]
                      habe gerade selbst festgestellt und getestet, dass das blödsinn ist.
                      aber könnte man das anders innerhalb der methode realisieren? da brächte man soetwas wie einen "sql-parser".
                      Zuletzt geändert von 3DMax; 31.08.2006, 21:20.

                      Kommentar


                      • #12
                        erstelle eine methode escape() oder was auch immer. diese methode braust du dann in deinem normalen query-string ein, wenn du diesen an die class weiter reichst.

                        PHP-Code:
                        function escape($_string) {
                            return 
                        mysql_real_escape_string($_string);

                        PHP-Code:
                        $sql 'SELECT feld1 FROM tabelle WHERE feld1 = "'.$db->escape('hhhh').'"' 

                        du die escape() methode in der class hast du die möglichkeit später z.b. von mysql auf ein anderes db-system zu wechseln. z.b. postgres etc.

                        hier baust du dir dann eine PG class und verwendest in der methode escape() dann die entsprechende postgres funktion zum escapen der daten.



                        aber mal an rande ... das sind doch alles grundlagen.....
                        INFO: Erst suchen, dann posten![color=red] | [/color]MANUAL(s): PHP | MySQL | HTML/JS/CSS[color=red] | [/color]NICE: GNOME Do | TESTS: Gästebuch[color=red] | [/color]IM: Jabber.org |


                        Kommentar


                        • #13
                          Original geschrieben von 3DMax
                          [edit]
                          habe gerade selbst festgestellt und getestet, dass das blödsinn ist.
                          aber könnte man das anders innerhalb der methode realisieren? da brächte man soetwas wie einen "sql-parser".
                          Ok du hast also rausgefunden dass dann auch sache escaped werden,
                          die gar nicht escaped werden sollten.

                          Du könntest dir überlegen eine etwas andere query implementierung
                          zu wählen. Eine die platzhalter unterstützt. Dann kannst du auch
                          wieder automatische escapen.

                          Die declaration könnte folgendermaßen aussehen:

                          PHP-Code:

                          //query(string,parameter1,parameter2,...)
                          public function query(){
                               
                          //ein bisschen magie mit func_num_args/func_get_args

                          Ein query würde dann meinetwegen so aussehen:
                          PHP-Code:
                          $db->query("SELECT * FROM `tablex` WHERE `id` = ?",3); 
                          Die funktion query iteriert über die argumente nach dem
                          querystring und escaped sie. Dann werden die platzhalter im
                          querystring durch die maskierten argumente ersetzt. Und schon
                          bist du wieder auf der sicheren seite und der clientprogrammierer
                          kann nicht vergessen $db->escape() zu verwenden, weil du
                          es jetzt automatisch machst.

                          greets
                          (((call/cc call/cc) (lambda (x) x)) "Scheme just rocks! and Ruby is magic!")

                          Kommentar


                          • #14
                            werde wohl den vorschlag von Abraxax übernehmen.
                            bei adodb ist es auch so gelöst.

                            @closure
                            auch eine gute idee, macht nur das sql im quelltext etwas unleserlich.
                            hab auch schon überlegt, direkt im sql delimiter um die zu escapenden teile zu setzen und dann mit preg_replace_callback zu ersetzen, dann dürfen aber wieder die delimiter nicht im string selbst vorkommen.

                            Kommentar

                            Lädt...
                            X