未定义的变量:如果是rowcount则导致未定义的对象的状态

时间:2012-12-09 13:32:48

标签: php login pdo

昨天,脚本运行得很好,当我填写正确的信息时,我仍然被重定向,但是当我没有得到以下错误时:

  

注意:未定义的变量:第26行的C:\ xampp \ htdocs \ webshop \ resources \ library \ login.class.php中的状态

     

致命错误:在第26行的C:\ xampp \ htdocs \ webshop \ resources \ library \ login.class.php中的非对象上调用成员函数rowCount()

<?php
        require_once('../resources/config.php');
        class user
        {
            private $db;

            public function __construct()
            {
                $this->db = new config();
                $this->db = $this->db->dbConnect(); 
            }

            public function login($name, $pass)
            {
                if(!empty($name) && !empty($pass))
                {
                //parameter query to prevent sql injection
                $state = $this->db->prepare("select * from users where name=? and pass=?");
                $state->bindParam(1, $name);
                $state->bindParam(2, $pass);
                $state->execute();
                }



                if($state->rowCount() == 1)
                {
                        header('location: index?page=basket.php');
                        echo "you have been loged in as <b>$dbuser</b>";


                    }else{

                        echo "incorrect user";
                    }




            }
        }

        ?>

使用

<?php
require_once('../resources/library/login.class.php');

    if(isset($_POST['submit']))
    {
        $name = $_POST['user'];
        $pass = $_POST['pass'];

        $obj_login = new user();
        $obj_login->login($name, $pass);
    }   
?>

<form method="post" action="index.php?page=login.php">
    username: <input type="text" name="user"/>
    password: <input type="text" name="pass"/>
    <input type="submit" name="submit" value="Login"/>
</form> 

有人可以指导我吗?

4 个答案:

答案 0 :(得分:1)

如果$name$pass为空,则未定义$state(由于您的if - 语句)。稍后您假设存在$state并尝试访问其方法。

这会导致您的错误。

最简单的解决方法是在if($state->rowCount() == 1)之后立即移动$state->execute()及其'true'分支,因此仅检查状态是否已执行。

如果用户已登录,请从该功能返回。因此,当登录失败时,您可以离开echo "incorrect user";来处理案例。

public function login($name, $pass)
{
    if(!empty($name) && !empty($pass))
    {
        //parameter query to prevent sql injection
        $state = $this->db->prepare("select * from users where name=? and pass=?");
        $state->bindParam(1, $name);
        $state->bindParam(2, $pass);
        $state->execute();

        if($state->rowCount() == 1)
        {
            header('location: index?page=basket.php');
            // do NOT output content after you set this header!
            // echo "you have been loged in as <b>$dbuser</b>";
            return true;
        }
    }
    echo "incorrect user";
    return false;
}

答案 1 :(得分:0)

当名称或传递为空时,您不定义$state

答案 2 :(得分:0)

您必须在登录PHP代码中添加此内容:

require_once('../resources/config.php');

答案 3 :(得分:0)

您的错误是user::login()仅在$name$pass都不为空的情况下准备语句。但是,如果它们仍然是代码仍然尝试执行该语句。显然,在那个条件下,语句对象从未被实例化,这就是你得到错误的原因。

您可以通过在提交请求时检查用户名和密码是否为空来解决此问题。一个小的建议也是依赖于一个值来告诉您请求中使用的 HTTP请求方法。我强烈建议你不要依赖这种行为,特别是因为一些浏览器根本不会发送提交输入类型的值。而是使用$_SERVER['REQUEST_METHOD']来确定请求方法是POST还是GET(除非您不关心,但在您的表单中,请求方法设置为post所以我假设你这样做)。此外,您不需要将$ _POST变量复制到另一个变量中,只是为了将它们传递给对象的方法。那是浪费。您还可以从代码中的任何范围访问超级全局变量,例如$ _POST(就像一个FYI )。

<?php
require_once('../resources/library/login.class.php');

if(isset($_SERVER['REQUEST_METHOD']) && strtoupper($_SERVER['REQUEST_METHOD']) == 'POST')
    {
        if (empty($_POST['user']) || empty($_POST['pass']))
            {
                echo "Please supply a username and password!";
            } else {
                $obj_login = new user();
                $obj_login->login($_POST['user'], $_POST['pass']);
            }
    }   
?>

<form method="post" action="index.php?page=login.php">
    username: <input type="text" name="user"/>
    password: <input type="text" name="pass"/>
    <input type="submit" name="submit" value="Login"/>
</form>