Achot: Werte speichern

Hallo,

ich habe irgendwie ein Brett vor dem Kopf und komme nicht mehr weiter. Ich speichere meine Werte folgendermaßen in der Datenbank

if(isset($_POST['abschicken'])){

 if ($stmt = $mysqli->prepare("INSERT INTO test_eintrag (laenge_zugabe, breite_zugabe, tiefe_zugabe)
                                 VALUES (?, ?, ?)")) {    
			 
		$laenge_zugabe		= $_POST["laenge_zugabe"];
		$breite_zugabe		= $_POST["breite_zugabe"];
		$tiefe_zugabe		= $_POST["tiefe_zugabe"];
				
		$stmt->bind_param("sss", $laenge_zugabe, $breite_zugabe, $tiefe_zugabe);

		$stmt->execute();
			header("Location: $extra");
		}
		else {
			echo $mysqli -> error;
	}
}
<label for="laenge_zugabe">Länge</label>
<input type="text" name="laenge_zugabe" id="laenge_zugabe">

<label for="breite_zugabe">Breite</label>
<input type="text" name="breite_zugabe" id="breite_zugabe">

<label for="tiefe_zugabe">Tiefe</label>
<input type="text" name="tiefe_zugabe" id="tiefe_zugabe">

Soweit so gut. Jetzt kommt ein weitere Blog hinzu, der in eine zweite Tabelle gespeichert werden soll

<?php for ($i = 1; $i <= $anzahl; $i++) { ?>
<label for="kosten_<?php echo $i;?>">Kosten</label>
<input type="text" name="kosten_<?php echo $i;?>" id="kosten_<?php echo $i;?>">
<?php } ?>

Die Frage ist, wie mache ich das?

  1. Ich glaube, ich war auf dem falschen Weg? Ich musste so vorgehen?

    <?php for ($i = 1; $i <= $anzahl; $i++) { ?>
    <label for="kosten[<?php echo $i;?>]">Kosten</label>
    <input type="text" name="kosten[<?php echo $i;?>]" id="kosten_<?php echo $i;?>">
    <?php } ?>
    

    Und beim Insert muss ich anschließend mit einer

    foreach
    

    arbeiten?

    1. Tach!

      <?php for ($i = 1; $i <= $anzahl; $i++) { ?>
      <label for="kosten[<?php echo $i;?>]">Kosten</label>
      <input type="text" name="kosten[<?php echo $i;?>]" id="kosten_<?php echo $i;?>">
      <?php } ?>
      

      Es ist eher üblich, beim Zählen mit 0 statt 1 anzufangen, und bis "kleiner" statt "kleiner oder gleich" zu zählen. Also for ($i = 0; $i < $anzahl; $i++). Aber das nur nebenbei, das kannst du auch so lassen.

      Und beim Insert muss ich anschließend mit einer

      foreach
      

      arbeiten?

      Ja, wenn du sowieso das gesamte Array durchlaufen möchtest, ist das mit foreach einfacher als erst mit count() die Anzahl zu ermitteln und eine weitere Variable zum Hochzählen zu benötigen.

      foreach ($array as $key => $value)
      

      oder wenn der Key nicht interessiert:

      foreach ($array as $value)
      

      Aber diese Syntax kann man ja auch im Handbuch nachlesen. Hast du vielleicht ein anderes Problem, das ich nicht aus deinen Postings nicht entnehmen konnte?

      dedlfix.

      1. Hallo,

        danke für deine Antwort.

        Aber diese Syntax kann man ja auch im Handbuch nachlesen.

        Kennst du vielleicht selber, du sitzt vor einem Script hast eigentlich die Idee im Kopf weißt aber überhaupt nicht mehr weiter? So ging es mir gerade 😕

        Hast du vielleicht ein anderes Problem, das ich nicht aus deinen Postings nicht entnehmen konnte?

        Ich weiß noch nicht, ob mein Problem mit der

        foreach ($array as $key => $value)
        

        behoben ist. Ich möchte die Felder später auch wieder füllen können, wenn ein Datensatz bearbeitet wird. Da muss ich mal schauen wie ich dieses machen kann. Ich denke mit

        in_array
        

        ?

        1. Tach!

          Ich möchte die Felder später auch wieder füllen können, wenn ein Datensatz bearbeitet wird. Da muss ich mal schauen wie ich dieses machen kann. Ich denke mit

          in_array
          

          ?

          Wohl eher nicht. Die Kunst beim Programmieren ist, die große Aufgabe in kleine Teile zu zerlegen.

          Es ist erstmal nicht weiter wichtig, wo die Daten herkommen, die man im Browser zwecks Bearbeitung präsentieren möchte. Es ist im ersten Schritt ausreichend, eine Webseite aus statischem HTML zu bauen. Die wird ein Formular enthalten, für das auch erstmal egal ist, wohin es später abgesendet wird. Auch andere Details kann man später hinzufügen. Essentiell ist aber, dass es Eingabefelder enthält. Und dabei ist der nächste Schritt, wie man die mit bestimmten Werten vorbelegt. Auch das kann man erstmal statisch erledigen, um dabei zu sehen, dass am Ende ein value-Attribut mit ausgefülltem Wert benötigt wird. Das wäre dann also das Ziel, dass man mit PHP ein Formular erstellt, das an genau den gewünschten Stellen die Werte einfügt. Auch hier kann man erstmal konstante Werte von PHP ausgeben lassen, für die man dann im nächsten Schritt eine Abfrage aus der Datenbank hinzufügt.

          Wenn ich das richtig sehe, hast du eine paar gleichartige Daten, in vermutlich beliebiger Anzahl, und deswegen hast du da auf ein Array gesetzt. Wenn ja, dann ist foreach eine Möglichkeit, durch dieses zu laufen und für jeden Eintrag ein Eingabefeld ins HTML auszugeben. Auch sowas kann man erstmal mit einem per Hand erstellten Test-Array testweise erstellen.

          Wie erkennt man nun beim Zurücksenden des Formulars, welches Eingabefeld zu welchem Datensatz gehört? Ich gehe mal davon aus, die Daten verteilen sich auf mehrere Datensätze einer Tabelle. Man kann dazu die Schreibweise <input name="feld[nummer]"> verwenden. Die Nummer muss nicht fortlaufend sein, sie kann auch der Wert aus dem Primärschlüssel des Datensatzes sein. Darüber kann man dann den zugehörigen Datensatz wiederfinden. In dem Fall wäre dafür foreach in der Variante mit Key und Value die beste Möglichkeit über das $_POST['feld'] zu iterieren. Also

          foreach($_POST['feld'] as $id => $value) {
            // UPDATE table SET feld=$value WHERE id=$id
          }
          

          Zumindest so nach diesem Prinzip, aber dann "richtig" mit Prepared Statement und Übergabe der Daten über Binding. Das Statement muss dazu nur einmal präpariert werden. In der Schleife braucht nur das Bindung und ein Execute zu stehen.

          Ich hoffe, ich habe einigermaßen richtig erraten, was du vorhast.

          dedlfix.

          1. Hallo,

            vielen Dank für deine sehr ausführliche Erklärung. Um das bearbeiten kümmere ich mich morgen. Ich hätte da noch eine Frage, ob dieses überhaupt möglich ist. Ich habe zwei foreach-Schleifen

            foreach($_POST["adresse"] as $key => $value){
            				
            	$stmt = $mysqli->prepare("INSERT INTO  adresse (projektID, Nummer, wert)  
                                                VALUES (?, ?, ?)");
            						
            	$projektID 	= $projektID;
            	$Nummer 	= $key;
            	$wert		= $value;
            						
            	$stmt->bind_param("sss", $projektID, $Nummer, $wert);
            	$stmt->execute();
            }			
            	
            foreach($_POST["userDetails"] as $key => $value){
            				
            	$stmt = $mysqli->prepare("INSERT INTO  userDetails (projektID, locationID, Nummer, wert)  
                                                 VALUES (?, ?, ?, ?)");
            						
            	$projektID 	= $projektID;
            	$locationID     = "xxx";
            	$Nummer 	= $key;
            	$wert		= $value;
            						
            	$stmt->bind_param("ssss", $projektID, $locationID, $Nummer, $wert);			
            	$stmt->execute();
            }
            
            

            Ich benötige den ersten Wert aus der $_POST["adresse"] $value in der zweiten foreach-Schleife. Um das Feld locationID füllen zu können. Wie muss ich da vorgehen? Beide foreach irgendwie inner einander verschachteln?

            1. Tach!

              Ich benötige den ersten Wert aus der $_POST["adresse"] $value in der zweiten foreach-Schleife. Um das Feld locationID füllen zu können. Wie muss ich da vorgehen? Beide foreach irgendwie inner einander verschachteln?

              Nur, wenn du möchtest, dass die innere Schleife bei jedem Durchlauf der äußeren erneut durchlaufen wird. Wenn du lediglich einmalig den ersten Wert von $_POST['adresse'] haben möchtest, dann nimm reset(). Das gibt dir den ersten Eintrag im Array zurück, egal wie die Keys aussehen.

              dedlfix.

              1. Danke, aber wie wende ich http://php.net/manual/de/function.reset.php auf mein Beispiel an? Aus dem Beispiel werde ich nicht schlau.

                Wenn ich es so mache, habe ich doppelte Einträge

                foreach($_POST["adresse"] as $key => $value){
                				
                	$stmt = $mysqli->prepare("INSERT INTO  adresse (projektID, Nummer, wert)  
                                                    VALUES (?, ?, ?)");
                						
                	$projektID 	= $projektID;
                	$Nummer 	= $key;
                	$wert		= $value;
                						
                	$stmt->bind_param("sss", $projektID, $Nummer, $wert);
                	$stmt->execute();
                			
                	
                foreach($_POST["userDetails"] as $key => $value){
                				
                	$stmt = $mysqli->prepare("INSERT INTO  userDetails (projektID, locationID, Nummer, wert)  
                                                     VALUES (?, ?, ?, ?)");
                						
                	$projektID 	= $projektID;
                	$locationID     = "xxx";
                	$Nummer 	= $key;
                	$wert		= $value;
                						
                	$stmt->bind_param("ssss", $projektID, $locationID, $Nummer, $wert);			
                	$stmt->execute();
                }}
                

                Alternativ-Text

                1. Danke, aber wie wende ich http://php.net/manual/de/function.reset.php auf mein Beispiel an? Aus dem Beispiel werde ich nicht schlau.

                  Wenn ich es so mache, habe ich doppelte Einträge

                  foreach($_POST["adresse"] as $key => $value){
                  				
                  	$stmt = $mysqli->prepare("INSERT INTO  adresse (projektID, Nummer, wert)  
                                                      VALUES (?, ?, ?)");
                  						
                  	$projektID 	= $projektID;
                  	$Nummer 	= $key;
                  	$wert		= $value;
                  						
                  	$stmt->bind_param("sss", $projektID, $Nummer, $wert);
                  	$stmt->execute();
                  			
                  	
                  foreach($_POST["userDetails"] as $key => $value){
                  				
                  	$stmt = $mysqli->prepare("INSERT INTO  userDetails (projektID, locationID, Nummer, wert)  
                                                       VALUES (?, ?, ?, ?)");
                  						
                  	$projektID 	= $projektID;
                  	$locationID     = "xxx";
                  	$Nummer 	= $key;
                  	$wert		= $value;
                  						
                  	$stmt->bind_param("ssss", $projektID, $locationID, $Nummer, $wert);			
                  	$stmt->execute();
                  }}
                  

                  Alternativ-Text

                  Vielleicht gibt es auch eine andere Möglichkeit das zu speichern?

                  <?php for ($i = 1; $i <= $anzahl; $i++) { ?>
                  <label for="kosten[<?php echo $i;?>]">Kosten</label>
                  <input type="text" name="kosten[<?php echo $i;?>]" id="kosten_<?php echo $i;?>">
                  <br>
                  <label for="auufteilung[<?php echo $i;?>]">Aufteilung</label>
                  <input type="text" name="auufteilung[<?php echo $i;?>]" id="auufteilung<?php echo $i;?>">
                  <br>
                  <?php } ?>
                  
                  foreach($_POST["adresse"] as $key => $value){
                  				
                  	$stmt = $mysqli->prepare("INSERT INTO  adresse (projektID, Nummer, wert)  VALUES (?, ?, ?)");
                  						
                  	$projektID 	= $projektID;
                  	$Nummer 	= $key;
                  	$wert		= $value;
                  						
                  	$stmt->bind_param("sss", $projektID, $Nummer, $wert);
                  	$stmt->execute();
                  }	
                  

                  Dann würde ich einfach meine Tabelle erweitern?

                2. Tach!

                  Danke, aber wie wende ich http://php.net/manual/de/function.reset.php auf mein Beispiel an? Aus dem Beispiel werde ich nicht schlau.

                  Also, reset() gibt den ersten Eintrag zurück. Den lass dir ausgeben. Ist es das, was du willst?

                  $x = reset($_POST['adresse']);
                  var_dump($x);
                  

                  Oder ist der gesuchte Wert ein Feld in diesem Array? Dann wohl eher $x['feldname'].

                  dedlfix.

                  1. Hallo,

                    das ist leider NICHT das was ich benötige, führe ich deinen Code so aus

                    foreach($_POST["adresse"] as $key => $value){
                    				
                    	$stmt = $mysqli->prepare("INSERT INTO  adresse (projektID, Nummer, wert)  
                                                        VALUES (?, ?, ?)");
                    						
                    	$projektID 	= $projektID;
                    	$Nummer 	= $key;
                    	$wert		= $value;
                    						
                    	$stmt->bind_param("sss", $projektID, $Nummer, $wert);
                    	$stmt->execute();
                    }
                    
                    $x = reset($_POST['adresse']);			
                    	
                    foreach($_POST["userDetails"] as $key => $value){
                    				
                    	$stmt = $mysqli->prepare("INSERT INTO  userDetails (projektID, locationID, Nummer, wert)  
                                                         VALUES (?, ?, ?, ?)");
                    						
                    	$projektID 	= $projektID;
                    	$locationID     = $x;
                    	$Nummer 	= $key;
                    	$wert		= $value;
                    						
                    	$stmt->bind_param("ssss", $projektID, $locationID, $Nummer, $wert);			
                    	$stmt->execute();
                    }
                    

                    In $x steht 14d8b4004a0531fa9dc41d48f86c4156. Diesen Wert habe ich dann in meiner zweiten foreach($_POST["userDetails"] den Wert in beiden Einträge was aber falsch ist. Ich habe doch in meiner ersten foreach($_POST["adresse"] jeweils EIN Wert pro Durchlauf.

                    1. Tach!

                      In $x steht 14d8b4004a0531fa9dc41d48f86c4156. Diesen Wert habe ich dann in meiner zweiten foreach($_POST["userDetails"] den Wert in beiden Einträge was aber falsch ist. Ich habe doch in meiner ersten foreach($_POST["adresse"] jeweils EIN Wert pro Durchlauf.

                      Möchtest du im Falle der userDetails das adresse-Array sozusagen synchron durchlaufen? Mir ist nicht bekannt, dass es dafür einen Mechanismus in PHP gäbe. Aber der Ansatz mit dem reset() kann noch weitergehen. Mit next() läuft man zum nächsten Eintrag weiter.

                      dedlfix.

                      1. Ich bin mittlerweile soweit

                        <?php for ($i = 1; $i <= $anzahl; $i++) { ?>
                        <label for="kosten[<?php echo $i;?>]">Kosten</label>
                        <input type="text" name="kosten[<?php echo $i;?>][id]" id="kosten_<?php echo $i;?>">
                        <br>
                        <input type="text" name="kosten[<?php echo $i;?>][titel]" id="auufteilung<?php echo $i;?>">
                        <br>
                        <?php } ?>
                        

                        Wenn ich dieses abschicke erhalte ich folgenden Wert:

                        Array
                        (
                            [1] => Array
                                (
                                    [id] => Test 1
                                    [titel] => 50
                                )
                        
                            [2] => Array
                                (
                                    [id] => Test 2
                                    [titel] => 50
                                )
                        
                            [3] => Array
                                (
                                    [id] => 
                                    [titel] => 
                                )
                        
                        )
                        

                        Gibt es irgendwie nun die Möglichkeit dieses Array zu speichern? Also in etwa so?

                        foreach ($_POST["kosten"] as $key => $value)
                        {
                         	
                            $stmt = $mysqli->prepare("INSERT INTO  hallo (Nummer, wert)  VALUES (?, ?)");
                        						
                        	$Nummer 	= $id[$key];
                        	$wert		= $titel[$key];
                        						
                        	$stmt->bind_param("ss", $Nummer, $wert);			
                        	$stmt->execute();
                        
                        }
                        

                        So funktioniert es derzeit leider noch nicht. Dann würde ich einfach aus zwei Tabellen eine Tabelle machen, wäre mir eh lieber.

                      2. Hallo,

                        ich habe es hinbekommen. Ob es der beste Code ist, kann ich nicht sagen:

                        $test  = array(); 
                        $test1  = array(); 
                        
                        foreach ($_POST["kosten"] as $key => $wert)
                        {
                        
                        	$test[$key] = $wert['id'];
                        	$test1[$key] = $wert['titel'];
                         	
                            $stmt = $mysqli->prepare("INSERT INTO  Hallo (Nummer, wert)  VALUES (?, ?)");
                        						
                        	$Nummer 	= $test[$key];
                        	$wert		= $test1[$key];
                        						
                        	$stmt->bind_param("ss", $Nummer, $wert);			
                        	$stmt->execute();
                        }
                        ?>
                        
                        <form method="post">
                        <?php for ($i = 1; $i <= $anzahl; $i++) { ?>
                          <label for="kosten[<?php echo $i;?>]">Kosten</label>
                          <input type="text" name="kosten[<?php echo $i;?>][id]" id="kosten_<?php echo $i;?>">
                          <br>
                          <input type="text" name="kosten[<?php echo $i;?>][titel]" id="auufteilung<?php echo $i;?>">
                          <br>
                        <?php } ?>
                        
                          <input type="submit" name="abschicken" value="H" id="btn_insert">
                        
                          </form>
                        

                        Hab dieses hier gefunden: https://www.youtube.com/watch?v=LBikvc6jfGk