Prepare()、Execute() 工作但 FETCH_ASSOC 不工作

代码我的

我正在尝试创建一个简单的登录 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 中登录函数的片段

 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' FROM users WHERE email='[email protected]' AND password='def456'" } array(4) { ["id"]=> string(2) "id" ["email"]=> string(5) "email" ["password"]=> string( 8) "password" ["username"]=> string(8) "username" } {"status":true,"message":"成功登录","id":"id"}

那么,基本上FETCH_ASSOC是行不通的?为什么它将 id 视为 id 并作为字符串抛出而不是查找关联值?

杰普比奥

FETCH_ASSOC 工作正常,问题出在您的 sql 中,如果您在单引号之间写入字段,您将获得字符串而不是字段内容。

只需编写不带引号的字段:

$query = "SELECT id, email, password, username ...";

并且您应该使用准备好的语句来防止 SQL 注入攻击。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章