Авторизация пользователя (Задание №3 по простой cms)

Вопрос по этому заданию: http://fkn.ktu10.com/?q=node/9910
Возникла следующая проблемка. начал модернизировать код функции login() в файле admin.php.
Изначальный код имел такой вид:

function login() {
    $results = array();
    $results['pageTitle'] = "Admin Login | Widget News";
    if (isset($_POST['login'])) {
        // Пользователь получает форму входа: попытка авторизировать пользователя
        if ($_POST['username'] == ADMIN_USERNAME 
                && $_POST['password'] == ADMIN_PASSWORD) {
          // Вход прошел успешно: создаем сессию и перенаправляем на страницу администратора
          $_SESSION['username'] = ADMIN_USERNAME;
          header( "Location: admin.php");
        } else {
          // Ошибка входа: выводим сообщение об ошибке для пользователя
          $results['errorMessage'] = "Неправильный пароль, попробуйте ещё раз.";
          require( TEMPLATE_PATH . "/admin/loginForm.php" );
        }
    } else {
      // Пользователь еще не получил форму: выводим форму
      require(TEMPLATE_PATH . "/admin/loginForm.php");
    }
}

Я модернизировал его следующим образом для сверки со списком зарегистрированных пользователей в базе данных (соответствующую табличку и тестовые значения в базе создал):

function login() {
  $results = array();
  $results['pageTitle'] = "Admin Login | Widget News";

    if (isset($_POST['login'])) {

        // Пользователь получает форму входа: попытка авторизировать пользователя

        if ($_POST['username'] == ADMIN_USERNAME 
                && $_POST['password'] == ADMIN_PASSWORD) {

          // Вход прошел успешно: создаем сессию и перенаправляем на страницу администратора
          $_SESSION['username'] = ADMIN_USERNAME;
          header( "Location: admin.php");

        } else {
           //Если пользователь не admin, выполняем соединение с базой данных и пытаемся найти    в ней соответствующего пользователя
            $conn = new PDO(DB_DSN, DB_USERNAME, DB_PASSWORD);
		    $sql = "SELECT * FROM users WHERE name = :name AND pass = :pass";
		    $prep = $conn->prepare($sql);
		    $prep->bindValue(":name", $_POST['username'], PDO::PARAM_STR);
		    $prep->bindValue(":pass", $_POST['password'], PDO::PARAM_STR);
		    if($prep->execute()){
			  $row = $prep->fetch();
	          $_SESSION['username'] = $row['name'];
			  header( "Location: admin.php");
		    }
            $results['errorMessage'] = "Неправильный логин или пароль, попробуйте ещё раз.";
		    require( TEMPLATE_PATH . "/admin/loginForm.php" );
        }

    } else {
      // Пользователь еще не получил форму: выводим форму
      require(TEMPLATE_PATH . "/admin/loginForm.php");
    }

}

В целом код отрабатывает верно: если данные введены правильно, пользователь перенаправляется в админку, если нет - на ту же страницу регистрации. Проблема лишь в том, что в моем варианте почему-то не выводится сообщение о неверно введенном пароле...Помогите разобраться, будьте добры ) Заранее спасибо!

vedro-compota's picture

if($prep->execute()){
  $row = $prep->fetch();
  $_SESSION['username'] = $row['name'];
  header( "Location: admin.php");
}
$results['errorMessage'] = "Неправильный логин или пароль, попробуйте ещё раз.";
require( TEMPLATE_PATH . "/admin/loginForm.php" );

какие по-вашему условия должны настать,
чтобы сообщение о неправильном пароле было выведено?
как вы понимаете этот код?

_____________
матфак вгу и остальная классика =)

Voronve's picture

Ну, ИМХО, если метод $prep->execute() возвращает значение false, это будет означать, что данные не извлеклись и пользователь с таким именем не существует, либо пароль неверный. Блок if выполняться не будет, значит не будет и перенаправления на admin.php. Код продолжит выполняться и сообщение должно быть выведено (но не выводится). В чём я ошибся?

vedro-compota's picture

Ну, ИМХО, если метод $prep->execute() возвращает значение false, это будет означать, что данные не извлеклись и пользователь с таким именем не существует, либо пароль неверный.

смелое предположение) С чего бы вдруг это было так. Открываем и читаем, как видит чтобы получить false, надо получить какую-то проблему в извлечении данных, а пустой результат, едва ли является проблемой.

Чтобы понять что это так, даже не имея документации, вам достаточно было провести отладку этой части кода, что-то вроде:

$queryResult = $prep->execute();
print_r($queryResult); die();

-- ввести несуществующие логин и пароль и посмотреть что там с результатом)

Если вопрос всё ещё не ясен -- спрашивайте)

_____________
матфак вгу и остальная классика =)

Voronve's picture

Спасибо. Теперь мне стало ясно, какой я идиот )

vedro-compota's picture

вопрос в целом нормален, правильно что задали.
Вывод такой: смотрите что именно возвращает функция. Если документация не ясна, тогда уже проводите ручную отладку.

_____________
матфак вгу и остальная классика =)

Voronve's picture

Так я как раз и смотрел...Просто не понял поначалу, что нулевой результат не является ошибкой

vedro-compota's picture

Желательно также добавить из вопроса ссылку на задачу (или список, что есть).

_____________
матфак вгу и остальная классика =)

Voronve's picture

Добавил