簡體   English   中英

PHP MySQL更新只更新一行

[英]PHP MySQL update only updating one row

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

    <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>

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

希望有所幫助。

這是因為如果有多個輸入,則所有輸入都具有相同的名稱,因此php無法區分彼此。

如果select 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>

如果id是唯一的,則WHERE id=foo子句將更新限制為單個字段。 但更多與您的PHP相關:您實際上是在循環之前設置$id$fname$lname ,因此如果循環運行多次, UPDATE行將使用“舊值”。 類似地,您實際上沒有將UPDATE查詢放入循環中,因此最多將變量設置一次,循環將運行幾次(可能),然后查詢僅運行一次。

代碼按順序運行; 你需要更具體地將代碼放在你想要它運行的地方。

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

當您回顯多個輸入字段時,您可能希望將它們聲明為數組元素。

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

並在$ _POST上迭代每一個。

聽起來好像要顯示表的內容,讓用戶編輯它。

有一些非常好的工具可以幫到你,比如jqGrid。

http://www.trirand.net/demophp.aspx點擊jqGrid頁面左側的編輯鏈接

該組件將負責所有顯示和編輯。 它甚至向您展示了如何在后端實現PHP。

很抱歉帶來舊帖子,但我有同樣的問題,只是找到了修復程序。 出現此問題是因為表單屬性和提交屬性不包含在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>";
}

我認為你誤解了循環的工作。 實際上,您從表中輸出多行作為輸入字段組,但在提交后只能更新一行。 如果要更新多行,則需要多個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解釋器。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM