Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 更新时记录未被更改。什么';我的WHERE子句有什么问题?_Php_Mysql - Fatal编程技术网

Php 更新时记录未被更改。什么';我的WHERE子句有什么问题?

Php 更新时记录未被更改。什么';我的WHERE子句有什么问题?,php,mysql,Php,Mysql,我正在尝试更新我的previousrecords表,该表的外键为captier表中的囚犯id。囚犯可以有多个以前的记录 这是我以前的设计表: update.php <?php include "connect.php"; $idd =$_GET['id']; $previous = $connect->query("SELECT * FROM previousrecords INNER JOIN prisoner ON prisoner.prisoner_id = prev

我正在尝试更新我的
previousrecords
表,该表的外键为
captier
表中的囚犯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>

更方便您使用

例如:

$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;
}

请阅读文档

您的代码中有两个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']; ...

我注意到了一些重要的事情:首先调用join和要显示的数据,然后使用if。。。更新子句。。。因此,即使您尝试更改值,也要先从数据库中获取显示值,然后更改数据库。。。因此,您将显示旧数据。不过,刷新会显示新数据

另一件同样错误的事情是,如果一个囚犯有几个条目,它们都以一种形式显示,并且总是使用相同的表单字段名。for each循环应该在表单外部,因此您可以为每个要更改的条目创建一个表单

按照目前的方式,当表单发送时,可以有4或5$u POST['p_id']、$u POST['p_record]等。。。因此,最有可能的是,第一个条目将被忽略,只有最后一个条目将在数据库中更新。(如果你检查一下我提到的问题)你可能已经看到了这个问题。 在where子句中似乎没有错误,但在HTML代码中,它只为每个囚犯的条目设置了一个表单,而不是一个表单


我真的建议您检查DB查询的查询和结果。制作一种日志,将这些查询完全打印出来。复制查询,并检入phpmyadmin,以确定它是否提供了预期的结果或错误。关于一个具体的例子。如果结果错误,请重新检查您的查询。如果结果正确,请重新检查代码。这是DB调用的经典调试情况,您可能会注意到我在这里告诉您的同样的事情,有些事情非常错误,DB查询的错误更少,但代码的顺序更严重。

最好避免使用图像来表示问题的重要部分。为什么?一方面,图像无法搜索,使得其他人更难从你的问题中获益。另一方面,有时回答问题的人喜欢尝试在他们自己的机器上或在或中运行您的查询。文本缩进四个空格,是表示代码和数据的好方法。变量
$row3
集在哪里?更新表后,您需要重新运行任何查询集
$row3
,以查看更新结果。我已编辑了我的问题@O.JonesI建议以下内容用于此调试和将来的调试:检查它是语句中的错误还是php代码中的错误:首先定义查询变量,echo(或log)然后直接在db上运行sql语句:$query='SELECT blabla form blabla…';echo$query;//(或log($query),如果您有log和log方法)$statement->execute($query);然后在前端进行测试,复制并粘贴生成的sql语句,进入phpmyadmin,并在sql字段中运行这些语句。像这样,您可以看到查询本身或查询中的值是否有问题…@CaneloDigital我签入了phpMyAdmin,如果值已更改,但没有任何更改。我试图删除WHERE子句,它已更改,但所有行都具有相同的值,即使我只更新了一行。如果进行了更改,我始终检查我的phpMyAdmin,但仍然没有任何内容@O。Jones如果我更新prev_id 1中的行,我的prev_id是自动递增的。我获取forearch循环中每一行的prev_id值并在WHERE子句中使用它,这是错误的吗?我已将WHERE子句更改为$p_id=prev_id。更新只在每个相同的forearch id中的最后一行起作用。为什么?谢谢!我已经修好了:)