在不应该重定向的情况下,如何停止我的PHP页面?

时间:2018-10-09 15:35:06

标签: php

我的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;
    }
}

1 个答案:

答案 0 :(得分:0)

我怀疑它会进入error.php,因为您的代码中存在一些错误(如果我没记错的话,除非有一个错误,除非配置文件中的设置不同,否则PHP会重定向到/ error。) >

如果两个文件update.phpdelete.php的结构相同,但是一个文件失败而另一个文件没有失败,则失败在于代码之间的差异。在这种情况下,我怀疑它在if ($_SERVER["REQUEST_METHOD"] == "POST")代码块中。可以和我们分享一下吗?

编辑:另外,对于那些评论标头限制的人,我和开发人员的处境相似,在合同中,我有义务干扰我当时所使用的CMS应用程序的代码库。工作,并且必须在主题文件中尽我所能。在应用程序到达我的代码时,它已经发送了标头,因此我必须执行类似的解决方法。