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