Это эхо внутри блока if / else не работает в конце скрипта - PullRequest
0 голосов
/ 27 декабря 2011

Я просмотрел похожие вопросы, опубликованные здесь, а также сделал основной поиск в 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, и это сработало, равно как и после оператора, оно также сработало. Я не понимаю, почему их не замечают.

Это для отладки, я пытаюсь протестировать код, но, как я уже сказал, мне любопытно, почему это пропускается, потому что я сталкивался с этим раньше.

Ответы [ 2 ]

3 голосов
/ 27 декабря 2011

Я не уверен, что это в полной мере относится к вашей проблеме, но ваши условия не верны.

if (!($user->error() === false)) {
    echo "<p>Authenticated!</p>";
}
else {
    echo $user->error();
}

echo $user->error(); внутри оператора else будет выполняться только в том случае, если$user->error() === false.В этом случае вы будете выполнять echo false;, что не даст вам отраженного вывода.


Чтобы решить эту проблему, используйте это вместо этого (предполагая, что $user->error(); возвращает false, если ошибок не существует):

if ($user->error() === false) {
    echo "<p>Authenticated!</p>";
}
else {
    echo $user->error();
}
0 голосов
/ 27 декабря 2011

@ Адлавсон прав. Вы можете заглянуть в php.ini и посмотреть, установлено ли display_errors на On. Если нет, установите его на ON, затем запустите ваш скрипт, чтобы увидеть, если вы получите ошибку. Иногда, если $ class-> method () возвращает ошибку, вы можете ее не увидеть из-за display_errors=Off.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...