Prepare (), Execute () работают, но FETCH_ASSO C не работает - PullRequest
0 голосов
/ 30 мая 2020

Я пытаюсь создать простой API входа, который позволяет входить в базу данных при вводе совпадающего адреса электронной почты и пароля и выдает идентификатор этой строки в результате.

Примечание: 1) Я использую var_dump в некоторых местах только для тестовых целей.
2) отказ от ответственности: я не использую шифрование паролей только для простоты понимания потока.
3) Я использую PDO, но без фреймворка. Вот часть кода логина. php. 'user' - это класс, объявленный в user. php, а имя таблицы - 'users', содержащее столбцы, такие как идентификатор, адрес электронной почты, пароль и имя пользователя.

//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));

Ниже приведен фрагмент функции входа в систему от пользователя . 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;
}

Результат:

объект (PDOStatement) # 4 (1) {["queryString"] => string (194) "SELECT 'id ',' email ',' password ',' username 'ОТ пользователей ГДЕ email =' upasana@api.com 'AND password =' ​​def456 '"} массив (4) {[" id "] => строка (2)" id " ["email"] => строка (5) "email" ["пароль"] => строка (8) "пароль" ["имя пользователя"] => строка (8) "имя пользователя"} {"status": true, "message": "успешно авторизован", "id": "id"}

Итак, в основном, FETCH_ASSOC не работает? Почему он обрабатывает идентификатор как идентификатор и выбрасывает его как строку, а не находит связанное значение?

1 Ответ

2 голосов
/ 30 мая 2020

FETCH_ASSO C работает нормально, проблема в вашем sql, если вы пишете поля между одинарными кавычками, вы получаете строки, а не содержимое полей.

Просто напишите поля без кавычек :

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

И вы должны использовать подготовленные операторы , чтобы предотвратить атаки SQL инъекций.

...