我的PHP技能很生锈,但是我正在尝试为一个项目构建一个CRUD网站。我有一个很好的,可以正常工作的edit.php页面。如果更新查询成功,则将用户重定向到view.php以查看结果。然后,我添加了用户ID验证,以确保用户无法使用随机记录ID修改URL并编辑属于其他人的记录,从而导致页面中断。这是我的代码:
// Initialize the session
session_start();
// Other misc stuff
// Get record id from URL
$qdetailsid = $_GET['qdetailsid'];
// First, check to make sure user owns record to be updated
$sessionid = $_SESSION["id"];
$query = "SELECT userid FROM database WHERE qdetailsid = '$qdetailsid'";
$result = mysqli_query($mysqli, $query);
$row = mysqli_fetch_array($result);
$userid = $row['userid'];
if ($userid != $sessionid) {
?>
<script type="text/javascript">
window.location = '/error'; // IDs don't match, so redirect to error page
</script>
<?php
exit; // I've added and removed this; makes no difference.
} else {
// IDs match, so process the form
if ($_SERVER["REQUEST_METHOD"] == "POST") {
// Perform update and redirect to view.php
}
} // End of id check
// Display the edit form pre-populated with data
$query = "SELECT title, url, details FROM database WHERE qdetailsid = '$qdetailsid'";
$result = mysqli_query($mysqli, $query);
// Display post content in form
while ($row = mysqli_fetch_array($result)) {
// Get form data
$title = $row['title'];
$url = $row['url'];
$details = $row['details'];
}
// Close connection
$mysqli->close();
// Display the form html
如果ID不匹配,则页面会正确重定向到error.php页面。但是,如果它们确实匹配,则代码将按预期方式继续处理表单提交。但是,即使我提交了有效的更新,更新也会失败,并且页面会重定向到错误页面,就像在尝试更新并找到不匹配项后返回到id检查一样。没有其他重定向到错误页面,所以这就是我的外观。如果我完全删除了用户ID检查if-else代码块,则该页面将按预期工作。
有趣的是,在重定向发生之前,我可以在地址栏中简短地看到edit.php URL。没有附加参数,仅是“ edit.php?”。如果我手动尝试导航到不带参数的edit.php,它会将我重定向到错误页面。没有设置代码可以做到这一点。我通过.htaccess实现了干净的URL,但是那里也没有处理任何错误重定向的内容。
我在delete.php中具有完全相同的代码块(如果id不匹配,请不要删除并发送到错误页面),并且可以正常工作。我曾在if-else条件下尝试过'!='和'!=='。
我已经检查了整个SO,找不到针对这种独特情况的相关解决方案。
注意:由于php标头的限制,我正在使用JavaScript执行重定向。
编辑: 这是我的表单代码。我没有包括它,因为我认为它不相关。添加用户标识检查代码块后,我没有更改它。请尽量不要挂在变量名上。我对其进行了编辑以维护隐私。但是它们都正确匹配,并且正如我所说,该表单无需用户ID检查即可工作。
// IDs match, so process the form
if ($_SERVER["REQUEST_METHOD"] == "POST") {
// Get form data
$title = $_POST['title'];
$url = $_POST['url'];
$details = $_POST['details'];
$qdetailsid = $_POST['detailsid'];
// Prepare an update statement
$update = "UPDATE database SET title = ?, url = ?, qdetails = ? WHERE qdetailsid = ?";
$stmt = $mysqli->prepare($update);
$stmt->bind_param('sssd', $title, $url, $details, $qdetailsid);
if($stmt->execute()) {
// Redirect to view page to see results of update
?>
<script type="text/javascript">
window.location = '/view/' + <?php echo $qdetailsid ?>;
</script>
<?php
exit;
}
}
答案 0 :(得分:0)
我怀疑它会进入error.php
,因为您的代码中存在一些错误(如果我没记错的话,除非有一个错误,除非配置文件中的设置不同,否则PHP会重定向到/ error。) >
如果两个文件update.php
和delete.php
的结构相同,但是一个文件失败而另一个文件没有失败,则失败在于代码之间的差异。在这种情况下,我怀疑它在if ($_SERVER["REQUEST_METHOD"] == "POST")
代码块中。可以和我们分享一下吗?
编辑:另外,对于那些评论标头限制的人,我和开发人员的处境相似,在合同中,我有义务不干扰我当时所使用的CMS应用程序的代码库。工作,并且必须在主题文件中尽我所能。在应用程序到达我的代码时,它已经发送了标头,因此我必须执行类似的解决方法。