我正在尝试更新我的 previousrecords
表的外键为 prisoner
table。一个囚犯可以有多个前科
这是我以前的设计表:
更新.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\u id 1中将囚犯id 1的prev\u记录更新为虐待儿童,则不会发生任何情况,只会在具有相同囚犯id(prev\u id 2)的最后一行进行更新
我希望我的table看起来像这样
我想问题出在我的where子句上。我的where子句应该是什么?
请原谅我的密码。这只是为了我的学校项目,这些代码是教给我们的。我将研究如何避免sql注入并很快应用它
3条答案
按热度按时间7rtdyuoh1#
我注意到了一些重要的东西:首先调用要显示的连接和数据,然后使用if。。。update子句。。。因此,即使您尝试更改值,也要先从数据库中获取显示值,然后更改数据库。。。所以你还是要显示旧数据。不过,刷新一下就会显示新数据。
另一件同样错误的事情是,如果一个囚犯有几个条目,它们都以一种形式显示,并且总是具有相同的表单字段名。for each循环应该在表单的外部,以便为每个要更改的条目创建一个表单。
按目前的方式,发送表单时,可以有4或5$个post['p\u id']、$个post[“p\u record”]等。。。所以最有可能的是,第一个条目会被忽略,最后一个条目会在数据库中更新(如果你像我提到的那样检查查询,你可能已经看到了这个问题。在where子句中似乎没有错误,但是在html代码中,它只为每个囚犯的条目设置了一个窗体而不是一个窗体。。。
我真的建议您检查您的db查询的查询和结果。制作一种日志,在其中完整地打印出这些查询。复制查询,并签入phpmyadmin(如果它提供了预期的结果或错误)。一个具体的例子。如果结果错误,请重新检查您的查询。如果结果正确,请重新检查代码。这是db调用的典型调试情况,您可能会注意到我在这里告诉您的同样的事情,有些地方非常错误,db查询的错误更少,但代码的连续性更大。
h43kikqp2#
为了更简单,您可以使用bind\u param
例子:
请阅读文档
bnl4lu3b3#
代码中有两个mysql操作。
这是第一次。
这是第二个。
问题是,你在做第二次手术之前先做第一次手术。因此,您使用
显示更新前表的状态。因此,看起来更新不起作用。但很可能是这样。
更新后运行select。