1

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

注意:未定义变量:第 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

4 回答 4

1

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

这会导致您的错误。

最简单的解决方法是在if($state->rowCount() == 1)之后移动其“真实”分支$state->execute(),因此仅在执行状态时才检查状态。

如果用户已登录,则从函数返回。因此,您可以离开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;
}
于 2012-12-09T13:38:40.613 回答
0

您没有定义$statename 或 pass 何时为空。

于 2012-12-09T13:38:22.313 回答
0

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

require_once('../resources/config.php');
于 2012-12-09T13:39:09.663 回答
0

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

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

<?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> 
于 2012-12-09T13:49:27.307 回答