2014-11-27 3 views
0

Я хотел бы получить группу пользователей из моей базы данных, а затем проверить, является ли она 2 (что будет означать ее Администратор). Я в настоящее время этот код в качестве установки:Получение значения из поля базы данных и проверка того же, что и переменная в PHP?

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. Если это так, я хочу, чтобы он входил в систему. Если нет, я хочу, чтобы он перенаправлялся. Моя ошибка:

Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[HY093]: Invalid parameter number: parameter was not defined' in D:*****\classes\class.user.php:42 Stack trace: #0 D:******\classes\class.user.php(42): PDOStatement->execute(Array) #1 D:*******\login.php(43): User->login('demo', 'demo') #2 {main} thrown in D:*******\classes\class.user.php on line 42

+0

Почему вы устанавливаете '$ hashed' и не используете его? И каковы эти символы '*', выполняемые в 'login()' функции? Вы не можете выделить в блоках кода. – Barmar

ответ

1

Назначают правильное значение в ИНЕКЕ

$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; 
} 
+0

Теперь он регистрирует меня, в то время как в БД моя userGroup = 1. Поэтому я должен быть в состоянии войти. – MrDikke

1

Есть несколько проблем.

$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() будет булево - вам нужно на самом деле выбрать строку (s) из набора результатов. Кроме того, = является оператором присваивания, а не оператором сравнения. Вы должны использовать либо ===, либо ==. В идеале, вы должны сделать следующее:

$group = (int) $st->fetchColumn(); 
if ($group === 2) { 
+0

До сих пор лучшее объяснение, '' '' $ st''' в '' 'if''' должно быть заменено' '' $ rows ['userGroup'] '' 'тоже. – chrki

+0

Да, я просто это заметил, спасибо @chrki! – Stephen

1

Попробуйте это:

$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.