2017-05-06 36 views
3

因此,我試圖通過一本書的幫助來了解自己的MVC。 我仍然在一個非常基本的水平所以請記住,如果你有足夠的回答。PHP重定向在Chrome中運行,但不能在其他瀏覽器中運行

這是我的應用程序佈局的一部分:

enter image description here

現在我有一個簡單的登錄表單

<form method="post" action="index.php"> 
     <input type="text" name="action" value="login" style="display: none"> 
     <label for="email">Email</label> 
     <input type="email" required="required" name="email" id="email" placeholder="Enter Your Email" /> 
     <br /> 
     <label for="password">Password</label> 
     <input type="password" required="required" name="password" id="password" placeholder="Enter Your Password" /> 
     <button type="submit" name="submit">Login</button> 
    </form> 

注意第一場name="action" value="login"因爲重定向是依賴於特定的領域。

模型

users_db.php

function login($email, $pword) 
{ 
    $sql = "SELECT * FROM users WHERE email = :email AND pword = :pword "; 
    $stmnt = $db->prepare($sql); 
    $stmnt->bindValue(':email', $email); 
    $stmnt->bindValue(':pword', $pword); 
    $stmnt->execute(); 
    if ($stmnt->rowCount() > 0) { 
     return $stmnt->fetchAll(); 
    } else { 
     return null; 
    } 
} 

目錄 - 用戶

index.php文件服務器的控制器。以下是「控制器」的部分摘錄,並且是問題發生的地方。

require_once('../config/db.php'); 
require_once('../model/users_db.php'); 
if(isset($_POST['action'])) { 
    $action = $_POST['action']; 
    if ($action == 'login') { 
     $email = htmlspecialchars($_POST['email']); 
     $pword = htmlspecialchars($_POST['password']); 
     $users = login($email, $pword); 
     if (is_array($users)) { 
      foreach ($users as $user) { 
       session_start(); 
       $_SESSION['firstname'] = $user['firstname']; 
       $_SESSION['lastname'] = $user['lastname']; 
       $_SESSION['username'] = $user['username']; 
       $_SESSION['email'] = $user['email']; 
       $_SESSION['userType'] = $user['userType']; 
       $_SESSION['userID'] = $user['userID']; 
       header('Location:welcome.php'); 
       die(); 
      } 

APP FLOW/STEPS

  1. 用戶在表單中輸入電子郵件地址和密碼。
  2. 表單信息傳遞給index.php包含電子郵件,pword的「控制器」。和隱藏的輸入字段值
  3. 在index.php文件中,控制器檢查隱藏輸入字段action值是否設置爲登錄。
  4. 如果設置了登錄名,它將調用users_db模型的登錄函數,該模型查詢db並返回所有用戶信息。
  5. 假設正確的電子郵件& PWORD被照耀處,index.php文件重定向用戶歡迎頁面和exit()

在Chrome以下作品完美,但所有其他瀏覽器重定向到一個404錯誤的index.php沒有找到。這對我來說很奇怪,如果有人能提供一些關於上述錯誤發生的原因,我們將不勝感激。

+1

它看起來像問題是在表單提交,而不是在設置會話後的重定向。發生錯誤後,您是否可以返回並嘗試打印會話以查看所看到的內容。如果在重定向時出現問題,那麼應該已經設置了會話 – manian

+0

請檢查此帖是否有幫助,http://stackoverflow.com/questions/17838408/404-error-when-submitting-form – manian

+0

首先檢查您的帖子正在執行。 – siddhesh

回答

1

試試這個

error_reporting(E_ALL | E_WARNING | E_NOTICE); 
ini_set('display_errors', TRUE); 


flush(); 
header("Location: http://www.website.com/"); 
echo '<script>window.location.replace("http://www.example.com")</script>'; 
die('should have redirected by now'); 

PHP重定向用頭碼告訴瀏覽器重定向。但是,如果您的PHP代碼在該標題位置之前回顯(甚至是警告),則某些瀏覽器將不會重定向。

在上面的代碼中,刷新所有內容併發送標題位置。它還告訴瀏覽器使用JavaScript重定向,所以即使php頭重定向也不起作用。

希望它可以幫助

+1

©Gijo,我認爲我們需要找到一種方法來解決它由PHP本身。我們還應該找出造成這個問題的原因。 – manian

+0

再次感謝@Gijo這仍然導致同樣的問題即時嘗試檢查其他原因,並會更新答案,如果/當我可以得到更多的信息 –

+0

問題不在於頭重定向代碼。上面的一些代碼是錯誤的。這就是原因。檢查一下吧 –

-1

在結束die()函數中的foreach - >刪除它,然後嘗試。

-1

請檢查你的PHP代碼沒有錯誤,並

外觀爲白色的空間後:

例如:header('Location: welcome.php');

1

有超過一個問題的代碼,比其他重定向。 爲什麼header功能不起作用的原因是因爲頭需要有一個絕對的URL,如http://www.example.com/replace.php,除此之外,還有需要是Location:頭名和值之間的空間,如:

header('Location: http://www.example.com/replace.php')

注意的是,爲了使用header功能設置響應頭,以前沒有頭應該已經送到,如果你有什麼小如說是你之前返回的空間調用header功能,它贏得沒有工作。

現在,讓我們來談談剩下的問題,這段代碼有:

1 - 的session_start()功能需要在你的頁面的頂部被調用,這樣你開始$ _SESSION全局工作之前。

2 - 您在foreach循環中調用die(),這意味着您的代碼只會一次遍歷數組,然後代碼將停止。在環路外移動die()調用。

3 - 使用filter_val函數驗證輸入(http://php.net/manual/ro/function.filter-input.php)〜我主要討論電子郵件,但我認爲您也可以將其應用於其他輸入。

4 - 不要以純文本格式的密碼,使用密碼散列的API,PHP提供(https://www.sitepoint.com/hashing-passwords-php-5-5-password-hashing-api/

+0

你可以在你的答案中添加ob_start()作爲點。這可能是其中一個可能的問題 – manian

+0

而不是用'ob_start()'和'ob_clean()'來破解代碼,他應該追查罪魁禍首(無論如何也是如此)。 –

+0

是的,我同意。但是,不需要在頭部重定向的頂部使用ob_start()來工作? – manian

0

可能另一種解決方案:

users_db.php

function login($email, $pword) 
{ 
    $sql = "SELECT * FROM users WHERE email = :email AND pword = :pword LIMIT 1"; 
    $stmnt = $db->prepare($sql); 
    $stmnt->bindValue(':email', $email); 
    $stmnt->bindValue(':pword', $pword); 
    $stmnt->execute(); 
    if ($stmnt->rowCount() > 0) { 
     return $stmnt->fetchAll(); 
    } else { 
     return null; 
    } 
} 

的index.php

require_once('../config/db.php'); 
    require_once('../model/users_db.php'); 
    if(isset($_POST['action'])) { 
     $action = $_POST['action']; 
     if ($action == 'login') { 
      $email = htmlspecialchars($_POST['email']); 
      $pword = htmlspecialchars($_POST['password']); 
      $user = login($email, $pword); 
      if ($user != null) { 
        session_start(); 
        $_SESSION['firstname'] = $user['firstname']; 
        $_SESSION['lastname'] = $user['lastname']; 
        $_SESSION['username'] = $user['username']; 
        $_SESSION['email'] = $user['email']; 
        $_SESSION['userType'] = $user['userType']; 
        $_SESSION['userID'] = $user['userID']; 
        header('Location: welcome.php'); 
        echo '<script>window.location.replace("http://www.example.com")</script>'; 
        die(); 
       } 
      } 
      } 
+0

非常感謝您的持續幫助。不幸的是,這個解決方案導致同樣的問 –

相關問題