Я хотел бы получить группу пользователей из моей базы данных, а затем проверить, если это 2 (что будет означать, что это администратор). В настоящее время у меня есть этот код в качестве настройки:
login.php
<?php
//process login form if submitted
if(isset($_POST['submited'])){
$username = trim($_POST['username']);
$password = trim($_POST['password']);
if($user->login($username,$password)){
//logged in return to index page
$_SESSION['login'] = "$username";
header('Location: index.php');
exit;} else {
$message = '<p class="error">Wrong username or password</p>';
}
}//end if submit
if(isset($message)) { echo $message; }
?>
<div class="lockscreen-credentials"> <form class="form-signin" role="form" method="post" action="">
<input type="text" class="form-control" name="username" placeholder="Username" required autofocus>
<div class="input-group">
<input type="password" class="form-control" placeholder="password" name="password" required/>
<div class="input-group-btn">
<button class="btn btn-flat" name="submited"><i class="fa fa-arrow-right text-muted"></i></button>
</div>
</div></form>
</div><!-- /.lockscreen credentials -->
И это класс, который называется (class.user.php):
public function login($username,$password){
$hashed = $this->get_user_hash($username);
*$st = $this->_db->prepare('SELECT userGroup FROM users WHERE username = :username');
$st->execute(array('userGroup' => 2));
$rows = $st->fetch();
if($st = 2) {
$_SESSION['loggedin'] = true;
return true;
}*
}
public function logout(){
session_destroy();
}
Как видно из кода, внутри звездочек (*) я пытаюсь проверить, равно ли значение поля 2. Если да, я хочу, чтобы оно вошло в систему. Если нет, я хочу, чтобы оно перенаправляло.
Моя ошибка:
Неустранимая ошибка: необработанное исключение «PDOException» с сообщением «SQLSTATE [HY093]: недопустимый номер параметра: параметр не был определен» в D: ***** \ classes \ class.user.php: 42 Трассировка стека: # 0 D: ****** \ classes \ class.user.php (42): PDOStatement-> execute (Array) # 1 D: ******* \ login.php (43): пользователь-> login (‘ demo ‘,’ demo ‘) # 2 {main} выбрасывается в D: ******* \ classes \ class.user.php в строке 42
Присвойте правильное значение в предложении WHERE
$st = $this->_db->prepare('SELECT userGroup FROM users WHERE username = :username');
$st->execute(array('username' => "some user name"));
$rows = $st->fetch();
if($rows['userGroup'] == 2) {
$_SESSION['loggedin'] = true;
return true;
}
Здесь есть несколько проблем.
$st = $this->_db->prepare('SELECT userGroup FROM users WHERE username = :username');
$st->execute(array('userGroup' => 2));
В призыве к execute()
вам нужно указать значение для заполнителя, который вы определили в вызове prepare()
, Так что вы должны делать что-то вроде
$st = $this->_db->prepare('SELECT userGroup FROM users WHERE username = :username');
$st->execute(array(':username' => $username));
Затем, далее, вы делаете:
if($st = 2) {
Во-первых, возвращение из execute()
будет логическим — вам нужно получить строки из результирующего набора. Также, =
является оператором присваивания, а не оператором сравнения. Вам нужно использовать либо ===
или же ==
, В идеале вы бы сделали:
$group = (int) $st->fetchColumn();
if ($group === 2) {
Попробуй это:
$st = $this->_db->prepare('SELECT 1
FROM users
WHERE username = :username AND userGroup = 2');
$st->execute(array(':username' => $username));
$row = $st->fetch();
if ($row) {
$_SESSION['loggedin'] = true;
return true;
}
Вы можете сделать userGroup
проверить в запросе, а не в PHP.