簡體   English   中英

PHP標頭重定向不起作用,並停留在login.php上

[英]PHP header redirect not working and staying on login.php

我正在嘗試使用PHP將登錄頁面重定向到profile.php頁面。 我已經測試過該代碼使用會話從數據庫中提取信息。 一切正常,直到最終的If語句為止。 它並沒有給我任何錯誤,但它變回空白並且不會脫離login.php文件(腳本正在運行的位置)。

session_start();
//print_r($_POST);

if(isset($_POST['email'], $_POST['password'])){
    require 'php_includes/db_connect.php';

    $query = $dtb->prepare("SELECT * FROM users WHERE email=:email AND password=:password");
    //$query->bindParam('ss', $_POST['email'], $_POST['password']);
    $query->bindParam(':email', $_POST['email'],PDO::PARAM_STR);
    $query->bindParam(':password', $_POST['password'],PDO::PARAM_STR);
    $query->execute();
    //die('Connection error, because: '.$query->errorInfo());

    //echo 'hi';

    //$query->close();
    if($row = $query->fetch()){
        echo 'hi';
        $_SESSION['email'] = $row['email'];
        header("location: profile.php");
    }
}

刪除回聲。 標頭重定向之前必須沒有任何輸出。

這包括任何類型的意外空格,因此,無論何時在重定向之前包含另一個文件,都必須確保在調用重定向之前沒有任何輸出。

常用方法:

大多數編碼框架將使用ob_*函數-意味着它們會將所有瀏覽器的輸出捕獲到緩沖區中,並決定是否/何時發送輸出。

通過在整個應用程序中使用輸出緩沖解決方案(例如init / bootstrap文件),可以更加輕松地確保cookie,會話和標頭重定向正確發生,因為您可以控制應用程序中發送輸出的確切位置。

小而難發現的問題:

由於此文件不輸出任何內容,例如僅包含函數定義的文件或類文件,因此不應以?>結尾,因為在?>之后的空白被視為輸出。

文件也必須全部以相同格式保存,例如帶BOM的ASCII或UTF-8或不帶BOM的UTF-8,否則,格式之間的差異可能被誤解為輸出(通常為1-2個字符),很難找到。

調試:

將您的error_reporting()設置為E_ALLini_set('display_errors', true) 這將回顯各種通知,警告您可能不會看到其他警告。 這些警告之一將是“已發送標題”之類的內容,其中提到發生第一個輸出的特定文件/行。

如果輸出的文件/行看起來很熟悉,則可以刪除該輸出。 如果找不到第一個輸出發生的位置,則可能是“問題不多且難以發現”之一。

隨着消除echo 'hi'; Mihai Stancu所說的空格

建議放一個exit(); 在標頭位置之后,如下所示:

if($row = $query->fetch()){
    $_SESSION['email'] = $row['email'];
    header("location: profile.php");
    exit();
}

只用header() 並不意味着代碼將停止執行。 每當使用header()重定向時,您都需要顯式調用exit()來停止腳本的執行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM