-1

私はここでPHPとOOPプログラミングを学んでいます。SQLインジェクションを防ぐために変更しようとしている以下の動作コードがあります。他の人がPDOの使い方を教えてくれました。しかし、私はそれを機能させるのに苦労しています。

基本的に、この関数はとを渡し$uid$passwordユーザーをチェックすることです。私は何が間違っているのですか?

user_function.php

<?php

class DB_Functions {

    private $db;

    function __construct() {

        require_once 'db_connect.php';

        $this->db = new DB_Connect();
        $this->db->connect();
    }

    public function getUser($uid, $password) {
        $result = mysql_query("SELECT * FROM users WHERE id = '$uid' AND pswd = '$password'") or die(mysql_error());

        $no_of_rows = mysql_num_rows($result);
        if ($no_of_rows > 0) {

            $result = mysql_fetch_array($result);
            return $result;    

        } else {

            return false;
        }
    }

}

?>

変更されたコード

<?php

class DB_Functions {

    private $db;

    function __construct() {

        require_once 'db_connect.php';

        $this->db = new DB_Connect();
        $this->db->connect();
    }

    public function getUser($uid, $password) {
        $stmt = $db->prepare("SELECT * FROM users WHERE id=? AND pswd=?");
        $stmt->execute(array($uid, $password));
        return $stmt->fetch();
    }

}

?>

ユーザーを確認します(index.php)

require_once 'include/db_functions.php';
$db = new DB_Functions();


if ($tag == 'login') {

    $uid =mysql_real_escape_string($_POST['id']);
    $password =mysql_real_escape_string($_POST['pswd']);

    // check for user
    $user = $db->getUser($uid, $password);

    if ($user != false) {

        $response["success"] = 1;
        $response["user"]["id"] = $user["id"];

        echo json_encode($response);
    } else {

        $response["error"] = 1;
        $response["error_msg"] = "Incorrect email or password!";
        echo json_encode($response);
    }
4

2 に答える 2

3

あなたは完全にPDOの要点を見逃しています。placeholderseを使用して適切に準備されたクエリを使用すると、自分でエスケープする必要はありません。

同様に、mysql_real_escape_string()は、で確立されたアクティブなデータベース接続があるかどうかに依存しますmysql_connect()。これがないと、m_r_e_s()は機能せず、「失敗」に対してブール値のfalseが返されます。次に、これらのfalse値をクエリで使用しようとします。

PDOによって確立されたDB接続は、mysql_ ()、mysqli_()などと共有できません...これらの各ライブラリは、独自の独立した接続プールを保持しています。

于 2012-08-21T18:59:49.280 に答える
2

PDOを使用しているため、を使用することはできませんmysql_real_escape_string()。PDOは準備されたクエリでパラメータを自動的にエスケープするため、パラメータをエスケープする必要はありません。

したがって、次のgetUser()ように呼び出します。

if ($tag == 'login') {

    // check for user
    $user = $db->getUser( $_POST['id'], $_POST['pswd']);

    ... etc
于 2012-08-21T19:00:17.040 に答える