[PHP/mySQL] Mehrere Tabellenzeilen gleichzeitig updaten

SoKoBaN

B.Ohlsen der alte Schwede
Teammitglied
Mehrere Tabellenzeilen gleichzeitig updaten

Ich habe ein Sript, das mir n Zeilen aus einer Datenbank ausliest und in ein Formular schreibt.
Wenn ich dieses Formular dann abschicke, möchte ich auch alle betroffenen Zeilen der MySQL Tabelle updaten. So wie es jetzt ist, wird immer nur letzte Satz des Formulares in die Datenbank geschrieben.

Formular:
PHP:
 	echo '<form name = "config" action = '.$PHP_SELF.' method = "post">';
	echo '<table width="600" border="0" cellspacing="2" cellpadding="2"><tr><td>';
	echo '<table width="100%" border="1" cellspacing="0" cellpadding="5">';
	echo '<tr><th colspan="4"><big>Haupteinstellungen</big></th></tr>';
		$sqlab = "SELECT * FROM mainconf WHERE `rubrik` ='glob_conf' ORDER BY 'id' LIMIT 0,30";
		$result=mysql_query($sqlab);
		$num =  mysql_affected_rows();
			while ($row=mysql_fetch_array($result))
			{
				$id = $row["id"];
				$rubrik = $row["rubrik"];
				$description = $row["description"];
				$wert = $row["wert"];
				$order = $row["order"];
				$eintrag = $row["eintrag"];
				echo '<tr><input type="hidden" name="new_id" value='.$id.'>';
				echo '<td width="25%"><b>'.$description.'</b>:</td><td><input type="text" size="50" name="new_eintrag" value='.$eintrag.'></td><td>';
				echo '<select size="1" name="new_order"><option selected>'.$order.'</option><option></option>';
 				for($x=1;$x<$num+1;$x++)
					{
  				echo '<option>' . $x . '</option>';
					}  
				echo '</select></td></tr>';
 			} 
	echo '</table><br><br>';
	echo '<br><br><div align="center"><input type="submit" value="Config Speichern" name="gesendet"></div></form>';

Und der SQL Teil:
PHP:
if ($_REQUEST['gesendet'])
{
	$sqlab = "UPDATE `mainconf` SET `eintrag` = '$new_eintrag',`order` = '$new_order' WHERE `id` = '$new_id'";
	mysql_query($sqlab);
 	$num = mysql_affected_rows();
	if ($num>0)
		{
 		echo 'Scriptupdate erfolgreich';
		}
		else
		{
		echo 'Fehler-Nr. '. mysql_errno().' - '.mysql_error().''; 
		}
}
 
Das liegt daran, das du das hidden-Feld new_id in jeder Zeile verwendest. Da wird es X-mal beschrieben, aber im Endeffekt wird nur der letzte Eintrag abgefragt.
 
?
Das id Feld hat aber auch jedesmal einen anderen Wert.
Das steht für die ID des Datensatzes in der Datenbank.

ID: 1, Wert: blah, Order:0
ID: 2, Wert: blah3, Order:2
ID: 3, Wert: blah2, Order:1
usw.

Es muss doch ne Möglichkeit geben alle Daten in einem Rutsch in die Datenbank zu bringen...
 
Klar, aber mit der Abfrage auf das Feld id, was wohl der Primary Key ist kannst du immer nur ein Feld ansprechen, ansonsten müsstest du eine Oder-Abfrage in dienen Update-Query einbauen...
 
?
Wie auch immer, ich müsste den Krempel des Formulares in ein Array packen und das dann mit foreach in die Datenbank schreiben. Nur leider hab ichs nicht hinbekommen. Deswegen dacht ich ich frag mal.
 
Ich hab jetzt nochmal was geändert. Ich lasse jetzt im Formular den Feldnamen und die ID in ein Array schreiben. Im Query sreib ich das jetzt mit einer Schleife in die Datenbank.
Das Problem ist jetzt, das ich nur ein Formularfeld mit ID übergeben kann. Ich müsste aber mindestens 2 übergeben, in meinem Fall zusätzlich new_order['.$id.'].
Ich könnte zwar einfach eine zweite Schleife bauen, die mir das dann einträgt aber irgendwie muss es doch auch mit einem mal gehen...

Formular:
PHP:
	echo '<form name = "config" action = '.$PHP_SELF.' method = "post">';
	echo '<table width="600" border="0" cellspacing="2" cellpadding="2"><tr><td>';
	echo '<table width="100%" border="1" cellspacing="0" cellpadding="5">';
	echo '<tr><th colspan="3"><big>Haupteinstellungen</big></th></tr>';
		$sqlab = "SELECT * FROM mainconf WHERE rubrik ='glob_conf' ORDER BY 'id'";
		$result=mysql_query($sqlab);
		$num =  mysql_affected_rows();
			while ($row=mysql_fetch_array($result))
			{
				$id = $row["id"];
				$rubrik = $row["rubrik"];
				$description = $row["description"];
				$wert = $row["wert"];
				$order = $row["order"];
				$eintrag = $row["eintrag"];
				echo '<tr><td width="25%"><b>'.$description.'</b>:';
				echo'</td><td><input type="text" size="50" name="new_eintrag['.$id.']" value="'.$eintrag.'"></td><td>';
				echo '<select size="1" name="new_order['.$id.']"><option selected>'.$order.'</option><option></option>';
 				for($x=1;$x<$num+1;$x++)
					{
  				echo '<option>' . $x . '</option>';
					}  
				echo '</select></td></tr>';
 			} 
	echo '</table><br><br>';
	echo '<br><br><div align="center"><input type="submit" value="Config Speichern" name="gesendet"></div></form>';

Query:
PHP:
if ($_REQUEST['gesendet'])
{

	while (list($id,$new_eintrag)=each($_POST["new_eintrag"]))
	{

 		$sqlab = "UPDATE `mainconf` SET `eintrag` = '$new_eintrag' WHERE `id` = '$id'"; 
		mysql_query($sqlab);
 		$num = mysql_affected_rows();
		if ($num>0)
			{
 			echo 'Scriptupdate erfolgreich mit<br>'.$sqlab.'';
			}
			else
			{
			echo 'Fehler-Nr. '. mysql_errno().' - '.mysql_error().''; 
		}
	} 
}
 
So nun klapps :)
Jeden Formularwert in ein Array und dann die Reihe nach im Query ausgelesen und in die DB geschrieben.

Formular:
PHP:
	echo '<form name = "config" action = '.$PHP_SELF.' method = "post">';
	echo '<table width="600" border="0" cellspacing="2" cellpadding="2"><tr><td>';
	echo '<table width="100%" border="1" cellspacing="0" cellpadding="5">';
	echo '<tr><th colspan="3"><big>Haupteinstellungen</big></th></tr>';
	echo '<tr><th>Name</th><th>Beschreibung</th><th>Rang</th></tr>';
	$sqlab = "SELECT * FROM `mainconf` WHERE `rubrik` ='glob_conf' ORDER BY 'id' LIMIT 0,30";
	$result=mysql_query($sqlab);
	$num =  mysql_affected_rows();
	while ($row=mysql_fetch_array($result))
	{
		$id = $row["id"];
		$rubrik = $row["rubrik"];
		$description = $row["description"];
		$order = $row["order"];
		$eintrag = $row["eintrag"];
		echo '<input type="hidden" name="new_id[]" value='.$id.'>';
		echo '<input type="hidden" name="new_rubrik" value='.$rubrik.'>';
		echo '<tr><td width="25%"><b>'.$description.'</b>:</td>';
		echo '<td><input type="text" size="50" name="new_eintrag[]" value="'.$eintrag.'"></td>';
		echo '<td><select size="1" name="new_order[]"><option selected>'.$order.'</option><option></option>';
 		for($x=1;$x<$num+1;$x++)
		{
  		echo '<option>' . $x . '</option>';
		}  
		echo '</select></td></tr>';
 	} 
	echo '</table><br><br>';
	echo '<br><br><div align="center">';
	echo '<input type="submit" value="Config Speichern" name="gesendet">';
	echo '</div></form>';

Query:
PHP:
if ($_REQUEST['gesendet'])
{
	$sqlab = "SELECT * FROM `mainconf` WHERE `rubrik` ='$new_rubrik'";
	$result=mysql_query($sqlab);
	$num =  mysql_affected_rows();
	$i=0;
	while ($i < $num)
	{ 
		$id = $_POST['new_id']["$i"];
		$new_eintrag = $_POST['new_eintrag']["$i"];
		$new_order = $_POST['new_order']["$i"];
		
		$sqlab = "UPDATE `mainconf` SET `eintrag` = '$new_eintrag', `order` = '$new_order' WHERE `id` = '$id'"; 
		mysql_query($sqlab) OR die(mysql_error());
		$i++;
	}
	 echo 'Scriptupdate erfolgreich';
mysql_close();
}
 
Oben