PHP重定向适用于Chrome但不适用于其他浏览器

时间:2017-05-06 03:39:39

标签: php forms

所以我试图通过一本书的帮助来学习自己的MVC。 我还处于一个非常基本的水平所以如果你有足够的回答,请记住这一点。

这是我的应用程序布局的一部分:

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",因为重定向依赖于该特定字段。

MODEL

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服务器作为控制器。以下是&#34;控制器&#34;的部分摘录。并且是问题发生的地方。

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流程/步骤

  1. 用户在表单中输入电子邮件和密码。
  2. 表格信息传递给index.php&#34;控制器&#34;其中包括电子邮件,pword。和隐藏的输入字段值
  3. 在index.php文件中,控制器会检查隐藏的输入字段action值是否设置为登录。
  4. 如果设置了login,则会调用users_db模型中的login函数,该函数会查询db并返回所有用户信息。
  5. 假设电子邮件正确&amp; pword已输入,index.php将用户重定向到欢迎页面并exit()
  6. 以下在Chrome中完美无缺,但所有其他浏览器都重定向到404错误index.php未找到。这对我来说很奇怪,如果有人能提供一些关于上述错误发生的原因,我会非常感激吗?

5 个答案:

答案 0 :(得分: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 :(得分:1)

除了重定向之外,该代码存在多个问题。 header函数不起作用的原因是因为标题需要有一个绝对URL,如http://www.example.com/replace.php,除此之外,Location:之间需要有一个空格标题名称和值,如:

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

请注意,为了使用header功能设置响应标头,如果您有任何小于空格的内容,之前的标题都不会被发送在致电header函数之前返回,它无法正常工作。

现在,让我们谈谈这段代码所存在的其他问题:

1 - 在开始使用$ _SESSION超全局之前,需要在页面顶部调用session_start()函数。

2 - 您在foreach循环中调用die(),这意味着您的代码将只迭代数组一次,然后代码将停止。将die()调用移到循环外部。

3 - 使用filter_val功能验证输入(http://php.net/manual/ro/function.filter-input.php)〜我主要谈论电子邮件,但我认为您也可以将其应用于其他输入。

4 - 不要以纯文本格式存储密码,使用PHP提供的密码哈希API(https://www.sitepoint.com/hashing-passwords-php-5-5-password-hashing-api/

答案 2 :(得分: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();
                }
             }
          }

答案 3 :(得分:-1)

在foreach的末尾die()函数 - &gt;删除它,然后尝试。

答案 4 :(得分:-1)

请检查您的php代码是否没有错误,

:

之后查找空格

ex:header('Location: welcome.php');