Я просмотрел похожие вопросы, опубликованные здесь, а также сделал основной поиск в Google, но лучшее, что я смог найти, - это то, почему W3Schools - это ужасное место для изучения, которое мало помогло с моей проблемой. Я не обязательно хочу решение, я бы предпочел объяснение, почему это не работает, поскольку у меня была похожая проблема в прошлом, но я обошел ее, так как это я просто отлаживаю и тестирую другие разделы кода.
Начнем с того, что у меня есть неприятное эхо внутри оператора if, который не печатается, забавно то, что ни if, ни блок else не выполняются.
Мой index.php
файл:
<!DOCTYPE html>
<html>
<head>
<title>A Title</title>
</head>
<body>
<?php
session_start();
include "scripts/Employee.php";
error_reporting(E_ALL);
$user = new Employee('bbuck', 'password');
echo "<p>I have some stuff that works here.</p>";
if (!($user->error() === false)) {
echo "<p>Authenticated!</p>";
}
else {
echo $user->error();
}
?>
</body>
</html>
Конструктор Employee
:
public function __construct($username, $password) {
$db = Database::getInstance();
$result = $db->authenticate($username, $password);
if ($result !== false) {
$this->id = $result['id'];
$this->fname = $result['fname'];
$this->lname = $result['lname'];
$this->lastAction = $result['last_action'];
$this->error = false;
}
else
$this->error = "Failed to authenticate the user, wrong username/password combination.";
}
Не думаю, что это действительно важно, но для справки функция Employee::error()
- это просто return $this->error;
.
И, наконец, функция Database::authenticate()
:
public function authenticate($username, $password) {
$query = "SELECT * FROM `employee` WHERE `username` = '"
. $this->conn->escape_string($username)
. "' AND `password` = PASSWORD('"
. $this->conn->escape_string($password) . "')";
$result = $this->conn->query($query);
if (!$result)
return false;
$rowCount = $result->num_rows;
if ($rowCount == 1) {
$row = $result->fetch_assoc();
$update = "UPDATE `employee` SET `session_id` = UUID(), `session_expires` = (NOW() + INTERVAL 10 MINUTE) WHERE `id` = {$row['id']}";
$select = "SELECT `session_id`, `session_expires` FROM `employee` WHERE `id` = {$row['id']}";
$updateResult = $this->conn->query($update);
if (!$updateResult)
die("Failed to update the employee!");
$updateResult = $this->conn->query($select);
if (!$updateResult)
die("Failed to pull Session data for employee!");
$updateRow = $updateResult->fetch_assoc();
$_SESSION[SESSION_ID] = $updateRow['session_id'];
$_SESSION[SESSION_EXPIRES] = new DateTime($updateRow['session_expires']);
return $row;
}
return false;
}
Теперь операторы echo в блоке if/else
в index.php
ничего не печатают, я использовал var_dump
в $user
и $user->error() === false
, и оба дали мне результаты, которые я ожидал получить от их. Я также поместил echo
перед оператором if, и это сработало, равно как и после оператора, оно также сработало. Я не понимаю, почему их не замечают.
Это для отладки, я пытаюсь протестировать код, но, как я уже сказал, мне любопытно, почему это пропускается, потому что я сталкивался с этим раньше.