如果执行某些 php 脚本,则刷新页面
Posted
技术标签:
【中文标题】如果执行某些 php 脚本,则刷新页面【英文标题】:Refresh page if certein php script is executed 【发布时间】:2019-03-21 04:25:24 【问题描述】:我有一个 somefile.php 和 someotherfile.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 攻击。您应该通过mysqli 或PDO 使用带有绑定参数的预处理语句。 This post 有一些很好的例子。
在 和
【参考方案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 脚本,则刷新页面的主要内容,如果未能解决你的问题,请参考以下文章