2012-03-27 22 views
3

Ich habe eine Update-Abfrage eingerichtet, die Werte aktualisiert in Textfelder in einer while-Schleife eingegeben. Dies funktioniert gut, bis mehrere Daten von der Datenbank geloopt werden. Dann werden aus irgendeinem Grund nur die letzten Daten in der Schleife aktualisiert und der Rest bleibt gleich.PHP MySQL Update nur eine Zeile aktualisieren

<form method="post" action="update.php"> 
    <?php 
    $id = $_POST["id"]; 
    $fname = $_POST["fname"]; 
    $lname = $_POST["lname"]; 

    $query= "SELECT * FROM list ORDER BY id ASC" ; 
    $result= mysql_query($query); 
    while($row = mysql_fetch_assoc($result)){ 
    echo"<input type=\"hidden\" name=\"id\" value=" . $row['id'] . " />"; 
    echo"<input type=\"text\" name=\"fname\" value=" . $row['fname'] . " />"; 
    echo"<input type=\"text\" name=\"lname\" value=" . $row['lname'] . " />"; 
} 
?> 
    <input type="submit" value="Save Changes" /> 

<?php 
$sql = "UPDATE list SET fname = '{$fname}', lname = '{$lname}' WHERE id = {$id}"; 

    $result = mysql_query($sql); 
?> 
</form> 
+2

Ihr Update ist nicht in einer Schleife, warum sollte es mehr als einmal aktualisieren? – j08691

Antwort

1

Dies ist, weil alle Ihre Eingaben den gleichen Namen haben, wenn es mehrere gibt, so kann PHP nicht von einem zum anderen unterscheiden.

Wenn mehr als 1 Zeile aus Ihrer ausgewählten mysql-Abfrage generiert wird, müssen Sie jedem ID-Eingang einen anderen Namen geben, jeder fname einen anderen Namen eingeben und jeder lname einen anderen Namen eingeben.

<form method="post" action="update.php"> 
    <?php 
    $id = $_POST["id"]; 
    $fname = $_POST["fname"]; 
    $lname = $_POST["lname"]; 

    $query= "SELECT * FROM list ORDER BY id ASC" ; 
    $result= mysql_query($query); 
    while($row = mysql_fetch_assoc($result)){ 
     echo"<input type=\"hidden\" name=\"id[]\" value=" . $row['id'] . " />"; 
     echo"<input type=\"text\" name=\"fname[]\" value=" . $row['fname'] . " />"; 
     echo"<input type=\"text\" name=\"lname[]\" value=" . $row['lname'] . " />"; 
    } 
    ?> 
    <input type="submit" value="Save Changes" /> 

    <?php 
    $sql = "UPDATE list SET fname = '{$fname}', lname = '{$lname}' WHERE id = {$id}"; 

    $result = mysql_query($sql); 
    ?> 
</form> 
2

$_POST ist ein Array zu. Und $_POST erhalten seine Elemente mit dem Namen der Eingabefelder in der Form verwendet. Sie überschreiben also immer die Einträge. Wenn Sie mehrere Updates haben möchten, müssen Sie eine Schleife schreiben (siehe Kommentare). Und verwenden Sie diesen Code für die Eingabefelder.

Versuchen:

echo"<input type=\"hidden\" name=\"id[]\" value=" . $row['id'] . " />"; 
    echo"<input type=\"text\" name=\"fname[]\" value=" . $row['fname'] . " />"; 
    echo"<input type=\"text\" name=\"lname[]\" value=" . $row['lname'] . " />"; 

Hoffnung, das hilft.

1

Wenn id einzigartig ist, dann ist die WHERE id=foo Klausel, die Updates zu einem einzigen Feld beschränken. Aber mehr im Zusammenhang mit Ihrem PHP: Sie setzen tatsächlich $id, $fname und $lname vor der Schleife, so dass UPDATE Zeile "alte Werte" verwendet, wenn die Schleife mehr als einmal ausgeführt wird. Ebenso haben Sie die Abfrage nicht wirklich in die Schleife eingefügt, so dass die Variablen höchstens einmal gesetzt werden, die Schleife wird einige Male ausgeführt (möglicherweise) und dann wird die Abfrage nur einmal ausgeführt.

Der Code wird in der richtigen Reihenfolge ausgeführt. Sie müssen spezifischer mit dem Setzen des Codes sein, wo Sie es ausführen möchten.

1

Ihre Aktualisierung der Listentabelle außerhalb Ihrer while-Schleife. Welche enthält die Werte, die zuletzt ausgewählt wurden (in Zeile 7).

Wenn Sie mehrere Eingabefelder aushoben, können Sie diese als Array-Elemente deklarieren.

echo"<input type=\"text\" name=\"lname[]\" value=" . $row['lname'] . " />"; 

Und iterieren Sie jedes über $ _POST.

1

Klingt so, als ob Sie den Inhalt einer Tabelle anzeigen und vom Benutzer bearbeiten lassen möchten.

Es gibt einige wirklich nette Werkzeuge da draußen, die das für Sie tun werden, wie jqGrid.

http://www.trirand.net/demophp.aspx Klicken Sie auf den Link zum Bearbeiten auf der linken Seite der jqGrid Seite

Die Komponente wird aller Anzeige und Bearbeitung kümmern. Es zeigt Ihnen sogar, wie Sie PHP am Backend implementieren.

0

Ich denke, dass Sie die Arbeiten der Schleife falsch interpretieren. Tatsächlich geben Sie mehrere Zeilen aus Ihrer Tabelle als Gruppen von Eingabefeldern aus, aber Sie aktualisieren nur eine Zeile nach dem Senden.Wenn Sie mehrere Zeilen aktualisieren möchten, benötigen Sie mehrere IDs (nämlich einen für jede Zeile, die Sie aktualisieren möchten)

Ihr Browser scheint anscheinend zu http-post senden die letzten Instanzen Ihrer ID, FName und Lname Eingabefelder, die sich im HTML-Format befinden, und diejenigen, die Ihre $ _POST-Felder enthalten, wenn Sie diese http-Post-Anfrage erhalten.

Es ist generell eine schlechte Idee, mehrere Eingänge mit demselben Namen in einem Formular zu haben, was hier passiert, wenn mehr als eine Zeile aus der Tabelle ausgewählt wird.

Sie könnten in Betracht ziehen:

  • mit einer Form (einschließlich Submit-Button) pro Zeile. Auf diese Weise weiß Ihr Browser auf einer Formularbasis, welche eindeutig identifizierbaren Eingabefeldwerte er übermitteln sollte.

  • Wenn Sie ein mehrzeiliges Bearbeitungsformular wünschen, dann gibt es viele Tricks, um dies zu erreichen. Am einfachsten wäre wahrscheinlich eine Namenskonvention wie fname_42 für das 42. fname-Eingabefeld und ein verstecktes Feld im Formular, das die Zeilenanzahl enthält, die Ihr Formular anzeigt. Wenn Sie die Übermittlungsanforderung bearbeiten, können Sie die Namen der Eingaben rekonstruieren, indem Sie bis zur Gesamtzahl der Zeilen zählen.

Beispiel:

for ($i=0;$i<$_POST["row_count"];$i++) { 
    $fname = $_POST["fname_$i"]; 
    //use $fname here in an update query 
    } 

PS: mir bitte nicht die Schuld, wenn dieses Beispiel nicht vollständig syntaktisch korrekt ist;) Ich mit mir nicht Recht, einen PHP-Interpreter jetzt haben.

0

Entschuldigung für die alte Post, aber ich hatte das gleiche Problem und nur die Lösung gefunden. Das Problem tritt auf, weil die Formulareigenschaften und Übermittlungseigenschaften nicht als PHP-Code enthalten sind, sondern als HTML außerhalb der Schleife beibehalten werden. Wenn sich die Übergabe innerhalb der while-Anweisung befindet, hat jede Zeile ihre eigene Übergabe, und die Änderung wirkt sich nur auf diese Zeile aus. Der Arbeitscode ist unten;

if(isset($_POST['update'])){  
    $sql = "UPDATE Persons SET fname = '$_POST[fname]', lname = '$_POST[lname]' WHERE id = '$_POST[id]'"; 
mysql_query($sql); 
}; 

    $query= "SELECT * FROM Persons ORDER BY id ASC" ; 
    $result= mysql_query($query); 
    while($record = mysql_fetch_assoc($result)) 
    { 
echo"<form method=\"post\" action=\"update.php\">"; 
    echo"<input type=\"hidden\" name=\"id\" value=" . $record['id'] . " />"; 
    echo"<input type=\"text\" name=\"fname\" value=" . $record['fname'] . " />"; 
    echo"<input type=\"text\" name=\"lname\" value=" . $record['lname'] . " />"; 
    echo"<input type=\"submit\" name=\"update\" value=\"Save Changes\" />"; 
    echo"</form>"; 
}