0

簡単な「アクセス」レベル チェックを追加しようとしましたが、データベースから値を取得できません。常に Null を取得します。User とほぼ同じクエリですが、Pass チェックを行います。

とにかく、これが私のコードです。もう少しうまくやれるかもしれません!

*コメントに応じて更新

    public function userLogin() {


    $success = false;
    try {
        $con = new PDO(DB_DSN, DB_USERNAME, DB_PASSWORD);
        $con->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        $sql = "SELECT * FROM users WHERE username = :username AND password = :password LIMIT 1";

        $stmt = $con->prepare($sql);
        $stmt->bindValue(":username", $this->username, PDO::PARAM_STR);
        $stmt->bindValue(":password", hash("sha256", $this->password . $this->salt), PDO::PARAM_STR);
//            $stmt->bindValue("access", $this->access, PDO::PARAM_INT);
        $stmt->execute();


        $valid = $stmt->fetchColumn();

        if ($valid) {
            $success = true;
            session_start();
            $_SESSION['username'] = $this->username;
        }

        $con = null;
        return $success;
    } catch (PDOException $e) {
        echo $e->getMessage();
        return $success;
    }
}

public function auth() {


    $con = new PDO(DB_DSN, DB_USERNAME, DB_PASSWORD);
    $con->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $sql = "SELECT access FROM users WHERE access = :1 OR access = :2";
    $stmt = $con->prepare($sql);
    $stmt->bindValue(":access", $this->access, PDO::PARAM_INT);
    $stmt->execute();

    $access = $stmt->fetchColumn();
    if ($access == 1) {
        session_start();
        $_SESSION['isAdmin'] = $this->access;
    } if ($access == 2) {
        session_start();
        $_SESSION['isUser'] = $this->access;
    }
}

「headerauth.php」という別のファイルがあります。これは、動作する Welcome $_SESSION['username'] を含む小さな DIV ブロックであり、テスト/開発上の理由から、最後に Var_Dump があり、次の結果が得られます。

配列 'ユーザー名' => 文字列 'テスト' (長さ = 4)

userLogin 関数と同じブロックに Auth があるとき、値は以前は

ヌル;

4

1 に答える 1

1

コードに少なくとも 3 つの誤りがあります。

  • $stmt->bindValue > PDOStatement::bindValue は、最初のパラメーターが整数 (疑問符ステートメント パラメーターの場合) または文字列 (名前付きパラメーターの場合) であることを期待します。名前付きパラメータを使用している場合は、コロンで始める必要があります! 例えば$stmt->bindValue(":username", $this->username, PDO::PARAM_STR);

  • session_start($_SESSION) > session_start はパラメータを想定していません(void)

  • $stmt->bindValue("access", $this->access, PDO::PARAM_INT) > SQL クエリに名前付きパラメーターへのアクセス
    がありません そこで例外をスローする必要があります。

カスタム例外ハンドラー / display_errors オフ / error_reporting オフはありますか? なぜ例外がスローされないのかわかりません..

ドキュメント:

于 2013-08-13T08:33:59.623 に答える