2012-03-27 140 views
3

我已經設置了一個更新查詢,它將更新在while循環中輸入到文本字段中的值。這工作正常,直到多個數據從數據庫循環。然後出於某種原因,只有循環中的最後一個數據會被更新,其餘的將保持不變。PHP MySQL更新只更新一行

<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

您的更新不在循環中,爲什​​麼它應該更新多次? – j08691 2012-03-27 23:11:48

回答

1

這是因爲如果有一個以上所有的輸入具有相同的名稱,所以PHP不能從一個到另一個區分。

如果您選擇MySQL查詢生成超過1行,那麼你需要給每個ID輸入一個不同的名稱,每個FNAME輸入一個不同的名稱,每個LNAME輸入一個不同的名稱。

<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是一個數組。並且$_POST通過所用表單中輸入字段的名稱獲取其元素。所以你總是覆蓋條目。如果你想有多個更新,你必須寫一個循環(見註釋)。並將下面的代碼用於輸入字段。

嘗試:

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'] . " />"; 

希望有所幫助。

1

如果id是唯一的,那麼WHERE id=foo條款將限制更新的單個字段。但更關係到你的PHP:你實際上是設置$id$fname$lname在循環之前,使UPDATE線是使用「舊值」如果循環運行一次以上。同樣,你實際上沒有將UPDATE查詢放入循環中,所以最多隻能設置一次變量,循環將運行幾次(可能),然後查詢只運行一次。

該代碼按順序運行;你必須更具體地把代碼,其中你想運行。

1

您正在更新while循環之外的列表表格。其中將包含上次選擇的值(在第7行)。

正如你echo'ing出來你可能想聲明這些作爲數組元素的多重輸入字段。

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

並重復每一個$ _POST。

1

聽起來像是你想顯示一個表中的內容,並讓用戶編輯它。

有一些非常好的工具,在那裏會爲你做的,喜歡的jqGrid。

http://www.trirand.net/demophp.aspx 點擊有關編輯在jqGrid的頁面

組件的左邊的鏈接將採取所有的顯示和編輯的照顧。它甚至向你展示瞭如何在後端實現PHP。

0

我認爲你誤解了循環的作品。 事實上,您從表中輸出多行作爲輸入字段組,但您在提交後只更新一行。如果你想更新多行,你需要多個ID(即你想更新的每行一個)

你的瀏覽器顯然選擇http-post提交你的id,fname和lname的最後一個實例在html表單中的輸入字段,這些是您的$ _POST字段在接收到http post請求時將包含的字段。

在一種形式中具有多個具有相同名稱的輸入通常是一個壞主意,如果選擇表中多於一行的行,這將發生在這裏。

你可能要考慮:

  • 有一種形式(包括提交按鈕)每行。這樣,您的瀏覽器就可以根據每個表單來了解它應提交的唯一可識別的輸入字段值。

  • 如果你想要一個多行編輯表單,那麼有很多技巧來實現這一點。最簡單的可能是一個命名約定,如第42個fname輸入字段的fname_42,以及包含表單顯示的行數的表單中的一個隱藏字段。在處理提交請求時,您可以通過計算最多行數來重新構建輸入名稱。

例如:

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

PS:請不要怪我,如果這個例子並不完全是語法正確;)我沒有跟我一個PHP解釋現在。

0

對不起,把舊的帖子,但我有同樣的問題,只是找到了修復。 發生此問題的原因是表單屬性和提交屬性未包含在php代碼中,而是作爲html外部的循環保留。當提交在while語句內時,每行都有自己的提交,並且更改只會影響該行。工作代碼在下面;

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>"; 
}