【问题标题】:PHP/MYSQL: A removed row is still displayed in my page after a reloadPHP/MYSQL:重新加载后,我的页面中仍显示已删除的行
【发布时间】:2015-04-17 11:26:39
【问题描述】:

我在 Raspberry Pi 上的一个简单网络服务器上工作,显示一个带有两个按钮的 MySQL 表:一个(切换)用于反转布尔值,一个(删除)用于从表中删除整行。

基本上,我所做的是在 MySQL 表上进行 while 循环,其中我:1:在表单中显示行和按钮,2:检查按钮是否被点击,如果是,我发送查询数据库并重新加载页面。

我的问题很简单:当我单击“切换”按钮时,发送查询并刷新页面,并且正确修改了值(页面显示数据库中的值)。但是当我点击另一个按钮时,“删除”一个,在页面重新加载后,该行仍然出现在表格中。只有当我手动重新加载页面时,该行才会消失。

我已经尝试过的: 1:在手动刷新之前检查该行是否已从数据库中删除:DONE,并且该行已正确删除。 2:MySQL查询后等待500ms,然后重新加载页面:DONE,即使我等待500ms,当页面重新加载时仍然有删除的行。

这是整个代码,MySQL查询在最后:

<form action="logout.php" method="post">
<input type="submit" name="logout" value="logout">
</form>
<b>Alarm Monitoring</b>

<p>Sensors state table. Clicking on "Switch state" will switch the field "state" of the associated mote. </p>
<p>State 1 means that the mote is active, the alarm will be activated if the mote is moved or if someone is detected.</p>
<p>State 0 means that the mote is inactive, the alarm will NOT be activated if the mote is moved or if someone is detected.</p>


<?php
$servername="localhost";
$username="root";
$password="patate";
$dbname="testbase";
$table="matable";

$conn = new mysqli($servername,$username,$password,$dbname);
if ($conn->connect_error) {
        echo "kaput";
        die("Connection failed: " . $conn->connect_error);
}

$sql="SELECT * FROM $table;";
$result=$conn->query($sql); ?>


<table border=0>
    <tr>
        <td>

                <table border=1>
                    <tr>
                        <td width=150>ID</td>
                        <td width=150>Date</td>                        
                        <td width=300>PIR</td>  
                        <td width=150>Accel</td>
                        <td width=100>State</td>
                        <td width=150>Switch</td>
                        <td width=150>Delete</td>
                    </tr>
         <?php
   while($row = $result->fetch_assoc()) : ?>

                    <tr>
                        <td><?php echo $row['id']; ?></td>
                        <td><?php echo $row['date']; ?></td>
                        <td><?php echo $row['pir']; ?></td>
                        <td><?php echo $row['accel']; ?></td>
                        <td><?php echo $row['state']; ?></td>
                        <form name="form1" method="post" action=''>
                        <td><?php echo "<input name='Switch' type='submit' id='Switch' value='Switch state ".$row['id']."'>"; ?></td>
                        <td><?php echo "<input name='Delete' type='submit' id='Delete' value='Delete mote ".$row['id']."'>"; ?></td>
                        </form>
                    </tr>    
        <?php
if($_REQUEST['Delete']=='Delete mote ' . $row['id']) {
   {
        $sql3="DELETE FROM $table WHERE id=".$row['id'].";";
        $result3=$conn->query($sql3);
        header('Location: table.php');
    }
}

if($_REQUEST['Switch']=='Switch state ' . $row['id']) {
    {
        if($row['state']=='1')
        {
                $sql2="UPDATE $table SET state='0' WHERE id=".$row['id'].";";
        }
        else
        {      
                $sql2="UPDATE $table SET state='1' WHERE id=".$row['id'].";";
        }

        $result2=$conn->query($sql2);
        header('Location: table.php');
    }
}

?>

 <?php endwhile; ?>    
</table>            

</table>
</td>
</tr>
</table>

也许有人以前见过这个问题?

【问题讨论】:

  • 添加查询错误处理:if (!$mysqli-&gt;query($sql)) { printf("Errormessage: %s\n", $mysqli-&gt;error); }
  • 我添加并测试了,但没有显示错误。无论如何,当我单击时,该行已从表中正确删除,我想 MySQL 部分没有错误。
  • 只是在空中抛出另一个想法,它可能是浏览器缓存吗?
  • 可能是浏览器缓存,我想过,但我该怎么办?我可以在代码中清除它,还是强制重新加载?

标签: php html mysql apache2 raspberry-pi


【解决方案1】:

你是否有重定向问题。查看此链接以了解更多关于redirect

在继续之前,请备份您的代码。

要解决您的问题,您必须将 &lt;?php endwhile; ?&gt; 移到后面

</form>
</tr> 

然后在表单名“删除”之后添加隐藏输入

<td>
<?php echo "<input name='Switch' type='submit' id='Switch' value='Switch state ".$row['id']."'>"; ?></td>
<td><?php echo "<input name='Delete' type='submit' id='Delete' value='Delete mote ".$row['id']."'>"; ?></td>
<input name='id' type='hidden' value="<?php echo $row['id']; ?>">
<input name='state' type='hidden' value="<?php echo $row['state']; ?>">

最后一个替换这个:

<?php
if($_REQUEST['Delete']=='Delete mote ' . $row['id']) {
   {
        $sql3="DELETE FROM $table WHERE id=".$row['id'].";";
        $result3=$conn->query($sql3);
        header('Location: table.php');
    }
}

if($_REQUEST['Switch']=='Switch state ' . $row['id']) {
    {
        if($row['state']=='1')
        {
                $sql2="UPDATE $table SET state='0' WHERE id=".$row['id'].";";
        }
        else
        {      
                $sql2="UPDATE $table SET state='1' WHERE id=".$row['id'].";";
        }

        $result2=$conn->query($sql2);
        header('Location: table.php');
    }
}

?>

有了这个

<?php

        if (!empty($_REQUEST['Delete']) && !empty($_REQUEST['id']))
        {
            $sql3="DELETE FROM $table WHERE id=".$_REQUEST['id'].";";
            $result3=$conn->query($sql3);
            echo '<script> location.replace("index.php"); </script>';
        }

        if (!empty($_REQUEST['Switch']) && !empty($_REQUEST['id']) && isset($_REQUEST['state']))
        {
            var_dump($_REQUEST['Switch']);

            if($_REQUEST['state'] == '1')
            {
                    $sql2="UPDATE $table SET state='0' WHERE id=".$_REQUEST['id'].";";
            }
            else
            {      
                    $sql2="UPDATE $table SET state='1' WHERE id=".$_REQUEST['id'].";";
            }

            $result2=$conn->query($sql2);

            echo '<script> location.replace("index.php"); </script>';
        }
    ?>

我不是说这是好的解决方案。但它会解决您的问题,直到您找到最佳解决方案。

【讨论】:

  • 这解决了问题!非常感谢 !我只需要将“index.php”替换为“table.php”,这是所有代码所在的 php 文件的名称。实际上,为了确定问题,我尝试了一个基于你的更简单的解决方案:我刚刚替换了: header('Location: table.php'); with : echo '
【解决方案2】:

删除后,您指示浏览器重新加载页面:

header('Location: table.php');

但是,您无法在开始发送数据后发送 HTTP 标头。您可能会在表格下方某处看到一条错误消息,说明“标头已发送”。

您需要将页面内容的输出移动到上次使用header() 函数修改响应标头之后,或使用output buffering

【讨论】:

  • 什么叫“发送数据”? MySQL 查询?如果是这样,为什么在发送查询后等待 500 毫秒时它不起作用?到目前为止,500 毫秒足以让 MySQL 数据库做出反应……我不明白我应该移动什么,以及移动到哪里。
  • “发送数据”是指将 HTML 输出到浏览器。
【解决方案3】:

只需尝试在删除查询之后但在重定向之前清理结果数组,使用:unset($row); 并通过启动它来清理$result$result='';

修改代码如下,在上面两行和下面两行用 cmets 添加四行:

    <form action="logout.php" method="post">
<input type="submit" name="logout" value="logout">
</form>
<b>Alarm Monitoring</b>

<p>Sensors state table. Clicking on "Switch state" will switch the field "state" of the associated mote. </p>
<p>State 1 means that the mote is active, the alarm will be activated if the mote is moved or if someone is detected.</p>
<p>State 0 means that the mote is inactive, the alarm will NOT be activated if the mote is moved or if someone is detected.</p>


<?php
$servername="localhost";
$username="root";
$password="patate";
$dbname="testbase";
$table="matable";

$conn = new mysqli($servername,$username,$password,$dbname);
if ($conn->connect_error) {
        echo "kaput";
        die("Connection failed: " . $conn->connect_error);
}
$row=array();                     //Initialize the empty array (By shashi).
$result='';                       //Initialize the empty result var (By shashi).

$sql="SELECT * FROM $table;";
$result=$conn->query($sql); ?>


<table border=0>
    <tr>
        <td>

                <table border=1>
                    <tr>
                        <td width=150>ID</td>
                        <td width=150>Date</td>                        
                        <td width=300>PIR</td>  
                        <td width=150>Accel</td>
                        <td width=100>State</td>
                        <td width=150>Switch</td>
                        <td width=150>Delete</td>
                    </tr>
         <?php
   while($row = $result->fetch_assoc()) : ?>

                    <tr>
                        <td><?php echo $row['id']; ?></td>
                        <td><?php echo $row['date']; ?></td>
                        <td><?php echo $row['pir']; ?></td>
                        <td><?php echo $row['accel']; ?></td>
                        <td><?php echo $row['state']; ?></td>
                        <form name="form1" method="post" action=''>
                        <td><?php echo "<input name='Switch' type='submit' id='Switch' value='Switch state ".$row['id']."'>"; ?></td>
                        <td><?php echo "<input name='Delete' type='submit' id='Delete' value='Delete mote ".$row['id']."'>"; ?></td>
                        </form>
                    </tr>    
        <?php
if($_REQUEST['Delete']=='Delete mote ' . $row['id']) {
   {
        $sql3="DELETE FROM $table WHERE id=".$row['id'].";";
        $result3=$conn->query($sql3);
        unset($row);                  //Clear the array (By shashi).
        result='';                    //Clear result Var (By shashi).
        header('Location: table.php');
    }
}

if($_REQUEST['Switch']=='Switch state ' . $row['id']) {
    {
        if($row['state']=='1')
        {
                $sql2="UPDATE $table SET state='0' WHERE id=".$row['id'].";";
        }
        else
        {      
                $sql2="UPDATE $table SET state='1' WHERE id=".$row['id'].";";
        }

        $result2=$conn->query($sql2);
        header('Location: table.php');
    }
}

?>

 <?php endwhile; ?>    
</table>            

</table>
</td>
</tr>
</table>

【讨论】:

  • 我试过了,但没有改变结果。顺便问一下,我重新加载页面时不是所有变量都清除了吗?
  • 我根据您的建议更改了该部分: if (!$conn->query($sql)) { printf("Errormessage: %s\n", $conn->error); } 未设置($行); $结果=''; mysql_close($conn);现在,当我单击“删除”按钮时,不会删除该行,但不会显示后面的所有行。这可能有很多含义,但我无法理解......
  • 检查我的答案中发布的修改后的代码并检查它是否有效,我已经用 cmets 添加了我的行。
  • 我试过了,但是页面上什么都没有显示,这让我觉得有一个 PHP 错误(我猜是语法),我会寻找它。还是谢谢
【解决方案4】:
$sql="SELECT * FROM $table;"

应该在

$sql3="DELETE FROM $table WHERE id=".$row['id'].";";

还有更新等操作...

看起来它已被删除,但您看到的是旧数据 :)

<?php
    $servername="localhost";
    $username="root";
    $password="patate";
    $dbname="testbase";
    $table="matable";

    $conn = new mysqli($servername,$username,$password,$dbname);
    if ($conn->connect_error) {
            echo "kaput";
            die("Connection failed: " . $conn->connect_error);
    }

if($_REQUEST['Delete']) {
   {
        $sql3="DELETE FROM $table WHERE id=".(int)$_REQUEST['Delete'].";";
        $result3=$conn->query($sql3);

    }
}

if($_REQUEST['Switch']) {
    {

        $sql2="UPDATE $table SET state= IF (`state`, 0, 1) WHERE id=".(int)$_REQUEST['Switch'].";";


        $result2=$conn->query($sql2);

    }
}


    $sql="SELECT * FROM $table;";
    $result=$conn->query($sql); ?>

 <form action="logout.php" method="post">
<input type="submit" name="logout" value="logout">
</form>
<b>Alarm Monitoring</b>

<p>Sensors state table. Clicking on "Switch state" will switch the field "state" of the associated mote. </p>
<p>State 1 means that the mote is active, the alarm will be activated if the mote is moved or if someone is detected.</p>
<p>State 0 means that the mote is inactive, the alarm will NOT be activated if the mote is moved or if someone is detected.</p>





<table border=0>
    <tr>
        <td>

                <table border=1>
                    <tr>
                        <td width=150>ID</td>
                        <td width=150>Date</td>                        
                        <td width=300>PIR</td>  
                        <td width=150>Accel</td>
                        <td width=100>State</td>
                        <td width=150>Switch</td>
                        <td width=150>Delete</td>
                    </tr>
         <?php
   while($row = $result->fetch_assoc()) : ?>

                    <tr>
                        <td><?php echo $row['id']; ?></td>
                        <td><?php echo $row['date']; ?></td>
                        <td><?php echo $row['pir']; ?></td>
                        <td><?php echo $row['accel']; ?></td>
                        <td><?php echo $row['state']; ?></td>
                        <form name="form1" method="post" action=''>
                        <td><?php echo "<input name='Switch' type='submit' id='Switch' value='".$row['id']."'>"; ?></td>
                        <td><?php echo "<input name='Delete' type='submit' id='Delete' value='".$row['id']."'>"; ?></td>
                        </form>
                    </tr>    


 <?php endwhile; ?>    
</table>            

</table>
</td>
</tr>
</table>

请不要在这种情况下在 WHILE 循环中使用某些 SQL 查询

【讨论】:

  • 删除之后,有header('Location: table.php');,它将指示浏览器重新加载页面。这样做的结果是用户实际上不应该看到旧数据。
  • header('位置:table.php');应该在任何输出之前,如 html :)
  • 您需要将代码替换为页面顶部,将 html 替换为底部并删除 Header(Location),我认为一切都会好的
  • 如果我这样做,我放在顶部的小短语会出现在页面的底部,不是吗?我在检查按钮是否被点击的同时输出表格,我看不出如何将它们分离。答案可能是一个证据,因为我是网络编程的新手。
  • 答案已更新。你可以检查一下。在代码中建立连接,在 Db 中执行一些操作,例如删除和更新,然后选择全部并显示结果
【解决方案5】:

这是一个非常简单的问题,因为我遇到了他们,问题是SQL语句,你需要看看MYSQL,所以我用这个来解决例如:

DELETE FROM `reyler` WHERE `reyler`.`id`=".$id_post1 ."";

你需要的这个符号 => ``不是这个"或者这个'

第二个你可以在删除之前从mysql和mysql中删除带有sql语句的显示窗口,你可以从那里复制正确的语句,这与你的主机或xampp服务器中的数据库相关联,我认为会对你有所帮助。))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-05
    • 2020-11-10
    • 2019-01-28
    • 1970-01-01
    相关资源
    最近更新 更多