【问题标题】:Refresh page if certein php script is executed如果执行某些 php 脚本,则刷新页面
【发布时间】:2019-03-21 04:25:24
【问题描述】:

我有一个 somefile.phpsomeotherfile.js,代码如下

javascript file
function deleteSelectedRow() {
  return (confirm('Are you sure you want to delete this record)) 
      };
<!DOCTYPE html>

<html lang=" en">

<head>
  <title> Title </title>
</head>

<body>
  <h1>Select the user to delete from the list below </h1>

  <form action="" method="POST">
    <?php
            if(require_once('../SQL/mySQL_connect.php'))
            {                
                $query = "SELECT id, FirstName, LastName, PhoneNumber FROM participants ORDER BY id ASC";
                $userDetails = @mysqli_query($mysqli, $query);
            }
            else
            {
                echo "Couldn't connect to database";
                echo mysqli_error($mysqli);
            }    
           // mysqli_close($mysqli);
            
        ?>
      <br><br><br>


      <table name="userDetailsTable" id="userDetailsTable" align="left" cellspacing="7" cellpadding="8">
        <tr>
          <td align="center"><b>S No</b></td>
          <td align="center"><b>Id</b></td>
          <td align="center"><b>Rank</b></td>
          <td align="center"><b>First Name</b></td>
          <td align="center"><b>Last Name</b></td>
        </tr>
        <?php
                for($i = 1; $i <= mysqli_num_rows($userDetails); $i++)
                // while($row=mysqli_fetch_array($userDetails))
                {
                    $row=mysqli_fetch_array($userDetails);
                    echo '<tr>
                    <td align ="center" >'. $i .'</td>
                    <td align ="center" >' . $row['id'] . '</td>
                    <td align ="center">' . $row['Rank'] . '</td>
                    <td align ="center">' . $row['FirstName'] . '</td>
                    <td align ="center">' . $row['LastName'] . '</td>    
                    <td align ="center"> <input type = submit name="delete" value="delete" onclick="return deleteSelectedRow();" ></input></td>';
                    echo '</tr>';
                }
            ?>
      </table>
  </form>

  <?php
       
        if(isset($_POST['delete']))
        {
            require_once('../SQL/mySQL_connect.php');
            $query="DELETE FROM `participants` WHERE `participants`.`id` = ".$_POST['IDNumber']."";
            $response = @mysqli_query($mysqli, $query);
            if($response)
            {
                echo "Deleted from Database Successfully";
            }
            else
            {
                echo "Couldn't Delete from database";
                echo'<br>';
                echo mysqli_error($mysqli);
            }
            mysqli_close($mysqli);
        }
    ?>

</body>

这段代码的作用如下

  1. 连接到数据库并检索用户详细信息
  2. 创建一个表格并打印出其中的用户详细信息
  3. 用户点击任意记录前的删除按钮,确认后删除
  4. 显示删除成功消息

我想要做的是在显示成功消息后,上面打印的表格应该会自动更新,以便用户确认该 id 不再存在于表格中

我尝试了以下解决方案

  1. 在显示成功消息之前重新加载页面,以便用户看到成功消息以及更新的表(因为重新加载将重新连接到数据库并重新获取表)

    我尝试使用“location.reload(true)”命令,但我无法确定该行的放置位置,以便在显示成功消息之前执行它。

非常感谢任何帮助

【问题讨论】:

  • 你可以在if($response)之后试试header("Location: " . "http://" . $_SERVER['HTTP_HOST'] . $location);
  • 您在打印表格后删除条目。将删除块移到 SELECT 查询之前。这应该适用于使用 location.reload();. 重新加载页面
  • 您的代码容易受到SQL injection 攻击。您应该通过mysqliPDO 使用带有绑定参数的预处理语句。 This post 有一些很好的例子。
  • 标签之间剪切并粘贴 if(isset($_POST['delete'])) { } 代码

标签: javascript php html


【解决方案1】:

您需要将成功/错误消息存储在$_SESSION["flash"] 中,而不是通过回显显示,并且在删除用户后,您必须重定向到同一页面。 在页面顶部,如果设置了$_SESSION["flash"],您可以显示该消息并将其从会话中删除。在代码中:

if(isset($_POST['delete']))
    {
        require_once('../SQL/mySQL_connect.php');
        $query="DELETE FROM `participants` WHERE `participants`.`id` = ".$_POST['IDNumber']."";
        $response = @mysqli_query($mysqli, $query);
        if($response)
        {
            $_SESSION["flash"] = "Deleted from Database Successfully";
        }
        else
        {
            $_SESSION["flash"] = "Couldn't Delete from database";
            //echo'<br>';
            //echo mysqli_error($mysqli);
        }
        mysqli_close($mysqli);
        header('Location: '.$_SERVER['PHP_SELF']); 
    }

isset($_POST['delete'])之前的页面顶部:

if(isset($_SESSION["flash"])){
   echo $_SESSION["flash"];
   unset($_SESSION["flash"]);
}

不要忘记在页面顶部start_session()。 我会注意到您的代码存在 SQL 注入漏洞。你不应该在没有验证 GET 和 POST 输入数据的情况下执行 MySQL 查询。

【讨论】:

  • 您应该在回答中提到该代码易受 SQL 注入攻击。
  • 是的,在评论中,可以以任何理由随时删除。最好覆盖您自己的基础,该评论可能不会永远存在,并且当它被删除并且人们将来查看此答案时,他们可能没有意识到它是易受攻击的(这是大量教程的问题,它们易受攻击但新人们不知道)
  • 好的抱歉我马上就做
【解决方案2】:

一些事情:

  1. 您希望删除操作是您在页面上执行的第一件事(如果是表单提交),否则您将打印“预删除”表。

  2. 您需要通过表单中的帖子传递 ID。如果您只为每一行设置一个唯一的,并为每一行设置一个隐藏的 ID 输入,则会更容易。

  3. 确认最好附加到表单提交事件,否则你会错过其他非点击输入法。

  4. 您的删除操作,正如问题中所写,容易受到 SQL 注入攻击。您需要转义该 POST 值。

类似下面的东西应该可以工作

function deleteSelectedRow() {
  return (confirm('Are you sure you want to delete this record)) 
      };
<?php
 $message = '';
 $connected = false;
 if(require_once('../SQL/mySQL_connect.php'))
 {
    $connected = true;
 }
        if($connected && isset($_POST['delete']))
        {
            $id_to_delete = mysqli_real_escape_string($mysqli, $_POST['IDNumber']);//escape value to prevent sql injection attack
            $query="DELETE FROM `participants` WHERE `participants`.`id` = ".$id_to_delete."";
            $response = @mysqli_query($mysqli, $query);
            if($response)
            {
                $message = "Deleted from Database Successfully";
            }
            else
            {
                $message = "Couldn't Delete from database";
                $message .='<br>';
                $message .= mysqli_error($mysqli);
            }
            //mysqli_close($mysqli);
        }else{
          $message = "unable to connect to database";
        }
    ?><!DOCTYPE html>

<html lang=" en">

<head>
  <title> Title </title>
</head>

<body>
  <h1>Select the user to delete from the list below </h1>

  
    <?php
            if($connected)
            {                
                $query = "SELECT id, FirstName, LastName, PhoneNumber FROM participants ORDER BY id ASC";
                $userDetails = @mysqli_query($mysqli, $query);
            }
            else
            {
                echo "Couldn't connect to database";
                echo mysqli_error($mysqli);
            }    
           
            
        ?>
      <br><br><br>
      
<?php if($message){ /* do we have a success/error message from the delete operation? */ ?>
  <p><?php echo $message; ?></p>
<?php } ?>

      <table name="userDetailsTable" id="userDetailsTable" align="left" cellspacing="7" cellpadding="8">
        <tr>
          <td align="center"><b>S No</b></td>
          <td align="center"><b>Id</b></td>
          <td align="center"><b>Rank</b></td>
          <td align="center"><b>First Name</b></td>
          <td align="center"><b>Last Name</b></td>
        </tr>
        <?php
                for($i = 1; $i <= mysqli_num_rows($userDetails); $i++)
                // while($row=mysqli_fetch_array($userDetails))
                {
                    $row=mysqli_fetch_array($userDetails);
                    echo '<tr>
                    <td align ="center" >'. $i .'</td>
                    <td align ="center" >' . $row['id'] . '</td>
                    <td align ="center">' . $row['Rank'] . '</td>
                    <td align ="center">' . $row['FirstName'] . '</td>
                    <td align ="center">' . $row['LastName'] . '</td>    
                    <td align ="center"> <form action="" method="POST" onsubmit="return deleteSelectedRow();"><input type="hidden" name="IDNumber" value="'.$row['id'].'" /><input type = submit name="delete" value="delete"></form></td>';
                    echo '</tr>';
                }
            ?>
      </table>

<?php if($connected){
  mysqli_close($mysqli);
} ?>


</body>

【讨论】:

  • 我尝试了您提到的编辑。但是,当我删除任何记录时,页面会重新加载并为我在整个文件中调用的每个查询显示“mysqli_query():无法在...中获取 mysqli”。可能某处与服务器的连接断开了,还是其他原因?
  • 对于文件中调用的所有查询,整个错误语句是“警告:mysqli_query():无法在 C:\xampp\htdocs... 中获取 mysqli”
  • @MShajeehMustafa 我没有足够关注您的数据库连接。我已经调整了示例以说明require_once 的使用。我想这些错误与关闭的连接有关,但没有重新打开(因为您已经在页面上早些时候需要该文件。)这不是一个很好的解决方案,但没有看到并更改 mySQL_connect.php 这是我能做到的最好的做。
  • 可能我必须在 mySQL_connect.php 或类似的东西中开始一些会话。不过,非常感谢
  • +1 但我要提一下,与其转义输入,不如采用参数化查询的更好做法。
猜你喜欢
  • 1970-01-01
  • 2020-02-04
  • 2020-04-17
  • 2020-07-29
  • 2020-09-30
  • 2013-02-12
  • 1970-01-01
  • 2021-09-15
  • 1970-01-01
相关资源
最近更新 更多