方法调用后的未定义变量

时间:2013-07-20 09:48:27

标签: php scope

我试图将自己置于OOP中,并且我对可变范围存在问题。

除会话数组外,一切正常,所有内容都正确发布。

我的'会话表'及其元素已声明但其变量仍未定义。我收到以下错误消息:

  

注意:未定义的变量:行
  注意:尝试获取非对象的属性

我可以做些什么才能访问$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>

3 个答案:

答案 0 :(得分:0)

在您的身份验证功能中,您需要返回行

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'))) {

答案 1 :(得分: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    
);

答案 2 :(得分:0)

$ row不是全局变量,因此您无法从外部访问。

让它成为全球性之间是不好的。

我建议你输入一个名为$ 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();

那应该没事。