登录后PHP不会打开网页
问题描述:
我想创建一个使用OOP PHP代码和MySQL的登录系统,但是登录后它不会把我带到下一页。它告诉我如果我没有' t使用数据库中的凭据,即使我在数据库中使用了用户,它似乎总是将我重定向回登录页面。 下面是从网页和我的课的PHP,一切似乎是正确的,但它不工作,我不知道为什么。登录后PHP不会打开网页
的login.php
<?php
ob_start();
require_once ("init.php");
if ($session->loggedIn()) {redirect("SecLogin.php");}
if (isset($_POST['submit']))
{
$email = trim($_POST['email']);
$password = trim($_POST['pword']);
$userFound = User::verify($email, $password);
if ($userFound)
{
$session->login($userFound);
redirect("SecLogin.php");
}
else
{
$message = "Your Email Address or Password are not recognised";
echo $message;
}
}
else
{
$email = "";
$password = "";
}
?>
SecLogin.php
<?php
require_once ("init.php");
if(!$session->loggedIn()) {redirect("login.php");}
?>
的init.php
<?php
require_once ("functions.php");
require_once ("constants.php");
require_once ("database.php");
require_once ("user.php");
require_once ("session.php");
session.php文件
<?php
class Session
{
private $logIn = false;
public $userE;
public function __construct()
//construct function
{
session_start();
$this->check();
}
public function loggedIn()
//checks whether a user is logged in
{
return $this->logIn;
}
public function login($user)
//Logs the user in
{
if ($user)
{
$this->userE = $_SESSION['UserE'] = $user->email;
$this->logIn = true;
}
}
public function logout()
//Logs out the user
{
unset($_SESSION['UserE']);
unset($this->userE);
$this->logIn = false;
}
private function check()
//Checks whether the user exists
{
if (isset($_SESSION['UserE']))
{
$this->userE = $_SESSION['UserE'];
$this->logIn = true;
}
else
{
unset($this->userE);
$this->logIn = false;
}
}
}
//instantiates the class
$session = new Session();
user.php的
<?php
class User
{
public $id;
public $firstname;
public $lastname;
public $email;
public $password;
public static function findUser()
{
return self::findQuery("SELECT * FROM user");
}
public static function locateUser($userMail)
{
$datasetArray = self::query("SELECT * FROM user WHERE User_Email = $userMail LIMIT 1");
return !empty($datasetArray) ? array_shift($datasetArray) : false;
}
public static function findQuery($stmt)
{
global $database;
$resultSet = $database->query($stmt);
$instantArray = array();
while ($row = mysqli_fetch_array($resultSet))
{
$instantArray[] = self::instant($row);
}
return $instantArray;
}
public static function verify($email, $password)
{
global $database;
$email = $database->escapeString($email);
$password = $database->escapeString($password);
$sql = "SELECT * FROM user WHERE ";
$sql .= "User_Email = '{$email}'";
$sql .= "AND User_Password ='{$password}'";
$sql .= "LIMIT 1";
$verifyArray = self::findQuery($sql);
return !empty($verifyArray) ? array_shift($verifyArray) : false;
}
public static function instant($record)
{
$instant = new self;
foreach ($record as $attr => $value)
{
if ($instant->hasAttr($attr))
{
$instant->$attr = $value;
}
}
return $instant;
}
private function hasAttr($attr)
{
$properties = get_object_vars($this);
return array_key_exists($attr, $properties);
}
}
database.php中
<?php
require_once ("constants.php");
class Database
{
public $conn;
function __construct()
{
$this->openDbConnection();
}
public function openDbConnection()
//Opens the connection to the database
{
$this->conn = new mysqli(DB_SERVER, DB_USER, DB_PASSWORD,DB_NAME);
if ($this->conn->connect_errno)
{
die("Database Connection Failed" . $this->conn->connect_error);
}
}
public function query($sqlStmt)
//
{
$result = $this->conn->query($sqlStmt);
$this->confirmQuery($result);
return $result;
}
private function confirmQuery($result)
{
if(!$result)
{
die("Query Failed".$this->conn->error);
}
}
public function escapeString($string)
{
$escape = $this->conn->real_escape_string($string);
return $escape;
}
public function insertId()
{
return $this->conn->insert_id;
}
}
$database= new Database();
答
这是PHP调试工作。
开始像这样:去你的应用程序中你怀疑最不喜欢的地方。如果是我,我会从这里开始:
$this->logIn = true;
die('Did I make it to line '.__LINE__.'?');
如果应用程序没有死,那么你可能必须关闭Cookie或缺乏在你的PHP安装会话的支持。如果应用程序不能实现,则向后退出,直到找到不符合预期的行为。
感谢您的回答,使用这个我发现它归结于User类开始创建的字符串需要与数据库表字段名称相同。另一种选择是当用户的记录被分配给数组'datasetArray'时,将每个字符串分配给数组中的特定值。 –
@nickfallows好的工作! – WEBjuju