Prepare()、Execute() 工作但 FETCH_ASSOC 不工作
Prepare(), Execute() working but FETCH_ASSOC not working
我正在尝试创建一个简单的登录 API,它允许在输入匹配的电子邮件和密码时登录到数据库,并在结果中抛出该行的 ID。
注意:1) 我在一些地方使用 var_dump 只是为了测试目的。
2) discalimer:我没有使用密码加密只是为了简单理解流程。
3) 我正在使用 PDO 但没有框架。
这是 login.php 代码的一部分。 'user' 是在 user.php 中声明的 class,table 名称是 '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'
FROM users
WHERE
email='upasana@api.com'
AND password='def456'"
}
array(4) {
["id"]=>
string(2) "id"
["email"]=>
string(5) "email"
["password"]=>
string(8) "password"
["username"]=>
string(8) "username"
}
{"status":true,"message":"succesfully logged in","id":"id"}
所以,基本上,FETCH_ASSOC
不起作用?为什么它把 id 当作 id 并作为字符串抛出而不是找到关联的值?
FETCH_ASSOC 工作正常,问题出在你的 sql,如果你在单引号之间写字段,你得到的是字符串而不是字段内容。
只写不带引号的字段:
$query = "SELECT id, email, password, username ...";
并且您应该使用 prepared statements 来防止 SQL 注入攻击。
我正在尝试创建一个简单的登录 API,它允许在输入匹配的电子邮件和密码时登录到数据库,并在结果中抛出该行的 ID。
注意:1) 我在一些地方使用 var_dump 只是为了测试目的。
2) discalimer:我没有使用密码加密只是为了简单理解流程。
3) 我正在使用 PDO 但没有框架。
这是 login.php 代码的一部分。 'user' 是在 user.php 中声明的 class,table 名称是 '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' FROM users WHERE email='upasana@api.com' AND password='def456'" } array(4) { ["id"]=> string(2) "id" ["email"]=> string(5) "email" ["password"]=> string(8) "password" ["username"]=> string(8) "username" } {"status":true,"message":"succesfully logged in","id":"id"}
所以,基本上,FETCH_ASSOC
不起作用?为什么它把 id 当作 id 并作为字符串抛出而不是找到关联的值?
FETCH_ASSOC 工作正常,问题出在你的 sql,如果你在单引号之间写字段,你得到的是字符串而不是字段内容。
只写不带引号的字段:
$query = "SELECT id, email, password, username ...";
并且您应该使用 prepared statements 来防止 SQL 注入攻击。