# Mehrere Datensätze gleichzeitig ändern



## Zero2000 (14. Februar 2006)

Hallo

*"Ich bin auf der Suche nach einer Möglichkeit, die Werte mehrere Datensätze in einer Liste mit editierbaren Formularfeldern auszugeben und durch einen einzigen Klick zu speichern."*

Das beschreibt mein Problem. Leider habe ich das hier im Forum nur für ASP gefunden.
Ich würde das selbe aber gern mit PHP und MySQL tun.
Die Seite in der editiert wird habe ich schon erstellt.

Das Inputfeld sieht so aus:

```
<input style='border:1px solid #000000;background:#ffffff;width:40;' type='text' name='stock_eu[]' value='$bestand_eur'>
```
Außerdem gebe ich die Originalid in einem versteckten Inputfeld mit.

```
<input type='hidden' name='oriid_eu' value='$stock_eu'>
```
Nur ist mir unklar, wie die Abfrage an die DB aussehen soll.
Folgendes klappt nicht:

```
mysql_query("UPDATE ls_daten SET bestand_eur='$stock_eu' WHERE Id = $oriid_eu")or die("FEHLER:<br><br>".mysql_error());
```

Ich danke euch schonmal im vorraus für eure Lösungsvorschläge.

MfG Maik


----------



## Ecthelion (14. Februar 2006)

Was genau klappt den bei der MySql Abfrage nicht?
Eigentlich müsstet du die Daten mit den Absenden des Formulars auch speichern können.
Kannst du mal die Fehlermeldung posten?

MfG

Ecthelion


----------



## Zero2000 (14. Februar 2006)

```
You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1
```
Mehr kommt nicht.
In *stock_eu[]* habe ich ja die neuen, bzw. auch die alten wenn ich nichts ändere, Daten in einem Array.
Mh... Bin total überfordert mit meinem bischen PHP.

MfG Maik


----------



## BSA (14. Februar 2006)

Zeig uns mal bitte die Abfrage (also wie ist die Ausgabe -> Variablen ersetzt) Also lass dir einfach mal mittels echo die Abfrage ausgeben!

Gruß BSA


----------



## Zero2000 (14. Februar 2006)

Hallo

@BSA
Ich weiß im Moment nicht was Du willst. Wie oben schon erwähnt habe ich ein Inputfeld mit namen *stock_eu[]* und als value übergebe ich das feld mit dem Bestand aus der DB (bestand_eu)
Desweiteren übergebe ich ein verstecktes Inputfeld mit *name='oriid_eu' *und *value='$stock_eu'*

Die Abfrage sieht so aus:

```
mysql_query("UPDATE ls_daten SET bestand_akt_neu = $stock_eu, bestand_eur = $stock_eu WHERE Id = $oriid_eu")or die("FEHLER:<br><br>".mysql_error());
```

Ich denke, er weiß gar nicht welche Datensätze er ändern soll, weil er nirgends die richtige ID bekommt.... Nur wo soll ich die denn noch mit übergeben?

MfG Maik


----------



## saila (14. Februar 2006)

kann nicht gehen! Wie schon in der Errormeldung benannt, fehlen ''

Ergo lautet der korrekte query:


```
<?php
mysql_query("UPDATE 
				ls_daten 
			 SET 
			 	bestand_eur='$stock_eu' 
			 WHERE 
			 	Id='$oriid_eu'
			 ") 
			 or die("FEHLER:<br><br>".mysql_error()); 
?>
```

wenn du mehrere Formularfelder updaten möchtest, setzt du hinter SET im query-string einfach die DB-Spalte mit dem entsprechenden Wert dazu und das getrennt mit einem Komma.

Beispiel

```
<?php
mysql_query("UPDATE 
				ls_daten 
			 SET 
			 	bestand_eur='$stock_eu',
			 	spalte_x='$wert',
			 	spalte_y='$wert1'
			 WHERE 
			 	Id='$oriid_eu'
			 ") 
			 or die("FEHLER:<br><br>".mysql_error()); 
?>
```

Und immer merken - auflisten und einrücken gilt auch bei query's!


----------



## Zero2000 (14. Februar 2006)

Hallo

Es geht auch nicht wenn ich die Variablen in diese ' ' mache.
Ich denke eher es hat was mit dem Array zu tun.
Und müsste nicht die Abfrage in eine Schleife um für jeden Datensatz den Update-Befehl auszuführen

Wenn ich mir die Daten aus dem übergebenen Array *stock_eu[]* anzeigen lasse, dann stehen genau die Daten drin die ich benötige.

Meine Datei in der das Update ausgeführt wird sieht so aus:

```
if(isset($submit))
{
   mysql_query("UPDATE ls_daten SET bestand_akt_neu = '$stock_eu', bestand_eur = '$stock_eu' WHERE Id = '$oriid_eu'")or die("FEHLER:<br><br>".mysql_error());
   $num_eu = mysql_affected_rows();
   if ($num_eu>0)
   {
      echo "<h3>Datensatz wurde geändert.</h3>";
   }
   else
   {
      echo "<b><font face='Arial' size='3'><u>Es wurden keine Änderungen an diesem Datensatz vorgenommen.</u></font></b><p>";
   }
}
```
Die Datei mit den Inputfeldern so:

```
$res=mysql_query("SELECT * FROM ls_daten WHERE bestand_akt_neu >0");
$num=mysql_num_rows($res);

//Formularbeginn
echo "<form method='post' action='index.php?action=lager&option=inventur2'>";

//Tabellenbeginn
echo "<table border='0' cellspacing='1' cellpadding='3' bgcolor='#000000'>";

//Tabellen-Überschrift
echo "<tr bgcolor='#dce3f4' align='center'><td><b>ID</b></td><td><b>Sorte</b></td><td><b>Bestand</b></td><td><b>EUR-m²</b></td><td><b>EUR-Pal.</b></td><td><b>EW-m²</b></td><td><b>EW-Pal.</b></td></tr>";

for ($i=0; $i<$num; $i++)
{
$id=mysql_result($res, $i, "Id");
$sorte=mysql_result($res, $i, "sorte");
$zugang_eu=mysql_result($res, $i, "zugang_eu");
$zugang_ew=mysql_result($res, $i, "zugang_ew");
$abgang_eu=mysql_result($res, $i, "abgang_eu");
$abgang_ew=mysql_result($res, $i, "abgang_ew");
$bestand_akt_neu=mysql_result($res, $i, "bestand_akt_neu");
$ein_datum=mysql_result($res, $i, "ein_datum");
$ein_zeit=mysql_result($res, $i, "ein_zeit");
$bestand_eur=mysql_result($res, $i, "bestand_eur");
$eur_menge=mysql_result($res, $i, "eur_menge");
$bestand_ew=mysql_result($res, $i, "bestand_ew");
$ew_menge=mysql_result($res, $i, "ew_menge");

	$count_eu = $bestand_eur / $eur_menge;
	$count_ew = $bestand_ew / $ew_menge;
	$count_ew = number_format($count_ew,2,".",".");
	$count_eu = number_format($count_eu,2,".",".");

//Tabellenzeile mit tabellen
echo "<tr bgcolor='#EDF3F4'><td bgcolor='#EDF3F4'>$id</td><td bgcolor='#EDF3F4'>$sorte</td></td><td align=left>$bestand_akt_neu m²</td><td><input style='border:1px solid #000000;background:#ffffff;width:40;' type='text' name='stock_eu[]' value='$bestand_eur'> m²</td><td>$count_eu</td><td><input style='border:1px solid #000000;background:#ffffff;width:40;' type='text' name='stock_ew[]' value='$bestand_ew'> m²</td><td>$count_ew</td></tr>";
}
// Original ID mitschicken (versteckt)
echo "<input type='hidden' name='oriid_eu' value='$stock_eu'>";
echo "<input type='hidden' name='oriid_ew' value='$stock_ew'>";

//Tabellenende
echo "</table><br>";
echo "<input style='background-color:#ffffff;border:1px solid #000000;font-size:10px;font-family:verdana' type='submit' name='submit' value='Inventur speichern'></form>";
```
Vielleicht bringt das ja Licht ins Dunkel ;-)

MfG Maik


----------



## saila (14. Februar 2006)

also du hast ein formular, in welchem daten aus der db in die input values gesetzt werden.

nun änderst du einen oder mehrere einträge in dem formular und sendest dieses ab.

mit dem absenden setzt du alle formularfelder in den einen einzigen query wie im beispiel genannt. 

fertig.

wenn du das nicht vollständig verstehst, wäre es gut, wenn du dich noch mal mit einem tutorial befasst, welches formularverarbeitung in verbindung mit einer db aufzeigt inkl. änderung von db einträgen.


----------



## Zero2000 (15. Februar 2006)

saila hat gesagt.:
			
		

> also du hast ein formular, in welchem daten aus der db in die input values gesetzt werden.


Richtig....


			
				saila hat gesagt.:
			
		

> nun änderst du einen oder mehrere einträge in dem formular und sendest dieses ab.


Richtig...


			
				saila hat gesagt.:
			
		

> mit dem absenden setzt du alle formularfelder in den einen einzigen query wie im beispiel genannt.


Falsch...
Wie soll das denn gehen? Wenn ich aus einer DB 131 Datensätze auslese kann ich doch nicht allen Inputfeldern einen anderen Namen geben. Es existiert in meiner Schleife nur einmal, dieses Inputfeld.
Deswegen mache ich es doch mit einem Array.


			
				saila hat gesagt.:
			
		

> wenn du das nicht vollständig verstehst, wäre es gut, wenn du dich noch mal mit einem tutorial befasst, welches formularverarbeitung in verbindung mit einer db aufzeigt inkl. änderung von db einträgen.


Damit habe ich keine Probleme. Ich kann auch einzelne Datensätze ändern, löschen, kann meine Formulare per E-Mail wegschicken.
Denn da habe ich ja unterschiedliche Inputfelder mit unterschiedlichen Namen.

In meinem Bsp. habe ich aber EIN Inputfeld und nur EINEN Namen. Ich sammle die Werte in einem ARRAY namens stock_eu[]
Wenn ich mir das ARRAY anzeigen lasse stehen die Werte auch drin wie sie sein sollen.
Aber wenn ich die Abfrage abschicke steht in den Feldern entweder ARRAY oder für alle Felder ein Wert den er sich willkürlich rauspickt.

Warum probierst Du es nicht mal selbst ob DU es hinbekommst?

MfG Maik


----------



## BSA (15. Februar 2006)

Du hast doch das Problem nun schon beim Namen genannt, du brauchst eine Schleife. Wo ist das Problem?

Du musst also für jeden Datensatz eine Abfrage machen!

Und ich wollte den String sehen wie er aussieht nachdem er über den Server gelaufen ist.

Sprich:


```
echo 'SELECT $irgendwas FROM $tbl';
```

Klar?

Gruß BSA


----------



## Zero2000 (15. Februar 2006)

Wenn ich meine Abfrage also ausgeben lasse, dann sieht das so aus:

```
UPDATE ls_daten SET bestand_akt_neu = 'Array', bestand_eur = 'Array', WHERE Id = 'Array'
```

MfG Maik


----------



## RS9999 (15. Februar 2006)

Hallo,

also hier einmal ein Beispiel einer Adressdatenbank,
die mit einem Formular alle Datensätze nach Wunsch
ändert. Soll Dir die Funktionsweise zeigen!

1.) Datei z.B. formular_update.php

```
<?php
     // Datei formular_update.php
     error_reporting(E_ALL);
     
     include ('con.inc.php'); 
    
     mysql_select_db('Datenbankname',$link);    
     $result = mysql_query("SELECT 
                                   *
                            FROM 
                                   `Tabelle`");
    
     while($row = mysql_fetch_assoc($result)){  


     echo '<form action="upload.php" method="post">';
     echo '<input type="hidden" name="ID[]" value="'.$row['ID'].'">';
     echo '<table width="600" bgcolor="#999999" align="center" border="0" cellpadding="0" cellspacing="2"> ';
     echo '<tr>';
echo '<td width="90" bgcolor="#CCCCCC" align="center"><input type="text" name="Nr[]" value="'.$row['Nr'].'" class="input" size="10" maxlength="20"></td>';
echo '<td width="160" bgcolor="#CCCCCC" align="center"><input type="text" name="Name[]" value="'.$row['Name'].'" class="input" size="25" maxlength="50"></td>';
echo '<td width="90" bgcolor="#CCCCCC" align="center"><input type="text" name="PLZ[]" value="'.$row['PLZ'].'" class="input" size="10" maxlength="20"></td>';
echo '<td width="90" bgcolor="#CCCCCC" align="center"><input type="text" name="Ort[]" value="'.$row['Ort'].'" class="input" size="10" maxlength="30"></td>';
echo '<td width="90" bgcolor="#CCCCCC" align="center"><input type="text" name="Strasse[]" value="'.$row['Strasse'].'" class="input" size="10" maxlength="20"></td>';
echo '<td width="80" bgcolor="#CCCCCC" align="center"><input type="text" name="Telefon[]" value="'.$row['Telefon'].'" class="input" size="10" maxlength="20"></td>';
     echo '</tr>';
     echo '</table><br>';
     }
     echo '<div align="center">';
     echo '<input type="submit" name="senden" value="Update">';
     echo '</div>';
     echo '</form>';
?>
```
 2.) Datei z.B. update.php

```
<?php 
    // Datei upload.php
      if($_POST['senden']){
      error_reporting(E_ALL);    
            
            $id = $_POST['ID'];
      $nr = $_POST['Nr'];
      $name = $_POST['Name'];
      $plz = $_POST['PLZ'];
      $ort = $_POST['Ort'];
      $strasse = $_POST['Strasse'];
      $telefon = $_POST['Telefon'];
       
        include ('connection.inc.php'); 
    
      mysql_select_db('Datenbank',$link);
      $sql = "SELECT 
                     * 
              FROM 
                    `Tabelle`";
      $res = mysql_query($sql);
      $row = mysql_num_rows($res);
              
      for($i=0;$i < $row;$i++){            
      mysql_query ("UPDATE 
                          `Tabelle` 
                    SET 
                          `ID` = '".$id[$i]."' , 
                          `Nr` = '".$nr[$i]."' , 
                          `Apothekenname` = '".$name[$i]."', 
                          `PLZ` = '".$plz[$i]."', 
                          `Ort` = '".$ort[$i]."', 
                          `Strasse` = '".$strasse[$i]."', 
                          `Telefon` = '".$telefon[$i]."'
                    WHERE
                          `ID` = '".$id[$i]."'") or die("FEHLER:<br><br>".mysql_error()); 
      }                                                
      $mar = mysql_affected_rows();
      if ($mar > 0)
      {
      echo "<h3>Datensatz wurde geändert.</h3>";
      }
      else
      {
echo "<b><font face='Arial' size='2'>Es wurden keine Änderungen an diesem Datensatz vorgenommen.</font></b><p>";
      }
      }    
?>
```
Habe so etwas im Einsatz und es ist sehr gut in der Handhabung und Funktionsweise.

Hoffe ich konnte Dir ein wenig helfen?

Gruß

RS9999


----------



## Zero2000 (16. Februar 2006)

Hallo

@RS9999
Das ist genau das was ich gesucht habe. Vielen Dank

MfG Maik


----------



## saila (16. Februar 2006)

...und das meinte ich mit einem einzige query, da die Schleife ja schon vorhanden war.


----------



## Zero2000 (16. Februar 2006)

Naja das war mir ja auch klar, nur eben nicht wie die Schleife dann aussehen soll.
Ich habe jetzt beim weiteren Testen festgestellt das ich bei der Updateanweisung einen vorhanden Wert nicht ersetzen darf sondern addieren muß.

Bei einer normalen Abfrage ist das ja kein Problem:

```
mysql_query("UPDATE tabelle SET eins = eins + $eins, WHERE id = '$id'");
```
Aber bei dieser Form habe ich es bis jetzt nicht geschafft.
Ich habe schon verschiedene Schreibweisen probiert aber ohne Erfolg.

```
for($i=0;$i < $row;$i++){            
      mysql_query ("UPDATE 
                          `Tabelle` 
                    SET 
                          `ID` = '".$id[$i]."' , 
                          `Nr` = '".$nr[$i]."' , 
                          `Apothekenname` = '".$name[$i]."', 
                          `PLZ` = '".$plz[$i]."', 
                          `Ort` = '".$ort[$i]."', 
                          `Strasse` = '".$strasse[$i]."', 
                          `Telefon` = '".$telefon[$i]."'
                    WHERE
                          `ID` = '".$id[$i]."'") or die("FEHLER:<br><br>".mysql_error()); 
      }
```

MfG Maik


----------

