PHP和SQL按指定行更新表

PHP和SQL按指定行更新表,php,html,mysql,Php,Html,Mysql,我有一个从数据库中提取信息的表,每行的最后一列是一个输入标记,标记为“完成”,用户可以单击。我希望能够单击标记并让它更新我的数据库,以更改布尔字段,该字段将从0更改为1。现在,如果我按错了顺序,我似乎无法更新这些行。因此,如果我单击更新第一行,然后单击下面的几行,它将更新第二行。如果您两次单击该行的按钮,它将更新您想要的任何行,但首先它将更新您先前停止的行 <form action='' method='POST'> <?php $current_date = dat

我有一个从数据库中提取信息的表,每行的最后一列是一个输入标记,标记为“完成”,用户可以单击。我希望能够单击标记并让它更新我的数据库,以更改布尔字段,该字段将从0更改为1。现在,如果我按错了顺序,我似乎无法更新这些行。因此,如果我单击更新第一行,然后单击下面的几行,它将更新第二行。如果您两次单击该行的按钮,它将更新您想要的任何行,但首先它将更新您先前停止的行

<form action='' method='POST'>
<?php

    $current_date = date("Y-m-d");
    $n = 1;
    $sql = "SELECT id, date, pname, details, time, tech FROM task WHERE task='LAB' AND complete=0 ORDER BY date DESC";
    $result = $link->query($sql);

    echo $current_date;

    echo "<table>
                <tr>
                    <th>Date</th>
                    <th>Project</th>
                    <th>Details</th>
                    <th>Start Time</th>
                    <th>Technician</th>
                </tr>";

    while ($row = $result->fetch_assoc()) {
        echo "<tr align='center'><td>" .$row["date"]. "</td><td>" .$row["pname"]. "</td><td>" 
        .$row["details"]. "</td><td>" .$row["time"]. "</td><td>" .$row["tech"]. "</td>
        <td><input type='submit' name=".$n." value='Complete' /></td></tr>";

        if (isset($_POST[$n])) {
            $id = $row["id"];
            $update = "UPDATE task SET complete = 1 WHERE task='LAB' AND id = ".$id."";
            echo $update;
            $update_result = $link->query($update);
        }
        $n++;
    }
    echo "</table>";

    $link->close();
?>

</form>


我注意到的一件事是你做得不恰当


答复: 您可以尝试为每行放入
表单
,然后使用隐藏输入字段存储
id

while ($row = $result->fetch_assoc()) {
    echo '<tr align="center">
              <td>'.$row["date"].'</td>
              <td>'.$row["pname"].'</td>
              <td>'.$row["details"].'</td>
              <td>'.$row["time"].'</td>
              <td>'.$row["tech"].'</td>
              <td>
                  <form action="" method="POST">
                      <input type="hidden" name="id" value="'.$row["id"].'">
                      <input type="submit" name="complete" value="Complete"/>
                  </form>
              </td>
          </tr>';
}

第二种选择: 您可以尝试使用进行无缝交易:

while ($row = $result->fetch_assoc()) {
    echo '<tr align="center">
              <td>'.$row["date"].'</td>
              <td>'.$row["pname"].'</td>
              <td>'.$row["details"].'</td>
              <td>'.$row["time"].'</td>
              <td>'.$row["tech"].'</td>
              <td>
                  <a href="#" class="btn" type="button" data-artid="'.$row["id"].'">Complete</a>
              </td>
          </tr>';
}

那么,为什么不准确地使用每行的
id
?那么针对sql注入的安全性呢?您应该真正致力于将显示逻辑从业务逻辑中分离出来。我几乎可以保证它会帮你解决这个问题。如果你删除
echo$update?警告:使用
mysqli
时,应使用和将用户数据添加到查询中。不要使用字符串插值或串联来完成此操作,因为您已经创建了严重的错误。永远不要将
$\u POST
$\u GET
或任何用户数据直接放入查询中,如果有人试图利用您的错误,这可能会非常有害。我真的不明白选择的意义。谢谢!尝试了第一个选项,它成功了。杰出的
while ($row = $result->fetch_assoc()) {
    echo '<tr align="center">
              <td>'.$row["date"].'</td>
              <td>'.$row["pname"].'</td>
              <td>'.$row["details"].'</td>
              <td>'.$row["time"].'</td>
              <td>'.$row["tech"].'</td>
              <td>
                  <a href="#" class="btn" type="button" data-artid="'.$row["id"].'">Complete</a>
              </td>
          </tr>';
}
<script>
    $(document).ready(function(){ /* PREPARE THE SCRIPT */
        $(".btn").click(function(){ /* WHEN COMPLETE BUTTON IS CLICKED */

            var elem = $(this),
                id = elem.attr('data-artid'); /* GET THE ID OF THE CLICKED ELEMENT */

            $.ajax({ /* PROCESS AJAX */
                url: "process.php", /* THE FILE WHERE THE FORM WILL BE PROCESSED */
                type: "POST", /* METHOD TO BE USED */
                data: {"id":id}, /* THE DATA TO BE PASSED TO process.php */
                dataType: 'json', /* TYPE OF DATA TO BE RETURNED */
                success: function(result){ /* IF process.php IS SUCCESSFUL */
                    if(result.boolean){
                        elem.closest('tr').remove(); /* REMOVE THE ENTIRE ROW */
                    }
                }
            });
            return false; /* THIS WILL PREVENT FROM SCROLLING TO THE TOP OF THE PAGE */
        });
    });
</script>
/** INCLUDE HERE SOMEWHERE YOUR DATABASE CONNECTION **/
$boolean = false; /** DEFAULT VALUE TO BE RETURNED **/

if(!empty($_POST["id"])){
    $id = $_POST["id"];
    $stmt = $link->prepare("UPDATE task SET complete = 1 WHERE task='LAB' AND id = ?");
    $stmt->bind_param("i", $id);
    $stmt->execute();
    $stmt->close();
    $boolean = true;
} 

echo json_encode(array('boolean' => $boolean)); /* THIS WILL BE RETURNED TO THE AJAX REQUEST */