Ankündigung

Einklappen
Keine Ankündigung bisher.

Variable explizit NULL setzen

Einklappen

Neue Werbung 2019

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

  • Variable explizit NULL setzen

    Hallo, hallo allerseits,

    folgendes Problem:

    Ich werte die Eingabe eines Formularfeldes aus um es danach in in einem INSERT Statement zu verwenden.
    Bei einem bestimmtem Optionsfeld kann entweder die Eingabe frei bleiben oder eine Vorgabe auswählen:
    PHP-Code:
    printf("<option value=''> keine Gruppe </option>");
      while(
    $row $result_gruppe->fetch_object()) {
        
    printf("<option value='%s'> %s </option>",
          
    htmlentities($row -> group_ID),
          
    htmlentities($row -> Name));

    Die Übergabe wird per
    PHP-Code:
    $group_id htmlspecialchars($_POST["gruppe"], ENT_QUOTES ENT_IGNORE'UTF-8'); 
    ausgelesen.

    Wenn ich nun die Eingabe überprüfen will und bei Bedarf der Variablen den Wert NULL zuweisen will
    PHP-Code:
    ($group_id == '') ? $group_id NULL ""
    , klappt dieses blöderweise gar nicht.

    Irgendwo hab ich nen ganz blöden Denkfehler...

    In meinem INSERT taucht immer nur
    PHP-Code:
    '' 
    auf.

    Ich danke euch für Tipps!
    VG, Norbert

  • #2
    Übrigens ha ich es mit
    PHP-Code:
    empty($group_id) ? $group_id NULL ""
    und
    PHP-Code:
    isset($group_id) ? $group_id NULL ""
    auch schon probiert...
    Klappt auch nicht...

    Kommentar


    • #3
      Wie sieht Dein Insert aus?

      Btw. htmlspecialchars ist für den Kontextwechsel ins HTML, an dieser Stelle ist das Unsinn.

      Kommentar


      • #4
        Das liegt daran, das in ein Ternary Statement Expressions gehören und keine Statements. Sh. auch: https://www.php.net/manual/de/langua...arison.ternary

        btw. htmlspecialchars($_POST["gruppe"], ...) ist die falsche Funktion, da sie für einen anderen Zweck ist.

        Kommentar


        • #5
          Mein Insert sieht so aus:
          PHP-Code:
          INSERT INTO
            
          `tbl_kinder` (`tbl_kinder_ID`, `tbl_gruppe_ID`)
          VALUES
            
          (NULL, {$group_id}); 
          Und ich mach die Übergabe jetzt mit:
          PHP-Code:
          $group_id $_POST['gruppe'] ?? NULL
          Selbes übrigens bei
          PHP-Code:
          $group_id = (empty($_POST['action'])) ? NULL $_POST['gruppe']; 
          Als Ergebnis erhalte ich:
          Code:
          INSERT INTO `tbl_kinder` (`tbl_kinder_ID`, `tbl_gruppe_ID`)
          VALUES (NULL, ,)

          Kommentar


          • #6
            Mach mal

            PHP-Code:
            echo null
            Was siehst du?

            Wenn du einen String verkettest und eine Variable null ist, ist dort einfach nichts. Mit prepared Satements hast du das Problem nicht. Ansonsten müsstest du beim Zusammenbilden der Query explizit überprüfen ob die Variable null ist und dann 'null' ausgeben.

            Kommentar


            • #7
              Zitat von norbert-pdm Beitrag anzeigen
              Als Ergebnis erhalte ich:
              Code:
              INSERT INTO `tbl_kinder` (`tbl_kinder_ID`, `tbl_gruppe_ID`)
              VALUES (NULL, ,)
              Dann ist $group_id nicht leer sondern enthält ein Komma.

              Kommentar


              • #8
                Zitat von tk1234 Beitrag anzeigen
                Dann ist $group_id nicht leer sondern enthält ein Komma.
                Nee... Sorry... Das Komma ist der Trenner zum nächsten Eintrag gewesen. Hab ich vergessen raus zu nehmen...
                Ist tatsächlich leer...

                Kommentar


                • #9
                  Wie gesagt, verwende ein prepared Statement, dann hast du erstens diese Sorgen nicht und bist zweitens auch noch gleich gegen SQL-Injections abgesichert.

                  Kommentar


                  • #10
                    null ergibt halt als String gecastet '', also einen leeren String. Da fehlt massiv Grundlagenwissen, das nachzuholen wäre. SQL solltest du erstmal komplett beiseite lassen, bis du PHP halbwegs stabil beherrschst und nicht zwei Baustellen gleichzeitig aufreißen.

                    Kommentar


                    • #11
                      Zitat von norbert-pdm Beitrag anzeigen
                      Nee... Sorry... Das Komma ist der Trenner zum nächsten Eintrag gewesen. Hab ich vergessen raus zu nehmen...
                      Dann hast du den falschen Code gepostet. Poste immer den Code mit dem sich das Problem nachvollziehen lässt, nicht irgendwelchen Code der nicht zum Ergebnis passt - und berücksichtige den Hinweis auf prepared Statements!

                      Kommentar


                      • #12
                        für die Fehlersuche .. und beim nächsten mal

                        PHP-Code:
                        echo '<pre>';
                        var_dump($_POST);
                        echo 
                        '</pre>'
                        .. damit du siehst, welche Felder in $_POST überhaupt übertragen wurden, und welche Werte jeweils übermittelt werden
                        "Irren ist männlich", sprach der Igel und stieg von der Drahtbürste [IMG]http://www.php.de/core/images/smilies/icon_lol.gif[/IMG]

                        Kommentar


                        • #13
                          Hallo, hallo an alle Helfenden,

                          ich hab mich ein bisschen bei den prepared Satements eingelesen und festgestellt, dass ich dazu deutlich mehr lesen müsste, um es konzeptionell richtig einzusetzen.

                          Und ich musste feststellen, dass ich in meinen Überlegungen eine recht simplen Denkfehler hatte.

                          Ich habe die Übergaben jetzt mit
                          PHP-Code:
                          $group_id = (empty($_POST['action'])) ? 'NULL' $_POST['gruppe']; 
                          realisiert.
                          Eine entsprechende Anpassung des Insert Statements - $group_id tatsächlich als Variable - funktioniert dann auch:
                          PHP-Code:
                          INSERT INTO
                            
                          `tbl_kinder` (`tbl_kinder_ID`, `tbl_gruppe_ID`)
                          VALUES
                            
                          (NULL" . $group_id . "); 
                          Übrigens: eagle275, vielen Dank für deinen Tipp mit dem var_dump($_POST)!

                          Kommentar


                          • #14
                            Zitat von norbert-pdm Beitrag anzeigen
                            Ich habe die Übergaben jetzt mit realisiert!
                            Herzlichen Glückwunsch, du hast soeben eine neue Sicherheitslücke / SQL Injection in dein Skript eingebaut.
                            Anbei ein wenig Lesestoff warum man unbedingt prepared Statements verwenden sollte um so etwas zu vermeiden.

                            https://php-de.github.io/jumpto/sql-injection/
                            https://php-de.github.io/jumpto/pdo/...red-statements

                            Kommentar


                            • #15
                              Hallo Zeichen32,

                              erst mal Danke für die Links!
                              Nur mal nebenbei... Das ganze Script wird intern eingesetzt und ist nicht von außen erreichbar. Trotzdem interessieren mich diese Hinweise natürlich!

                              Was ich noch nicht genau verstanden habe, ist die Anwendung von: mysqli_real_escape_string

                              Ich stelle den Kontakt zur DB so her:
                              PHP-Code:
                                  $mysqli_new = new mysqli($mysqlhost$mysqluser$mysqlpasswd$mysqldb);
                                  
                              $mysqli_new->set_charset("utf8"); 
                              Danach 'baute' ich die Abfrage ja so zusammen:
                              PHP-Code:
                              INSERT INTO
                                
                              `tbl_kinder` (`tbl_kinder_ID`, `tbl_gruppe_ID`)
                              VALUES
                                
                              (NULL" . $group_id . "); 
                              Und will sie dann mittels
                              PHP-Code:
                              if($mysqli_new -> query($sql_new_child)) {
                                
                              $meldung "Ok";
                              } else {
                                
                              $meldung "Es ist ein Fehler aufgetretten";

                              ausführen.

                              Nun habe ich ja auch gelesen, dass man
                              PHP-Code:
                              mysqli_real_escape_string($link$_POST['name']) 
                              verwenden soll.

                              Müsste dann mein INSERT so aussehen:
                              PHP-Code:
                              INSERT INTO
                                
                              `tbl_kinder` (`tbl_kinder_ID`, `tbl_gruppe_ID`)
                              VALUES
                                
                              (NULL" . mysqli_new -> real_escape_string($group_id) . "); 
                              ??

                              Kommentar

                              Lädt...
                              X