2

ユーザーを認証する関数を書いています。データベースとの接続を作成し、クエリを準備し、パラメーターをバインドし、クエリを実行し、結果を変数にバインドし、クエリが結果を返したかどうかを確認します。

一致した場合は、(変数にバインドされた) 結果を比較し、ステートメントを閉じ、接続を閉じてから、適切な値を返します。まあ、それは私がやっていることだと思いますが、構文エラーが発生し続け、何が間違っているのかわかりません:

構文エラー: 予想: exit、if、識別子、変数、echo、do、while、for、foreach、declare、switch、break、continue、function、return、try、throw、use、global、unset、isset、empty、class 、インターフェイス、配列、{、}、include、include_once、eval、require、require_once、print、';'、+、-、!、~、++、-、@、[、new、static、abstract、final , (, $

私のコード:

/**
     * Authenticates a user. 
     * @param type $email - String value
     * @param type $hashedPassword - String value
     * @return true if user is authenticated or false otherwise - Boolean value
     */
    function isValidUser($email, $hashedPassword)
    {
        //This variable will hold the value returned from the query to the database.
        var $rPassword = NULL;

        //Establish a connection
        $mysqli = new mysqli($GLOBALS['dbServer'], $GLOBALS['dbUserName'], $GLOBALS['dbPassword'], $GLOBALS['dbName']);

        //Check if connection failed
        if($mysqli->connect_error)
        {
            die('Connect Error (' . $mysqli->connect_errno . ') ' 
                    . $mysqli->connect_error);
        }

        $stmt = $mysqli->prepare("SELECT password FROM user_info WHERE email=?");
        $stmt->bind_param('s', $email);
        $stmt->execute();
        $stmt->bind_result($rPassword);
        if($stmt->fetch())
        {
            if(($rPassword != null) && ($rPassword == $hashedPassword))
            {
                $stmt->close();
                $mysqli->close();
                return true;
            } 
        }           
        $stmt->close();
        $mysqli->close();
        return false;           
    }

私は準備済みステートメントを使用せずにこれを行っていましたが、コードは正常に機能しましたが、いくつかの調査を行ったところ、準備済みステートメントは SQL インジェクションを防ぐのに役立つため、進むべき道であることがわかりました。

4

3 に答える 3

3
var $rPassword = NULL;

次のようにする必要があります。

$rPassword = NULL;

varクラスのプロパティを初期化するためのものです。ドキュメントを参照してください。クラスを使用している場合は、メソッド (関数) の外で初期化してから、 を介してプロパティにアクセスする必要があります$this->rPassword

于 2013-01-27T22:17:44.943 に答える
2

このvarキーワードは、PHP 5.0 から廃止されました...

これは、PHP4 でクラス メンバー変数を宣言するためのものでしたが、もう必要ありません。PHP5 では動作しますがE_STRICT、バージョン 5.0.0 からバージョン 5.1.2 までの PHP では警告が発生します。

于 2013-01-27T22:25:07.640 に答える
0

あなたには2つの間違いがあります

rPassword を NULL として再起動しないでください。 $rPassword = 0; のようにします。または、tow NULL と null を同じ NULL に両方ともキャップを付けて作成します。次に、rPassword が必要な結果を得られない場合、このように正しい動詞を渡す必要があります ここを見てください

http://php.net/manual/en/mysqli-stmt.bind-result.php

 $stmt->bind_result($rPassword);
        if($stmt->fetch())
        {
            if(($rPassword == null) || ($rPassword != $hashedPassword))
            {
                $stmt->close();
                $mysqli->close();
                return false;
            } 
        }           
于 2013-01-27T22:19:08.693 に答える