Bernd: Kein Insert

Hallo,

sehr ihr hier ein Fehler?

if(isset($_POST['abschicken']) && empty($errors)) {


	$test2  = array();
	$test3  = array();

	for($i = 1; $i < count($test2); $i++){

			$test2 	= $_POST['ma_mid'];
			$test3 	= $_POST['ma_rechnugnsadresse'];
				
			$stmt = $mysqli->prepare("INSERT INTO  bestellungen_rechnungsadresse (ma_aNummer, ma_mid, ma_rechnugnsadresse)  
										VALUES (?, ?, ?)");
						
				$ma_aNummer				= $i;
				$ma_mid					= $test2[$i];
				$ma_rechnugnsadresse	= $test3[$i];
						
				$stmt->bind_param("sss", $ma_aNummer, $ma_mid, $ma_rechnugnsadresse);
				$stmt->execute();
	}
}   
<form method="post" action="" name="cnt_form_reg" style="margin-top: 2em">

				<?php 
				$z = 1;
				if ($mg_anzahlkostenteilung != "" ) {
					$i = 1;
				} else {
					$i = 0;
				}

				for ($i; $i <= $mg_anzahlkostenteilung
					; $i++) { 
					
				?>

		        <div class="textfeld abstand_2">
				    <label for="ma_rechnugnsadresse[]" style="width: 21.5%;"><?php if ($mg_anzahlkostenteilung  >=  "0" )  { echo $z .". " ; } ?> Rechnungsadresse*</label>
				    <select name="ma_rechnugnsadresse[]" id="ma_rechnugnsadresse[]" style="width: 40%;" required="">
				        <option value="">-- Bitte wählen --</option>
				            <?php 
				            $frontend_firmen = frontend_firmen($mysqli);
				            foreach($frontend_firmen as $array){ ?>
				            <option value="<?php echo $array['f_code'];?>"<?php echo ($a_lager == $array['f_code'] ? "selected" : "");?>>
					            <?php echo $array['f_firma'];?> 
					            <?php 
					            if ($array['f_ab_an'] == 1) {
					            if ($array['f_abteilung'] > "") { echo " - " . $array['f_abteilung']; } }
					            ?>
				        	</option>
				            <?php } ?>
				    </select>
				</div>

				<div class="textfeld">
						<label for="midasNummer[]" style="width: 21.5%;"><?php if ($mg_anzahlkostenteilung  >=  "0" )  { echo $z .". " ; } ?> MIDaS Nummer*</label>
						<input type="text" 
							   name="midasNummer[]" 
							   id="midasNummer[]" 
							   value="" 
							   pattern="[1-9]\d{4}|0[1-9]\d{3}|00[1-9]\d{2}|000[1-9]\d|0000[1-9]"
							   required="">
					</div>

				
		        <?php $z++; } ?>

		        <input type="submit" name="abschicken" value="Speichern" id="bearbeiten">
		    
		    </form>

Fehlermeldung habe ich eingeschalten

error_reporting(E_ALL);
ini_set('display_errors', 1);

Allerdings erhalte ich keine Fehlermeldung. Die Datenbank bleibt leer.

  1. $test2 = array(); $test3 = array();

    for($i = 1; $i < count($test2); $i++){

    Was sollte count($test2) hier für einen Wert haben? Was könnte es für einen haben?

  2. @@Bernd

    sehr ihr hier ein Fehler?

    Ja.

    				for ($i; $i <= $mg_anzahlkostenteilung
    					; $i++) { 
    					
    				?>
    
    		        <div class="textfeld abstand_2">
    				    <label for="ma_rechnugnsadresse[]" style="width: 21.5%;"><?php if ($mg_anzahlkostenteilung  >=  "0" )  { echo $z .". " ; } ?> Rechnungsadresse*</label>
    				    <select name="ma_rechnugnsadresse[]" id="ma_rechnugnsadresse[]" style="width: 40%;" required="">
    

    Durch die Schleife erhalten alle select-Elemente dieselbe ID. Das darf nicht sein; IDs müssen dokumentweit eindeutig sein.

    Die Folge davon ist, dass sich alle labels auf das erste select-Feld beziehen; alle anderen select-Felder haben keine Beschriftung.

    Mit dem Index $i steht dir ja was zur Verfügung, die ID eindeutig zu machen und die for-Attribute entsprechend zu setzen.

    Außerdem ist die Schreibweise for (…) { ?> bäh. Stattdessen ist die alternative Schreibweise angebracht:

    <?phpfor ($i; $i <= $mg_anzahlkostenteilung; $i++): ?>
    	<div class="textfeld abstand_2"></div>
    <?php endfor; ?>
    

    Gründe dafür in dieser Diskussion.

    LLAP 🖖

    --
    „Wer durch Wissen und Erfahrung der Klügere ist, der sollte nicht nachgeben. Und nicht aufgeben.“ —Kurt Weidemann
    1. Hallo Bernd,

      was Gunnar geschrieben hat, ist nicht der Grund dafür warum nichts passiert. Dazu halte Dich an encoders Beitrag.

      Trotzdem hat Gunnar natürlich recht. Man darf die Funktion von name und id bei einem Formular-Element nicht verwechseln. Die ID dient zur Identifikation innerhalb der HTML-Seite und muss deshalb eindeutig sein, und der name wird verwendet, um den Wert zu posten. Übrigens: Den Zeichendreher in rechnugn hast Du gesehen?

      Eine Eindeutigkeit des name ist EIGENTLICH nötig, weil man ja die geposteten Werte irgendwie einsammeln muss ohne dass sie sich gegenseitig überschreiben, aber hier hilft PHP mit und ermöglicht mit der [] Schreibweise, dass die Werte zu einem Array zusammengefasst werden. Man muss nur sicherstellen, dass es nicht zu Verschiebungen bei den Indizes kommt (siehe unten).

      Die Mühe der eindeutigen ID kannst Du vermeiden. Eine ID ist nicht zwingend nötig, um ein Label zuordnen zu können. Statt

      <label for="foo">Name:</label>
      <input type="text" id="foo">
      

      kann man auch schreiben:

      <label><span>Name:</span> 
      <input type="text" id="foo">
      </label>
      

      Wenn Label und Input übereinander stehen sollen, gerne auch div statt span. Aber jedenfalls brauchst Du dann keine eindeutige ID.

      Was meinte ich mit der Verschiebung? Schau dir dieses Form an:

      <form method="POST" action="myform.php">
         <fieldset><legend>Foo 1</legend>
            <label>Name: <input type="text" name="name[]"></label>
            <label>Vorname: <input type="text" name="vorname[]"></label>
         </fieldset>
         <fieldset><legend>Foo 2</legend>
            <label>Name: <input type="text" name="name[]"></label>
            <label>Wohnort: <input type="text" name="wohnort[]"></label>
         </fieldset>
      </form>
      

      Das Problem ist hier: Der Name tritt in beiden Fieldsets auf, die anderen beiden je einmal. Postest Du das zurück, bekommst Du zum Beispiel dies:

      name[0] = "Frisch";
      name[1] = "Mustermann";
      vorname[0] = "Fritzchen";
      wohnort[0] = "Musterdorf";

      Du siehst das Problem: Musterdorf gehört zu Mustermann, hat aber nicht den gleichen Index. Ursache ist, dass der Ort im ersten Fieldset nicht vorkam. Bei derartigen Formularen kannst Du nicht mit [] arbeiten, dann musst Du den Index mit ins HTML setzen.

      Rolf

      --
      sumpsi - posui - clusi
      1. @@Rolf B

        kann man auch schreiben:

        <label><span>Name:</span> 
        <input type="text" id="foo">
        </label>
        

        Ja.

        Wenn Label und Input übereinander stehen sollen, gerne auch div statt span.

        Nein, das nicht! [Spec]

        Wenn Label und Input übereinander stehen sollen, gerne label > span { display: block }.

        LLAP 🖖

        --
        „Wer durch Wissen und Erfahrung der Klügere ist, der sollte nicht nachgeben. Und nicht aufgeben.“ —Kurt Weidemann
      2. Hallo,

        danke für deine Antwort, ich habe meinen Code etwas angepasst:

        <form method="post" action="" name="cnt_form_reg" style="margin-top: 2em">
        
        				<?php 
        				$z = 1;
        				if ($mg_anzahlkostenteilung != "" ) {
        					$i = 1;
        				} else {
        					$i = 0;
        				}
        
        				for ($i; $i <= $mg_anzahlkostenteilung
        					; $i++) { 
        					
        				?>
        
        		        <div class="textfeld abstand_2">
        				    <label for="ma_rechnugnsadresse[<?php echo $z ?>]" style="width: 21.5%;"><?php if ($mg_anzahlkostenteilung  >=  "0" )  { echo $z .". " ; } ?> Rechnungsadresse*</label>
        				    <select name="ma_rechnugnsadresse[<?php echo $z ?>]" id="ma_rechnugnsadresse[<?php echo $z ?>]" style="width: 40%;" required="">
        				        <option value="">-- Bitte wählen --</option>
        				            <?php 
        				            $frontend_firmen = frontend_firmen($mysqli);
        				            foreach($frontend_firmen as $array){ ?>
        				            <option value="<?php echo $array['f_code'];?>"<?php echo ($a_lager == $array['f_code'] ? "selected" : "");?>>
        					            <?php echo $array['f_firma'];?> 
        					            <?php 
        					            if ($array['f_ab_an'] == 1) {
        					            if ($array['f_abteilung'] > "") { echo " - " . $array['f_abteilung']; } }
        					            ?>
        				        	</option>
        				            <?php } ?>
        				    </select>
        				</div>
        
        				<div class="textfeld">
        						<label for="ma_midas[<?php echo $z ?>]" style="width: 21.5%;"><?php if ($mg_anzahlkostenteilung  >=  "0" )  { echo $z .". " ; } ?> MIDaS Nummer*</label>
        						<input type="text" 
        							   name="ma_midas[<?php echo $z ?>]" 
        							   id="ma_midas[<?php echo $z ?>]" 
        							   value="" 
        							   pattern="[1-9]\d{4}|0[1-9]\d{3}|00[1-9]\d{2}|000[1-9]\d|0000[1-9]"
        							   required="">
        					</div>
        
        				
        		        <?php $z++; } ?>
        
        		        <input type="submit" name="abschicken" value="Speichern" id="bearbeiten">
        		    
        		    </form>
        

        Auch habe ich den PHP Code etwas angepasst

        if(isset($_POST['abschicken']) && empty($errors)) {
        
        	$ma_rechnugnsadresse  = array();
        	$ma_midas  = array();
        
        	var_dump($ma_rechnugnsadresse);
        
        
        	for($i = 0; $i <= $mg_anzahlkostenteilung; $i++){
        
        			$ma_mid 				= $_GET['code'];
        			$ma_rechnugnsadresse 	= $_POST['ma_rechnugnsadresse'];
        			$ma_midas 				= $_POST['ma_midas'];
        				
        			$stmt = $mysqli->prepare("INSERT INTO bestellungen_rechnungsadresse (ma_aNummer, ma_mid, ma_rechnugnsadresse, ma_midas)  
        										VALUES (?, ?, ?, ?)");
        						
        				$ma_aNummer				= $i;
        				$ma_mid					= $ma_mid;
        				$ma_rechnugnsadresse	= $ma_rechnugnsadresse[$i];
        				$ma_midas 				= $ma_midas[$i];
        						
        				$stmt->bind_param("ssss", $ma_aNummer, $ma_mid, $ma_rechnugnsadresse, $ma_midas);
        				$stmt->execute();
        	}
        }  
        

        In der Datenbank kommt es richtig an

        Jetzt stellt sich mir die Frage, wie kann ich die Daten wieder richtig zuordnen wenn ich die Seite bearbeiten möchte?

        1. Update:

          OK, so kann ich die Felder wieder füllen lassen

          <form method="post" action="" name="cnt_form_reg" style="margin-top: 2em">
          
          				<?php 
          				$z = 1;
          				if ($mg_anzahlkostenteilung != "" ) {
          					$i = 1;
          				} else {
          					$i = 0;
          				}
          
          				for ($i; $i <= $mg_anzahlkostenteilung
          					; $i++) { 
          
          					$stmt = $mysqli->prepare("SELECT ma_id, ma_aNummer, ma_mid, ma_rechnugnsadresse, ma_midas 
                                      FROM bestellungen_rechnungsadresse 
                                      WHERE ma_aNummer=? AND ma_mid=?");
          					
          					$stmt->bind_param("ss", $i, $code);
          					$stmt->execute();
          					$stmt->bind_result($ma_id, $ma_aNummer, $ma_mid, $ma_rechnugnsadresse, $ma_midas );
          					$stmt->fetch();
          					$stmt->close();
          					
          				?>
          
          		        <div class="textfeld abstand_2">
          				    <label for="ma_rechnugnsadresse[<?php echo $z ?>]" style="width: 21.5%;"><?php if ($mg_anzahlkostenteilung  >=  "0" )  { echo $z .". " ; } ?> Rechnungsadresse*</label>
          				    <select name="ma_rechnugnsadresse[<?php echo $z ?>]" id="ma_rechnugnsadresse[<?php echo $z ?>]" style="width: 40%;" required="">
          				        <option value="">-- Bitte wählen --</option>
          				            <?php 
          				            $frontend_firmen = frontend_firmen($mysqli);
          				            foreach($frontend_firmen as $array){ ?>
          				            <option value="<?php echo $array['f_code'];?>"<?php echo ($a_lager == $array['f_code'] ? "selected" : "");?>>
          					            <?php echo $array['f_firma'];?> 
          					            <?php 
          					            if ($array['f_ab_an'] == 1) {
          					            if ($array['f_abteilung'] > "") { echo " - " . $array['f_abteilung']; } }
          					            ?>
          				        	</option>
          				            <?php } ?>
          				    </select>
          				</div>
          
          				<div class="textfeld">
          						<label for="ma_midas[<?php echo $z ?>]" style="width: 21.5%;"><?php if ($mg_anzahlkostenteilung  >=  "0" )  { echo $z .". " ; } ?> MIDaS Nummer*</label>
          						<input type="text" 
          							   name="ma_midas[<?php echo $z ?>]" 
          							   id="ma_midas[<?php echo $z ?>]" 
          							   value="<?php echo htmlspecialchars($ma_midas) ?>" 
          							   pattern="[1-9]\d{4}|0[1-9]\d{3}|00[1-9]\d{2}|000[1-9]\d|0000[1-9]"
          							   required="">
          						<div class="minlengthpwd" style="margin-left: 16.8em;">5 stellige Nummer</div>
          					</div>
          
          				
          		        <?php $z++; } ?>
          
          		        <input type="submit" name="abschicken" value="Speichern"id="bearbeiten">
          		    
          		    </form>
          
  3. Hi,

    sehr ihr hier ein Fehler?

    allein bis hier schon zwei. Ein r, wo ein t stehen sollte, und ein "en" fehlt auch.

    if(isset($_POST['abschicken']) && empty($errors)) {
    	$test2  = array();
    	$test3  = array();
    	for($i = 1; $i < count($test2); $i++){
    			$test2 	= $_POST['ma_mid'];
    

    erstmal die Anzahl der Elemente im leeren Array holen, und falls es mehr als 1 ist, das Array mit etwas nicht-leerem zu überschreiben, erscheint mir sehr gewagt.

    			$test3 	= $_POST['ma_rechnugnsadresse'];
    

    Du hast das zwar konsequent falsch geschrieben, so daß das keine Auswirkungen hat, ich tät's an Deiner Stelle aber doch korrigieren.

    cu,
    Andreas a/k/a MudGuard