【发布时间】:2020-09-17 13:32:25
【问题描述】:
我正在尝试创建一个简单的登录 API,它允许在输入匹配的电子邮件和密码时登录数据库,并在结果中抛出该行的 ID。
注意:1) 我在某些地方使用 var_dump 仅用于测试目的。
2) discalimer:我不使用密码加密只是为了简单地理解流程。
3) 我正在使用 PDO,但没有框架。
这是 login.php 代码的一部分。 'user' 是在 user.php 中声明的类,表名是 'users',包含 id、email、密码和用户名等列。
//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中登录功能的sn-p
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;
}
输出是
对象(PDOStatement)#4 (1) { [“查询字符串”]=> 字符串(194)“选择 'id','email','密码','用户名' 来自用户 在哪里 电子邮件='upasana@api.com' AND 密码='def456'" } 数组(4){ [“身份证”]=> 字符串(2)“身份证” [“电子邮件”]=> 字符串(5)“电子邮件” [“密码”]=> 字符串(8)“密码” [“用户名”]=> 字符串(8)“用户名” } {"status":true,"message":"成功登录","id":"id"}
所以,基本上,FETCH_ASSOC 不起作用?为什么将 id 视为 id 并作为字符串抛出而不是查找关联的值?
【问题讨论】:
-
切勿以明文形式或使用 MD5/SHA1 存储密码! 仅存储使用 PHP 的
password_hash()创建的密码哈希,然后您可以使用password_verify()进行验证。看看这个帖子:How to use password_hash 并了解更多关于bcrypt & password hashing in PHP -
我很清楚这些警告并给出了免责声明,但这不是生产代码,那么您的答案有何相关性?
标签: php pdo prepared-statement