Bernd: Wert wird nicht eingetragen

Guten Morgen,

ich verstehe mal wieder etwas nicht. Und zwar wird ein Wert nicht in die Datenbank eingetragen.

<form method="post"> 
  <ul>
   <label>
   <input 
     type="checkbox" 
     name="bereich[]"
     value="0"
     <?php if (in_array("0", $teile25)): ?>checked<?php endif ?>>
     P1            
   </label>

   <label>
    <input 
     type="checkbox" 
     name="bereich[]"
     value="1"
     <?php if (in_array("1", $teile25)): ?>checked<?php endif ?>>
     P2           
   </label>
                       
 </ul>
 <button type="submit" name="action">Filter anwenden </button> 
</form>
if(isset($_POST['action'])){ 

    $stmt_userBereiche = $mysqli->prepare("DELETE FROM settings WHERE kps_userid=?");
    $stmt_userBereiche->bind_param("s",$object->user_code);
    $stmt_userBereiche->execute();

    if(is_array($_POST["bereich"]) && $_POST["bereich"][0]){
        
            foreach($_POST["bereich"] as $v){
                
            $stmt = $mysqli->prepare("
                    INSERT INTO settings (kps_userid, kps_kalenderid)  VALUES (?, ?)");
                    
                    $kps_userid       = $object->user_code;
                    $kps_kalenderid   = $v;
                    
                    $stmt->bind_param("ss", $kps_userid, $kps_kalenderid);          
                    $stmt->execute();

                    header("Location: $extra");
            }
    }
}

Der Wert mit 1 wird eingetragen, wenn ich nur den ersten wähle also 0 wird nicht eingetragen, wähle ich beide aus, wird ebenfalls nicht eingetragen. Da es mit dem zweiten Wert also der 1 funktioniert gehe ich stark davon aus, es liegt an der 0. Diese benötige ich aber in der Datenbank.

Wenn ich

var_dump($_POST["bereich"]); 

ausgeben lasse, erhalte ich

array(2) { [0]=> string(1) "0" [1]=> string(1) "1" }

also beide Werte sind vorhanden? Was kann ich machen bzw. wo liegt überhaupt das Problem?

  1. Ok, wenn ich diese Zeile

    if(is_array($_POST["bereich"]) && $_POST["bereich"][0])
    

    in

    if(is_array($_POST["bereich"]))
    

    ändere, dann bekomme ich auch den ersten Wert in die Datenbank geschrieben. Aber verstehe tu ich es ehrlich gesagt nicht.

    1. Tach!

      Ok, wenn ich diese Zeile

      if(is_array($_POST["bereich"]) && $_POST["bereich"][0])
      

      in

      if(is_array($_POST["bereich"]))
      

      ändere, dann bekomme ich auch den ersten Wert in die Datenbank geschrieben. Aber verstehe tu ich es ehrlich gesagt nicht.

      Gar nicht? Auch nicht soweit, dass der erste Teil-Ausdruck zwar true ergeben muss, wegen des && dann wohl der zweite Ausdruck false liefern muss, als einzige Möglichkeit, dass die Bedingung nicht erfüllt werden kann?

      dedlfix.

    2. Hallo Bernd,

      du solltest dir den Unterschied klar machen zwischen „Prüfen auf Wert“ und „Prüfen auf Vorhandensein“.

      Gruß
      Jürgen

  2. Tach!

    ich verstehe mal wieder etwas nicht. Und zwar wird ein Wert nicht in die Datenbank eingetragen.

    Das ist zwar dein eigentliches Ziel, aber ist das Datenbank-Handling auch Teil des Problems?

    Der Wert mit 1 wird eingetragen, wenn ich nur den ersten wähle also 0 wird nicht eingetragen, wähle ich beide aus, wird ebenfalls nicht eingetragen. Da es mit dem zweiten Wert also der 1 funktioniert gehe ich stark davon aus, es liegt an der 0. Diese benötige ich aber in der Datenbank.

    Also wo konkret geht die 0 verloren - das ist hier die eigenliche Frage. Ob das DBMS-Handling schuld ist, kann man testen, indem man eine einfache Query erstellt ohne weiteren Schnickschnack drumherum.

    Ich greife mal vor und löse den Teil auf, dass das Ergebnis sein wird, dass das problemlos geht. Also muss es an anderer Stelle hapern.

    Wenn ich

    var_dump($_POST["bereich"]); 
    

    ausgeben lasse, erhalte ich

    array(2) { [0]=> string(1) "0" [1]=> string(1) "1" }

    also beide Werte sind vorhanden?

    Sehr schön bis hierher. Kontrollausgaben sind immer gut.

    Was kann ich machen bzw. wo liegt überhaupt das Problem?

    Nun hast du da aber auch noch zwei if im Text. Verzweigt denn dein Code wie erwartet? Setz mal ein echo 'bin verzweigt und nicht verzweifelt'; oder ähnliches in den Anweisungsblock des if.

    Nachdem du nun gesehen hast, dass das Problem am zweiten if liegt, kann das Debugging dort weitergehen. Was liefert?

    var_dump(is_array($_POST["bereich"]) && $_POST["bereich"][0]);
    
    var_dump(is_array($_POST["bereich"]));
    var_dump($_POST["bereich"][0]);
    var_dump(boolval($_POST["bereich"][0])); // beachte das boolval()
    

    Aha ... aber das wirst du ja selbst sehen.

    Warum das Ergebnis so ist, steht im Handbuch unter Booleans - Converting to boolean. Ebenfalls nützlich sind die PHP type comparison tables.

    dedlfix.