我正在尝试在previousrecords
表中更新,该表具有来自prisoner
表的priser_id外键。囚犯可以有多个以前的记录
这是我之前的记录设计表:
update.php
<?php
include "connect.php";
$idd =$_GET['id'];
$previous = $connect->query("SELECT * FROM previousrecords
INNER JOIN prisoner ON prisoner.prisoner_id = previousrecords.prisoner_id
WHERE previousrecords.prisoner_id = $idd") or die($connect->error);
$rows3 = $previous->fetch_all(MYSQLI_ASSOC);
if(isset($_POST['update'])){
$p_ID = mysqli_real_escape_string($connect, $_POST['p_id']);
$p_recordd = mysqli_real_escape_string($connect, $_POST["p_record"]);
$p_triall = mysqli_real_escape_string($connect, $_POST["p_trial"]);
$p_sentencee = mysqli_real_escape_string($connect, $_POST["p_sentence"]);
$p_releasedd = mysqli_real_escape_string($connect, $_POST["p_released"]);
$p_datetransferredd = mysqli_real_escape_string($connect, $_POST["p_datetransferred"]);
$p_jailtransferredd = mysqli_real_escape_string($connect, $_POST["p_jailtransferred"]);
$update_prev = $connect->query("UPDATE previousrecords SET prevrecord = '$p_recordd' ,
prev_trialcourt = '$p_triall' , prev_sentence = '$p_sentencee' , datereleased = '$p_releasedd' ,
datetransferred = '$p_datetransferredd' , jailtransferred = '$p_jailtransferredd'
WHERE prev_id = $p_ID") or die($connect->error);
if($update_prev === TRUE){
echo "Successfully updated!";}
else{
echo "Failed to update";
} }?>
<form method = 'post' enctype='multipart/form-data'>
<?php foreach ($rows3 as $row){
$p_ID = $row['prev_id'];
$p_record = $row['prevrecord'];
$p_trial = $row['prev_trialcourt'];
$p_sentence = $row['prev_sentence'];
$p_released = $row['datereleased'];
$p_datetransferred = $row['datetransferred'];
$p_jailtransferred = $row['jailtransferred'];
echo "
<tr>
<input type = 'hidden' name = 'p_id' value ='$p_ID'></td>
<td><input type = 'text' name = 'p_record' value ='$p_record'></td>
<td><input type = 'text' name = 'p_trial' value ='$p_trial'></td>
<td><input type = 'text' name = 'p_sentence' value ='N/A' readonly></td>
<td><input type = 'date' name = 'p_released' value ='$p_released'></td>
<td><input type = 'date' name = 'p_datetransferred' value ='$p_datetransferred'></td>
<td><input type = 'text' name = 'p_jailtransferred' value ='$p_jailtransferred'></td>
</tr>";
}
?>
</table>
<input type = 'submit' name = 'update' value ='Save Changes'>
</form>
以下是我的价值观:
如果我在prev_id 1中将prisoner_id 1的prev_record更新为虐待儿童,则没有任何反应,只有更新适用于具有相同的prisoner_id的最后一行,即prev_id 2
我希望我的桌子看起来像这样
我认为问题在于我的WHERE子句。什么应该在我的WHERE子句中?
请原谅我的代码。这仅适用于我的学校项目,这些代码是我们所教授的。我将研究如何避免SQL注入并尽快应用
答案 0 :(得分:1)
我注意到了一些必要的东西:首先调用连接和数据来显示,然后使用if ... update子句...所以即使你试图改变值,你首先从数据库中获取显示值然后更改数据库...所以你无论如何都会显示旧数据。刷新会带来新数据。
另一个错误的是,如果一个囚犯有几个条目,它们都以一种形式显示,并且总是具有相同的表格字段名称。每个循环应该在表单之外,因此您可以为每个要更改的条目创建一个表单。
目前您的方式,当表单发送时,可以有4或5 $ _POST [&#39; p_id&#39;],$ _POST [&#34; p_record&#34;],等等...所以很可能第一个被忽略,最后一个条目将在DB中更新。 (如果你按照我的提法检查查询),你可能会看到这个问题。 你的where子句似乎没有错误,但在HTML代码中,每个囚犯的条目只设置一个表单而不是一个表单......
我真的建议您检查数据库查询的查询和结果。制作一种日志,完全打印出这些查询。复制查询,并检查phpmyadmin,如果它给你你期望的结果,或错误。在一个具体的例子。如果结果有误,请重新检查您的查询。如果结果正确,请重新检查代码。这是数据库调用的经典调试情况,你会注意到我在这里告诉你的相同的事情,有些事情是非常错误的,对于数据库查询更少,但更多的是你的代码的安全性。
答案 1 :(得分:0)
您的代码中有两个MySQL操作。
这是第一个。
$previous = $connect->query("SELECT * FROM something
WHERE something = $idd") or die($connect->error);
$rows3 = $previous->fetch_all(MYSQLI_ASSOC);
这是第二次。
$update_prev = $connect->query("UPDATE previousrecords SET something=something...
WHERE $p_ID = something") or die($connect->error);
问题是,你运行第一个操作之前你运行第二个操作。因此,您使用
呈现给网页的信息 <?php foreach ($rows3 as $row){
$p_ID = $row['prev_id']; ...
显示更新前 表格的状态。因此,看起来更新并不起作用。但它可能确实如此。
在更新后运行SELECT。
答案 2 :(得分:-1)
更方便您使用bind_param
示例:
$product_name = '52 inch TV';
$product_code = '9879798';
$find_id = 1;
$statement = $mysqli->prepare("UPDATE products SET product_name=?, product_code=? WHERE ID=?");
//bind parameters for markers, where (s = string, i = integer, d = double, b = blob)
$statement->bind_param('ssi', $product_name, $product_code, $find_id);
$results = $statement->execute();
if($results){
print 'Success! record updated';
}else{
print 'Error : ('. $mysqli->errno .') '. $mysqli->error;
}
请阅读文档