我正在尝试创建一个简单的登录API,该API允许在输入匹配的电子邮件和密码后登录数据库,并在结果中抛出该行的ID。
注意:1)我仅在测试目的的地方使用var_dump。2)Discalimer:我不是为了简化流程而使用密码加密。3)我正在使用PDO,但没有框架。这是login.php代码的一部分。 'user'是在user.php中声明的类,表名称为'users',其中包含ID,电子邮件,密码和用户名列。
//prepare user object
$user= new user($db);
$user->email=isset($_GET['email'])?$_GET['email']:die();
$user->password=isset($_GET['password']) ? $_GET['password'] : die();
$stmt=$user->login();
var_dump($stmt);
if ($stmt->rowCount()>0) {
$row=$stmt->fetch(PDO::FETCH_ASSOC);
var_dump($row);
$user_arr=array(
"status" => true,
"message" => "succesfully logged in",
"id" => $row['id']
);
} else {
$user_arr=array(
"status" => false,
"message" => "login attempt failed due to invalid email or password"
);
}
print_r(json_encode($user_arr));
下面是来自user.php的登录功能的代码段
function login(){
//select all query
$query="SELECT
'id','email','password','username'
FROM ".$this->table_name."
WHERE
email='".$this->email."'
AND password='".$this->password."'";
//prepare query statement
$stmt=$this->conn->prepare($query);
if ($stmt->execute()) {
return $stmt;
} else {
return null;
}
输出为
object(PDOStatement)#4(1){[“ queryString”] =>string(194)“ SELECT'id','email','password','username'来自用户哪里email='[email protected]'AND password ='def456'“}数组(4){[“ id”] =>string(2)“ id”[“电子邮件”] =>string(5)“电子邮件”[“密码”] =>string(8)“密码”[“用户名”] =>字符串(8)“用户名”}{“ status”:true,“ message”:“已成功登录”,“ id”:“ id”}
所以,基本上,FETCH_ASSOC
不起作用?为什么将id视为id并作为字符串抛出,而不是查找关联的值?
[FETCH_ASSOC运行正常,问题出在SQL中,如果您在单引号之间编写字段,则获取字符串而不是字段内容。
只需写没有引号的字段:
$query = "SELECT id, email, password, username ...";
并且您应该使用prepared statements防止SQL注入攻击。