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