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ステートメントにより)。後で が存在すると仮定$stateし、そのメソッドにアクセスしようとします。

これにより、エラーが発生します。

最も簡単な修正は、if($state->rowCount() == 1)とその 'true' ブランチを の直後に移動する$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

あなたのエラーは、両方が空でない場合にuser::login()のみステートメントを準備することです。ただし、その場合でも、コードはステートメントを実行しようとします。明らかに、条件のその時点では、ステートメント オブジェクトはインスタンス化されていないため、エラーが発生します。$name$pass

これは、リクエストの送信時にユーザー名とパスワードが空でないことを確認するだけで修正できます。ちょっとした提案ですが、リクエストで使用されるHTTP リクエスト メソッドを示す値に依存しないこともお勧めします。特に一部のブラウザーは送信入力タイプの値をまったく送信しないことが知られているため、その動作に依存しないことを強くお勧めします。代わりに、リクエストメソッドがorであるかどうかを判断するために使用します (気にしない場合を除きますが、フォームではリクエストメソッドがに設定されています$_SERVER['REQUEST_METHOD']POSTGETpostだから私はあなたがそうすると思います)。さらに、オブジェクトのメソッドに渡すためだけに $_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> 
于 2012-12-09T13:49:27.307 に答える
0

$state名前またはパスのいずれかが空の場合は定義しません。

于 2012-12-09T13:38:22.313 に答える
0

これをログイン PHP コードに追加する必要があります。

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