2013-07-20 2 views
0

Я пытаюсь поставить себя в ООП, и у меня есть проблема с переменной областью.Неопределенная переменная, следующая за вызовом метода

Все работает, кроме сеанса, и все сообщения правильно.

Объявлена ​​моя «таблица сеанса» и ее элементы, но ее переменные остаются неопределенными. Я получаю следующее сообщение об ошибке:

Примечание: Undefined переменной: строку
Примечание: Попытка получить свойство необъектных

Что я могу сделать, чтобы получить доступ к $row?

Это мой код для класса, в том числе его методы:

$db = db::connect(); 

class auth { 
    protected $login; 
    protected $password; 
    protected $email; 

    public function setLogin($login) { 
     $this->login = $login; 
    } 

    public function setPassword($password) { 
     $this->password = $password; 
    } 

    public function login($fields, $table, $col_login, $col_password) { 
     $query = Db::getInstance()->prepare('SELECT ' . $fields . ' FROM ' . $table . ' WHERE ' . $col_login . ' = :login AND ' . $col_password . ' = :password'); 

     $query->bindValue( ':login', $this->login, PDO::PARAM_STR); 
     $query->bindValue(':password', $this->password, PDO::PARAM_STR); 
     $query->execute(); 

     if ($query->rowCount() > 0) { 
     $row = $query->fetch(PDO::FETCH_OBJ); 

     echo '<pre>'; 
     print_r($row->u_login); 
     echo '</pre>'; 

     return true; 
     } 
     else { 
     return false; 
     } 

     $query->closeCursor(); 
    }  
} 

Вот мой код формы; это от того, где я вызываю метод класса:

<?php 
    session_start(); 
    if (isset($_POST['login_submit'])) { 
     if (!empty($_POST['login']) && !empty($_POST['password'])) { 
     $auth = new auth(); 
     $auth->setLogin($_POST['login']); 
     $auth->setPassword(sha1($_POST['password'])); 

     if ($auth->login('u_login,u_password,u_email,u_id_level', 'users', 'u_login', 'u_password')) {     
      $_SESSION['back_office'] = array(
              'login' => $row->u_login, // Error, $row is undefined 
              'level' => $row->u_level, 
              'email' => $row->u_email  
              ); 
     } 
     else { 
      message::showError('Compte non reconnu'); 
     } 
     } 
     else { 
     message::showError('Veuillez remplir tous les champs'); 
     } 
    } 
?> 

<form action="test.php" name="loginform" method="post"> 
    <input type="text" name="login" /> 
    <input type="password" name="password" /> 
    <input type="submit" name="login_submit" value="Se connecter" /> 
</form> 
+0

Только хэширование пароля с помощью SHA1 недостаточно, вместо этого используйте bcrypt. См. Http://www.php.net/manual/en/function.password-hash.php –

+0

Вам нужно вернуть $ row, чтобы вы могли использовать свой метод. Например: 'public function smth() {... .... $ row = $ query-> fetch(); return $ row} ..... 'login' => $ auth-> smth-> u_login; ' –

+0

@Marcel Korpel Да, извините, я забыл чанг. Thx ;-) – user2584229

ответ

0

В функции Идента вам нужно вернуться Row

if($query->rowCount() > 0){ 
      $row = $query->fetch(PDO::FETCH_OBJ);     
      return $row; 
     }else{ 
      return false; 
     } 

В вашем вызове присвоить возвращаемое значение login для $row

if (($row = $auth->login('u_login,u_password,u_email,u_id_level', 'users', 'u_login', 'u_password'))) {

+0

Спасибо ;-) Работайте отлично! – user2584229

0

Вы должны вернуть $row вместо return true

$row = $query->fetch(PDO::FETCH_OBJ);     
echo '<pre>'; 
print_r($row->u_login); 
echo '</pre>'; 
return $row; // return true; 

И проверить, как этот

if($row = $auth->login('u_login,u_password,u_email,u_id_level', 
         'users', 'u_login', 'u_password') !== false) 

Затем вы можете установить значение $row

$_SESSION['back_office'] = array(
    'login' => $row->u_login, 
    'level' => $row->u_level, 
    'email' => $row->u_email  
); 
0

$ подряд не глобальной переменной, так что вы не можете получить доступ извне.

Между плохим, чтобы сделать его глобальным.

Я предлагаю вам, например, поставить переменную с именем $ authenticated_user.

Как что:

class auth { 
    // ... 
    protected $authenticated_user; 
    //... 
    public function login(// ...) { 
    // ... 
     $authenticated_user = $query->fetch(PDO::FETCH_OBJ); 
    // ... 
    } 

    public getUser() 
    { return $authenticated_user; } 
} 

В вас Auth вызова часть:

$row = $auth->getUser(); 

Это должно быть хорошо.

Смежные вопросы