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

Php Prepare()、Execute()工作,但FETCH_ASSOC不工作,php,pdo,prepared-statement,Php,Pdo,Prepared Statement,我正在尝试创建一个简单的登录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-&

我正在尝试创建一个简单的登录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;
}
输出是

objectPDOStatement4 1{ [查询字符串]=> string194选择 “id”、“电子邮件”、“密码”、“用户名” 来自用户 哪里 电子邮件upasana@api.com' 和密码='def456' } 阵列4{ [id]=> string2 id [电子邮件]=> string5电子邮件 [密码]=> string8密码 [用户名]=> string8用户名 } {状态:true,消息:成功登录,id:id}


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

FETCH\u ASSOC工作正常,问题在于sql中,如果您在单引号之间写入字段,那么您将获得字符串而不是字段内容

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

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

您应该使用来防止SQL注入攻击。

FETCH\u ASSOC工作正常,问题在于您的SQL,如果您在单引号之间写入字段,您将获得字符串,而不是字段内容

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

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

您应该使用来防止SQL注入攻击。

永远不要以明文或使用MD5/SHA1存储密码!仅存储使用PHP创建的密码哈希,然后可以使用进行验证。看看这篇文章:了解更多关于我很清楚警告和免责声明,但这不是一个生产代码,所以你的答案如何相关?永远不要以明文或使用MD5/SHA1存储密码!仅存储使用PHP创建的密码哈希,然后可以使用进行验证。看看这篇文章:并了解更多关于我很清楚的警告和免责声明,但这不是一个生产代码,所以你的答案如何站在相关?