Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] PHP Mysql NULL

Einklappen

Neue Werbung 2019

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

  • [Erledigt] PHP Mysql NULL

    Hi,

    leider Verzweifel ich an einem INSERT. Hatte eigentlich noch nie Probleme damit aber jetzt habe ich ein Brett vor dem Kopf.

    Ich habe in einer MySql Tabelle INNODB eine Spalte Telefonnummer auf NULL gesetzt, jetzt füge ich mit PHP ein INSERT ein. Und egal was ich mache es läuft falsch.

    Kurzer Auszug, gilt für alle Variablen.
    PHP-Code:
    $vorwahltel1 mysqli_real_escape_string($verbindung$daten['vorwahltel1']);
                    
    if(
    $vorwahltel1 == ""){
                        
      
    $vorwahltel1     'NULL';
      
    $telefon1        'NULL';
                        

    PHP-Code:
    $insert "INSERT INTO ".TABELLE." (Anrede, Vorname, Nachname, PLZ, Ort, Strasse, Hausnummer, Vorwahltel1, Telefon1, Vorwahltel2, Telefon2, Vorwahlfax, Fax, Email, Aktiv, Erstelltvon) 
    VALUES ('
    $anrede', '$vorname', '$nachname', '$plz', '$ort', '$strasse', '$hausnummer', '$vorwahltel1', '$telefon1', '$vorwahltel2', '$telefon2',
    '
    $vorwahlfax', '$fax', '$email', '$aktiv', '$benutzer')"
    Wenn ich nur NULL übergebe bleibt die Spalte leer, wenn ich 'NULL' eingebe wird der Wert als String reingeschrieben.


  • #2
    PHP-Code:
      $vorwahltel1     'NULL'
      
    $telefon1        'NULL'

    // ...

    ... '$vorwahltel1''$telefon1', ... 
    NULL ist kein String und muss im Feld auch erlaubt sein.

    Abgesehen davon solltest du die Funktion real_escape_... erst direkt für/auf die query verwenden und nicht schon bevor du etwas (hier mif if( == "") darauf abfragst, denn die Funktion ändert Werte und ist eigentlich nur für den PHP->mysql-Kontext gedacht und nicht für den PHP-only-Kontext.

    PHP-Code:
    $vorwahltel1 mysqli_real_escape_string($verbindung$daten['vorwahltel1']); 
                     
    if(
    $vorwahltel1 == ""){ 
    Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
    PHP.de Wissenssammlung | Kein Support per PN

    Kommentar


    • #3
      Abgesehen davon solltest du die Funktion real_escape_... erst direkt für/auf die query verwenden und nicht schon bevor du etwas (hier mif if( == "") darauf abfragst, denn die Funktion ändert Werte und ist eigentlich nur für den PHP->mysql-Kontext gedacht und nicht für den PHP-only-Kontext.
      Danke erstmal, das hatte ich ja auch vorher so.

      Funktionsaufruf:
      PHP-Code:
      insert_one($anrede$vorname$nachname$plz$ort$strasse$hausnummer$vorwahltel1$telefon1$vorwahltel2$telefon2NULL
      $fax"NULL"$aktiv$benutzer); 
      Ausschnitt Funktion insert_one
      PHP-Code:
      $insert "INSERT INTO ".TABELLE." (Anrede, Vorname, Nachname, PLZ, Ort, Strasse, Hausnummer, Vorwahltel1, Telefon1, Vorwahltel2, Telefon2, Vorwahlfax, Fax, Email, Aktiv, Erstelltvon) 
      VALUES ('" 
      .mysqli_real_escape_string($verbindung$anrede). "',
                  '" 
      .mysqli_real_escape_string($verbindung$vorname). "', 
              '" 
      .mysqli_real_escape_string($verbindung$nachname). "',
              '" 
      .mysqli_real_escape_string($verbindung$plz). "', 
              '" 
      .mysqli_real_escape_string($verbindung$ort). "', 
              '" 
      .mysqli_real_escape_string($verbindung$strasse). "',
              '" 
      .mysqli_real_escape_string($verbindung$hausnummer). "',
              '" 
      .mysqli_real_escape_string($verbindung$vorwahltel1). "',
              '" 
      .mysqli_real_escape_string($verbindung$telefon1). "', 
              '" 
      .mysqli_real_escape_string($verbindung$vorwahltel2). "',
              '" 
      .mysqli_real_escape_string($verbindung$telefon2). "', 
              '" 
      .mysqli_real_escape_string($verbindung$vorwahlfax). "',
              '" 
      .mysqli_real_escape_string($verbindung$fax). "', 
              '" 
      .mysqli_real_escape_string($verbindung$email). "',  
              '" 
      .mysqli_real_escape_string($verbindung$aktiv). "',
              '" 
      .mysqli_real_escape_string($verbindung$benutzer). "')"
      Doch dann habe ich soviel rumprobiert, weil es nicht funktioniert.

      Kommentar


      • #4
        So wie es aussieht kann eine insert_one() keine NULL korrekt übergeben, die macht lauter Strings draus ' ... '
        Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
        PHP.de Wissenssammlung | Kein Support per PN

        Kommentar


        • #5
          So wie es aussieht kann eine insert_one() keine NULL korrekt übergeben, die macht lauter Strings draus ' ... '
          Na das kann ja nicht sein.. Das liegt an mysqli_real_escape_string
          Wenn ich es so ausführe geht es auch nicht.
          PHP-Code:
          $email NULL;
          $vorwahlfax "NULL";

          $insert "INSERT INTO ".TABELLE." ( Vorwahlfax, Email) VALUES ( 
                  '" 
          .mysqli_real_escape_string($verbindung$vorwahlfax). "', 
                  '" 
          .mysqli_real_escape_string($verbindung$email). "'
                        )"

          Kommentar


          • #6
            Nein, ein PHP NULL ist kein Mysql NULL, du machst da ja wieder in SQL einen String draus, weil du packst es in Hochkomma.

            PHP-Code:
            '" .mysqli_real_escape_string($verbindung, $email). "' 
            Lass dir die von PHP fertig geparste Query ausgeben dann kannst du es sehen, es muss NULL und nicht 'NULL' darin stehen.

            http://www.peterkropff.de/site/mysql/null.htm

            LG
            Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
            PHP.de Wissenssammlung | Kein Support per PN

            Kommentar


            • #7
              Ich komme einfach nicht drauf....

              Ich weiß das das so aussehen muss:
              PHP-Code:
              $insert "INSERT INTO ".TABELLE." (Vorwahltel1) VALUES (NULL)"
              aber wie schreibe ich die Values mit mysqli_real_escape Variablen wo halt entweder NULL oder Wert drin steht.

              Kommentar


              • #8
                Naja du definiert, wie du erkennst wann du NULL in die DB schreiben willst (zB wenn die PHP Variable selbst NULL ist oder ein Leerstring und an Hand dessen gibts du eben den String NULL in den Querystring aus oder eben unter Hochkomma den String 'Wert'. Kann man dann auch gleich escapen zb.. So irgendwie.. geht sicher eleganter, vor allem bei mehr Feldern zB mit Arrays und sprintf()... grad keine Lust dazu.

                PHP-Code:
                function valToSql($db$val) {
                    if (
                is_null($val) or $val === "") { // oder nur is_null() wie du willst/brauchst
                        
                return "NULL";
                    }
                    return 
                "'".mysqli_real_escape_string($db$val)."'";
                }


                $val null;
                $insert "INSERT INTO tab (Vorwahltel1) VALUES (".valToSql($db$val).")"
                echo 
                $insert;
                // INSERT INTO tab (Vorwahltel1) VALUES (NULL)

                $val "";
                $insert "INSERT INTO tab (Vorwahltel1) VALUES (".valToSql($db$val).")"
                echo 
                $insert;
                // INSERT INTO tab (Vorwahltel1) VALUES (NULL)

                $val "foo";
                $insert "INSERT INTO tab (Vorwahltel1) VALUES (".valToSql($db$val).")"
                echo 
                $insert;
                // INSERT INTO tab (Vorwahltel1) VALUES ('foo') 
                Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
                PHP.de Wissenssammlung | Kein Support per PN

                Kommentar


                • #9
                  Zitat von hausl Beitrag anzeigen
                  PHP-Code:
                  function valToSql($db$val) {
                      if (
                  is_null($val) or $val === "") {
                          return 
                  "NULL";
                      }
                      return 
                  "'".mysqli_real_escape_string($db$val)."'";

                  Bitte? Ein Leerstring ist nicht NULL, das gehört nicht in eine allgemeine Funktion. Die Konvertierung von "" auf NULL sollte aufjedenfall bewusst erfolgend. Entweder wird die Funktion entsprechend benannt oder "" -> NULL wird außerhalb ausgeführt.
                  Ganz besonders weil Mysql 5.7 Standardmässig mit strict_mode kommt. Das gibt ein harten Fehler wenn du NULL in eine nicht nullable Spalte schreiben willst.

                  Kommentar


                  • #10
                    Bitte? Ein Leerstring ist nicht NULL
                    Ja, ist mir klar, hat auch keiner behauptet. Daher schrieb ich ja auch:

                    Zitat von hausl Beitrag anzeigen
                    NULL ist kein String und muss im Feld auch erlaubt sein.
                    Ich bezog mich darauf:

                    Zitat von Daniel2B Beitrag anzeigen

                    Kurzer Auszug, gilt für alle Variablen.
                    PHP-Code:
                                    
                    if($vorwahltel1 == ""){
                                        
                      
                    $vorwahltel1     'NULL';
                      
                    $telefon1        'NULL';
                                        

                    Der TE wollte genau so eine Funktion für diese Zwecke die ihm leere PHP-Strings als "SQL-NULL" setzt. Vor allem da man von einem HTML-From nur leere Strings und niemals echte NULL bekommt.

                    Im Grunde ging es nur um den richitgen Query-String, der bei leeren String-Werten NULL setzen sollte bzw. mit escaping bei vorhandenen Werten.

                    Im Grunde gehts um den Teil, wie du von einem leeren PHP-String zu einem NULL in der Query kommst... Nachdem du vermutlich POST verarbeitest kannst du es auch in einer Schleife verarbeiten, etc...

                    PHP-Code:
                        if ($val === "") {
                            
                    $query .= "NULL";
                        } else {
                            
                    $query .= mysqli_real_escape_string($db$val)."'";
                        } 
                    EDIT: Beispiel ergänzt
                    Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
                    PHP.de Wissenssammlung | Kein Support per PN

                    Kommentar


                    • #11
                      Mit mysqli_real_escape_string zu arbeiten ist doch anstrengend. Warum nicht mit Prepared Statements arbeiten?

                      Beispiel:
                      PHP-Code:
                      $mysqli = new mysqli('localhost'$user$password'test');

                      $sql "UPDATE userlogin SET datum2 = ? WHERE id = 5 AND name = 'hansi'";
                      $stmt $mysqli->prepare($sql);
                      $null null;
                      $stmt->bind_param("s"$null);
                      $stmt->execute(); 
                      Sorry für das stümperhafte Beispiel, mache sonst nur PDO.
                      Wollte mal wissen ob es geht.
                      PHP-Klassen auf github

                      Kommentar


                      • #12
                        Ja stimmt, ist so sicher besser und bequemer als ewig lange queries zusammenzubauen. Hab kurz nachgelesen, null (nicht "null") wird scheinbar immer korrekt in der DB gesetzt, egal welcher Typ in bind_param gesetzt wird.
                        Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
                        PHP.de Wissenssammlung | Kein Support per PN

                        Kommentar


                        • #13
                          Frage am Rande:
                          Sehe ich das richtig, MSQLi kennt keine benannten Platzhalter und ich muß immer die ? in der Query abzählen um die Werte zuzuordnen ?
                          Ebenso kann ich keine Werte By Value zuordnen ? So was
                          PHP-Code:
                          bind_param("s"NULL); 
                          funktioniert nicht.
                          PHP-Klassen auf github

                          Kommentar


                          • #14
                            Ja, das funktioniert scheinbar wirklich nur so, habe dazu auch noch nichts anderes gefunden (kann gerade leider nichts probieren).

                            http://php.net/manual/de/mysqli-stmt...aram.php#96148

                            http://stackoverflow.com/a/6892491

                            Irgendwie ein weiterer Grund für PDO.
                            Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
                            PHP.de Wissenssammlung | Kein Support per PN

                            Kommentar


                            • #15
                              Zitat von jspit Beitrag anzeigen
                              Frage am Rande:
                              Sehe ich das richtig, MSQLi kennt keine benannten Platzhalter und ich muß immer die ? in der Query abzählen um die Werte zuzuordnen ?
                              Ebenso kann ich keine Werte By Value zuordnen ? So was
                              PHP-Code:
                              bind_param("s"NULL); 
                              funktioniert nicht.
                              Exakt, mysqli gibt die C API ziemlich 1:1 in PHP wieder. Da stoßen dann zwei unterschiedliche Welten aufeinander. Wenn du syntaktischen Zucker haben willst musst dus selbst drum rum bauen.

                              Kommentar

                              Lädt...
                              X