# Mehrere Datensätze updaten



## syntax (15. April 2012)

Hallo Leute,
ich will mit einem Submit-Button mehrere Datensätze updaten.

Das Update an sicht klappt auch,allerdings nur beim ersten Datensatz, die anderen werden nicht mit geupdatet. Ich denke das Schleife nicht durchläuft.

Habe auch nach viel suchen im Netz keine alternativen zu meiner Schleife gefunden, da der Aufbau einer Schleife im Grund ja immer gleich ist.

Hier mein Code, entweder ich hab einen Denkfehler oder es ist nur ein Schusselfehler.

Vielen Dank.


```
echo <<<HTML
   <input type="submit" name="update" value="update" >
HTML;

    // Anzahl Datensätze
    $anzahl = mysql_num_rows( $abz_result );

    // Datensatz Ändern
    if(isset($_POST['update'])){
      
       for ($a = 0; $a < $anzahl; $a++) {
          
           $id[$a] = $_POST['id'];
              
               $query = "UPDATE fahrzeuge SET 
               ersteller='".$_SESSION['user']."',
               auto ='".$_POST['auto']."',
               WHERE id='".$id[$a]."'";

               $result = mysql_query( $query) OR die( mysql_error() );
      }
    }
```


----------



## timestamp (15. April 2012)

1.) Formulareingaben immer mit mysql_real_escape_string() bearbeiten, sonst kann man schwere Schäden anrichten.


Deine Schleife führt jetzt $anzahl mal exakt dieselbe Aktion durch.
$id[$a] = $_POST['id'] ist ein wenig Sinnfrei, weil du so ein Array mit $anzahl Einträgen erstellst, wobei jedes Feld denselben Eintrag hat (nämlich $_POST['id']).

Was steht denn in $_POST['id']?


----------



## jannicars (15. April 2012)

Ich kann dir bei sowas nur von einer Schleife abraten.
Lahmt bei mehreren 1.000 Updates in einer Schleife extremst, so läuft es bei mir perfekt in einem einzigen Query:


```
INSERT INTO fahrzeuge (id, ertsteller, auto) VALUES
(1, 'a', 'b'),
(2, 'c', 'd'),
(3, 'e', 'f')
ON DUPLICATE KEY UPDATE ersteller=VALUES(ersteller), auto=VALUES(auto)
```

Aber aufpassen, wenn die ID nicht vorhanden ist, macht er ein INSERT.
Nur bei einer vorhandenen ID macht er ein UPDATE.


----------



## syntax (16. April 2012)

Hallo Leute,
erstmal Danke für eure Hilfe.
Habe nochmal meinen Quelltext überarbeitet.

In $_POST['id'] steht die ID des Datensatzes.

Das mit dem Insert ändere ich wenn das Script geht, sonst bau ich mir vielleicht zu viele Fehler ein.


```
<?php
 error_reporting(E_ALL);

 while ($data = mysql_fetch_array( $result ) )
    {
 echo <<<HTML
    <form action={$_SERVER['SCRIPT_NAME']} method="post">
    <tr>
    <td>{$abz_data['id']}</td>
    <td>{$abz_data['user']}</td>
    <td>{$abz_data['auto']}</td>
    <tr>
    </form>
HTML;
    }
echo <<<HTML
    <input type="submit" name="update" value="update" >
HTML;

    // Anzahl Datensätze
    $anzahl = mysql_num_rows( $abz_result );

    // Datensatz Ändern
    if(isset($_POST['update'])){

       for ($a = 0; $a < $anzahl; $a++) {

               $query = "UPDATE fahrzeuge SET
               ersteller='".mysql_real_escape_string($_SESSION['user'])."',
               auto ='".mysql_real_escape_string($_POST['auto'])."',
               WHERE id='".mysql_real_escape_string($_POST['id'])."'";

               $result = mysql_query( $query) OR die( mysql_error() );
      }
    }
?>
```

Es scheint ja auch zu gehen da der erste Datensatz immer aktualisiert wird.


----------



## grillfleisch (16. April 2012)

Bist du dir sicher, dass das Script bei dir einwandfrei läuft?

versuche mal das:

```
<?php
error_reporting(E_ALL);

     echo "<form action={$_SERVER['SCRIPT_NAME']} method=\"post\">";
    
 while ($data = mysql_fetch_array($result)) {
   echo "
        <tr>
          <td>{$data['id']}</td>
          <td>{$data['user']}</td>
          <td>{$data['auto']}</td>
        <tr>";
  }
  
  echo "<input type=\"submit\" name=\"update\" value=\"update\" >";

    // Anzahl Datensätze
    $anzahl = mysql_num_rows( $result );

    // Datensatz Ändern
    if(isset($_POST['update'])){

       for ($a = 1; $a < $anzahl; $a++) {

               $query = "UPDATE `fahrzeuge` SET
               `ersteller`='".mysql_real_escape_string($_SESSION['user'])."',
               `auto` ='".mysql_real_escape_string($_POST['auto'])."',
               WHERE `id`='".$_POST['id']."'";

               $result = mysql_query($query);
               mysql_error();
      }
    }
?>
```


----------



## syntax (16. April 2012)

Hab es oben nochmal geändert. 
Wie gesagt er updatet den ersten Datensatz die anderen werden ignoriert und ich bekomme auch keine Fehler ausgegeben.

Habe es auch mir $a = 1 probiert.


----------



## grillfleisch (16. April 2012)

Sind die IDs zufällig 1,2,3,4,5.... bis Anzahl der Datensätze, oder sind da Lücken dazwischen? Wenn keine Lücken dazwischen sind, dann ändere mal 
	
	
	



```
`id`='".$_POST['id']."'
```
 auf  
	
	
	



```
`id`='".$a."'
```
 , sonst benutzt er doch immer nur eine ID.


----------



## timestamp (16. April 2012)

grillfleisch hat gesagt.:


> sonst benutzt er doch immer nur eine ID.



Das ist das was ich anfangs schon sagte.


----------



## grillfleisch (16. April 2012)

timestamp hat gesagt.:


> Das ist das was ich anfangs schon sagte.



jetzt sehe ich es auch, sorry


----------



## syntax (18. April 2012)

Hallo Leute,
habs jetzt hinbekommen. Mein letztes Problem ist das wenn ich die Datensätze update, ich die Seite aktualisieren muss damit ich den aktuellen eintrag sehe.

Wie kann ich nach dem Update die Datensätze neu auslesen?
Muss ich dazu eine Schleife bauen?

Ich habe gelesen das ich meine Update-Anweisung über mein SQL-Select setzen soll, das hat allerdings nicht geklappt.


```
<?php
include("connect.php");
?>

    <table>

    <?

    $result = mysql_query ("SELECT id, auto FROM fahrzeuge" );

    $count=mysql_num_rows($result);

    while ( $data = mysql_fetch_array( $result ) ){
    ?>
    <form action="<? $_SERVER['SCRIPT_NAME'] ?>" method="post">
    <tr>
    <td><? $id[]=$data['id']; ?><? echo $data['id']; ?></td>
    <td><input type="text" name="auto[]" id="auto" value="<? echo $data['auto']; ?>"></td>
    </tr>
      <?php
      }
      ?>
      <tr>
      <td><input type="submit" name="update" value="update"></td>
      </tr>
      </table>
      </form>
      <?
          if(isset($_POST['update'])){
          for($i=0;$i<$count;$i++){
          mysql_query("UPDATE fahrzeuge SET
          auto='$auto[$i]' WHERE id='$id[$i]'");
          }
          }
      ?>
```


----------



## jannicars (18. April 2012)

Erst Updaten dann Auslesen?


----------



## syntax (18. April 2012)

Wie gesagt das hab ich schon probiert, dann schreibt er aber keine Daten in die DB.
Wahrscheinlich weil ich bei 


```
auto='$auto[$i]'
```

Kein Post habe, aber wie schreib ich das POST?

Diese Variante ist Falsch.

```
auto='$_POST[$auto[$i]]'
```


----------



## grillfleisch (18. April 2012)

1. Updaten wenn update gesetzt wurde. 

Das kommt an den Anfang


```
<?php
include("connect.php");

  if(isset($_POST['update'])){
    for($i=0;$i<$count;$i++){
      mysql_query("UPDATE fahrzeuge SET auto='$auto[$i]' WHERE id='$id[$i]'");
    }
  }
?>
<table>
...
```

dann würde ich dir empfehlen, wie vor mir schon einer, deine Datensätze zu entschärfen!

```
mysql_real_escape_string()
```


Mit $_POST bekommst du deine Daten.


```
if(isset($_POST['update'])){
    for($i=0;$i<$count;$i++){
      mysql_query("UPDATE fahrzeuge SET auto='mysql_real_escape_string($_POST['auto'])' WHERE id='$i'");
   }
  }
```

du wirst aber keine Daten bekommen. Da in deinem Formular auch was nicht stimmt. 
Änder bitte den input namen auf "auto"


```
name="auto"
```

ohne []


----------



## grillfleisch (18. April 2012)

Hier nochmal eine zusammenfassung. 

Bring mal bitte ein wenig Ordung in deinen Code. Der ist ziemlich fehlerhaft. Schon allein deine Tabellen und Formular Syntax. 


```
<?php
include("connect.php");

  $result = mysql_query ("SELECT id, auto FROM fahrzeuge" );
  $count = mysql_num_rows($result);
  
      
   if(isset($_POST['update'])){
    for($i=0; $i<$count; $i++){
      mysql_query("UPDATE `fahrzeuge` SET `auto`='".mysql_real_escape_string($_POST['auto'])."' WHERE `id`='".$i."' ");
   }
  }
?>
  <form action="<? $_SERVER['SCRIPT_NAME'] ?>" method="post">
    <table>
    
    <?
    while ( $data = mysql_fetch_array( $result ) ){
    ?>
      <tr>
        <td><? $id[]=$data['id']; ?><? echo $data['id']; ?></td>
        <td><input type="text" name="auto" id="auto" value="<? echo $data['auto']; ?>"></td>
      </tr>
      <?php
      }
      ?>
      <tr>
        <td><input type="submit" name="update" value="update"></td>
      </tr>
    </table>
  </form>
```


----------

