Prepare(),Execute()有效,但FETCH_ASSOC不起作用

问题描述 投票:0回答:1

我正在尝试创建一个简单的登录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并作为字符串抛出,而不是查找关联的值?

php pdo fetch prepared-statement
1个回答
1
投票

[FETCH_ASSOC运行正常,问题出在SQL中,如果您在单引号之间编写字段,则获取字符串而不是字段内容。

只需写没有引号的字段:

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

并且您应该使用prepared statements防止SQL注入攻击。

© www.soinside.com 2019 - 2024. All rights reserved.