修改后的PHP PDO登录脚本仍然无效

时间:2012-08-21 18:57:35

标签: php sql pdo prepared-statement

我正在学习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);
    }

2 个答案:

答案 0 :(得分:3)

你完全忽略了PDO的观点。通过使用占位符进行适当准备的查询,您无需自己进行任何转义。

同样,mysql_real_escape_string()依赖于与mysql_connect()建立的活动数据库连接。如果没有这个,你的m_r_e_s()将无效,并且会为&#34;失败&#34;返回一个布尔值false。然后,您尝试在查询中使用这些错误值。

PDO建立的数据库连接不能与mysql_ (),mysqli _ ()等共享......每个库中都有自己独立的连接池。

答案 1 :(得分:2)

您正在使用PDO,因此无法使用mysql_real_escape_string()。您无需转义参数,因为PDO会在准备好的查询中自动为您转义它们。

所以,只需像这样呼叫getUser()

if ($tag == 'login') {

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

    ... etc