所以我试图通过一本书的帮助来学习自己的MVC。 我还处于一个非常基本的水平所以如果你有足够的回答,请记住这一点。
这是我的应用程序布局的一部分:
现在我有一个简单的登录表单
<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流程/步骤
action
值是否设置为登录。exit()
以下在Chrome中完美无缺,但所有其他浏览器都重定向到404错误index.php未找到。这对我来说很奇怪,如果有人能提供一些关于上述错误发生的原因,我会非常感激吗?
答案 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');