如果执行某些 php 脚本,则刷新页面

Posted

技术标签:

【中文标题】如果执行某些 php 脚本,则刷新页面【英文标题】:Refresh page if certein php script is executed 【发布时间】: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>

这段代码的作用如下

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

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

我尝试了以下解决方案

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

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

非常感谢任何帮助

【问题讨论】:

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

标签之间剪切并粘贴 if(isset($_POST['delete'])) 代码
【参考方案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】:

一些事情:

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

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

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

    您的删除操作,正如问题中所写,容易受到 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 但我要提一下,与其转义输入,不如采用参数化查询的更好做法。

以上是关于如果执行某些 php 脚本,则刷新页面的主要内容,如果未能解决你的问题,请参考以下文章

嗨,我正在使用 php 执行 python 脚本,但我不希望在单击按钮时刷新页面,因为我也嵌入了其他页面 [关闭]

页面刷新后移动到网页的一部分

如果页面未刷新,则多个ajax调用按钮单击jquery

PHP刷新窗口?相当于F5页面重载?

php如何避免刷新页面重复提交