Michi: in einer foreach Schleife $_POST hört nach einem Durchlauf auf?

Die Werte kommen über ein HTML Formular, anschließend wird in einer WHILE schleife alle Felder ausgeben die gespeichert sind.

In eine foreach Schleife sollen alle Werte aus der POST Variable verglichen werden, ob sie vorhanden sind, wenn ja, dann sollen sie in die Datenbank geschrieben werden.

Die Schleife funktioniert solange die beiden auskommentierte Datenbankanweisungen nicht aktiv sind.

Wenn sie laufen, wird die Schleife nur einmal durchlaufen. Es ist so, als ob die weiteren Werte verschwinden

if(isset($_POST))
	{
	$statement = $pdo->prepare("select a FROM table  WHERE port =:port");
	$statement->execute(array('port' => 0));  
	while($row = $statement->fetch()) 
		{	
		foreach($_POST AS $question => $answer) 
			{
			if($question==$row['id'])
				{
				#$statement = $pdo->prepare("INSERT INTO table2 SET id_user =:id_user, question =:question");
				#$result = $statement->execute(array('id_user' => $_SESSION['userid'], 'question' => $question ));		
				echo $question;
				echo'<br/>';	
				}
			}
		}
	}
  1. Tach!

    Die Schleife funktioniert solange die beiden auskommentierte Datenbankanweisungen nicht aktiv sind.

    Du belegst die Variable $statement im Inneren mit anderem Inhalt, obwohl der ursprüngliche noch in der äußeren Schleife benötigt wird.

    Unabhängig davon: Prepared Statements sind so geschaffen, dass man nur einmal präparieren muss, wenn man mehrfach INSERT ausführen möchte. Die Prepare-Anweisung kann vor deshalb das while (und muss eine eigenen Variable bekommen).

    dedlfix.

    1. Du belegst die Variable $statement im Inneren mit anderem Inhalt, obwohl der ursprüngliche noch in der äußeren Schleife benötigt wird.

      Weis du wie oft ich mir das angesehen habe, und es nicht gesehen habe? Danke...

      Unabhängig davon: Prepared Statements sind so geschaffen, dass man nur einmal präparieren muss, wenn man mehrfach INSERT ausführen möchte. Die Prepare-Anweisung kann vor deshalb das while (und muss eine eigenen Variable bekommen).

      Einleuchtend.

      Danke :_)

  2. Hallo Michi,

    die Suchschleife ist unnötig. Du kannst einfach abfragen, ob $row['id'] in $_POST enthalten ist und dann darauf zugreifen.

    foreach($_POST AS $question => $answer) 
      {
      if($question==$row['id'])
        {
        #$statement = $pdo->prepare("INSERT INTO table2 SET id_user =:id_user, question =:question");
        #$result = $statement->execute(array('id_user' => $_SESSION['userid'], 'question' => $question ));		
        echo $question;
        echo'<br/>';	
        }
      }
    

    Die Suchschleife ist unnötig.

    $questionStmt = $pdo->prepare("select a FROM table  WHERE port =:port");
    $insertStmt = $pdo->prepare("INSERT INTO table2 SET id_user =:id_user, question =:question");
    // ...
    while($row = $questionStmt->fetch())
      {
      $question = $row['id'];
      if (isset($_POST[$question])
        {
        $answer = $_POST[$question];
        $result = $insertStmt->execute(array('id_user' => $_SESSION['userid'], 'question' => $question ));		
        echo $question;
        echo'<br/>';	
        }
      }
    

    Oder noch kürzer (die $answer Zeile hab ich stehen lassen, falls Du die noch anderswo brauchst)

    $questionStmt = $pdo->prepare("select a FROM table  WHERE port =:port");
    $insertStmt = $pdo->prepare("INSERT INTO table2 SET id_user =:id_user, question =:question");
    // ...
    while($row = $questionStmt->fetch())
      {
      if (isset($_POST[$row['id']])
        {
        $answer = $_POST[$row['id']];
        $result = $insertStmt->execute(array('id_user' => $_SESSION['userid'], 'question' => $row['id'));		
        echo $row['id'] . '<br/>';	
        }
      }
    

    Rolf

    --
    sumpsi - posui - clusi