0

私は単純なログインシステムを持っていますが、行数をフェッチしようとしても何も得られません。同じ方法が常に機能していました。今日何が起こっているのかわかりません。

コード:

<?php
class LoginClass {
    public $User;
    public $Pass;
    public $Query;
    function Init() {
        $User = $this->User;
        $Pass = $this->Pass;
        if($User != '')
        {
            if($Pass != '')
            {
                $this->HashPass();
            }
            else
            {
                echo 'Please Enter A Password.';
            }
        }
        else
        {
            echo 'Please Enter A Username or E-Mail.';
        }
    }

    function HashPass() {
        $Pass = $this->Pass;
        $this->Pass = hash('sha256', $Pass);
        $this->CheckUser();
    }

    function CheckUser() {
        $User = $this->User;
        if(!filter_var($User, FILTER_VALIDATE_EMAIL))
        {
            $this->Query = 'SELECT * FROM Users WHERE User = "'.$User.'" AND Pass = "'.$this->Pass.'"';
        }
        else
        {
            $this->Query = 'SELECT * FROM Users WHERE EMail = "'.$User.'" AND Pass = "'.$this->Pass.'"';
        }
        $this->CheckDB();
    }

    function CheckDB() {
        $Query = $this->Query;
        $Connect = new mysqli("127.0.0.1", "root", "", "Data");
        $Stmt = $Connect->prepare($Query)
        $Stmt->execute();
        $Stmt->store_result();
        echo $Stmt->num_rows;
        $Stmt->close();
        $Connect->close();
    }

    function SetupSession() {
        echo 'Test';
    }
}

Check DB がここで問題であり、その関数でクエリ変数をエコーアウトすることができます。すべて問題ありません。

SELECT * FROM ユーザー WHERE ユーザー = "テスト" AND パス = "532eaabd9574880dbf76b9b8cc00832c20a6ec113d682299550d7a6e0f345e25"

DB もチェックしましたが、すべてのテーブルが正しくセットアップされており、パスワードはありません。

4

1 に答える 1

0

OK、コメント領域よりも多くのスペースが必要です。問題は明らかにこのブロックにあります:

function CheckDB() {
    $Query = $this->Query;
    $Connect = new mysqli("127.0.0.1", "root", "", "Data");
    $Stmt = $Connect->prepare($Query)
    $Stmt->execute();
    $Stmt->store_result();
    echo $Stmt->num_rows;
    $Stmt->close();
    $Connect->close();
}

準備されたステートメントにパラメーターをバインドしていないためだと思います。以前のステートメントにインラインで既に含まれています。したがって、おそらく次のことを行う必要があります。

準備されていないステートメントに切り替える

ここでの簡単なオプションは、準備されていないステートメントに切り替えることです。ブロックを次のものに置き換えます。

function CheckDB() {
    $Query = $this->Query;
    $Connect = new mysqli("127.0.0.1", "root", "", "Data");
    $Stmt = $Connect->query($Query)
    echo $Stmt->num_rows;
    $Stmt->close();
    $Connect->close();
}

このアプローチには注意が必要です。 を定義するブロックでユーザー入力をサニタイズする必要があります$User。そうしないと、mysql インジェクションにさらされることになります。そのブロックで、次の行を変更します。

$User = $this->User;

以下に:

$User = mysql_real_escape_string($this->User);
于 2013-04-21T16:35:05.237 に答える