По умолчанию PDOStatement::fetch
возвращает строку в виде массива полей, проиндексированных по имени и номеру столбца (режим PDO::FETCH_BOTH
). Это означает, что ac::check_credentials
возвращает массив, но ac::authentication
проверяет целое число. Кроме того, значения полей являются строками, поэтому is_int
не будет работать, если вы явно не преобразуете поле результата в целое число. Попробуйте PDOStatement::fetchColumn()
и is_numeric
.
public function authentication() {
...
if (is_numeric($this->check_credentials($plain_username, $md5_password))) {
...
}
private function check_credentials($plain_username, $md5_password) {
return $userid->fetchColumn();
}
В качестве альтернативы is_numeric
, убедитесь, что результат проверки учетных данных не идентичен False
.
public function authentication() {
...
if (False !== $this->check_credentials($plain_username, $md5_password)) {
...
}
Как указывает Ягго, ui::start
и ac::dbConnect
должны быть статическими методами. ac::authentication
не нужно создавать новый ac
; поскольку это не статический метод, он может обращаться к текущему объекту через специальную переменную $this
(как это было сделано выше). $dbcon
следует сделать статическим свойством ac
, чтобы вы не не загрязняли глобальное пространство имен . Имена классов должны использовать UpperCamelCase и должны быть более наглядными.
Классы должны иметь единственную, четко определенную цель и не отклоняться от этого. ac
имеет много целей: управлять подключением к БД, обрабатывать аутентификацию и отображать результаты аутентификации. Подумайте о разработке набора классов для уровня доступа к данным, скрывая базу данных от всего остального. Также рассмотрите возможность отделения логики домена (аутентификация и с) от отображения. Это часть шаблона, известного как архитектура Model View Controller . Это не должно происходить сразу; Вы можете медленно рефакторинг кода.