0

После отправки POST запроса на сервер с PHP://input равным {"name":"Эмиль","surname":"Ахмадуллин","password":"Some_password231"} код возвращает {}. Хотя в базе данных есть строка с данными name=Эмиль, surname=Ахмадуллин. Содержание базы данных

login.php

<?php
require '../users.php';

$users = new Users();

if (!$users) { echo $users->lastErrorMsg(); } else { $data = json_decode(file_get_contents('php://input'), true); $cmd = $users->prepare('SELECT * FROM users WHERE name=? AND surname=?'); $cmd->bindValue(1, $data['name']); $cmd->bindValue(2, $data['surname']); $result = $cmd->execute();

echo json_encode($result, true); } ?>

users.php

<?php
class Users extends SQLite3 {
  function __construct() {
    $this->open('/home/runner/Dnievnik/users.db');
    $this->exec('CREATE TABLE IF NOT EXISTS users (
        id INT PRIMARY KEY,
        name CHAR(32) NOT NULL,
        surname CHAR(32),
        password CHAR(32) NOT NULL,
        school CHAR(16),
        class CHAR(8),
        admin BOOLEAN
    )');
  }
}
?>
  • 3
  • @u_mulder вааау, ничего себе дубликат вопроса, прямо точь в точь описывает мой вопрос – Эмиль Ахмадулин Sep 13 '23 at 13:20
  • 2
    Ты б хоть че-нить из него бы попробовал, а потом бы острил. – u_mulder Sep 13 '23 at 13:42
  • Правильно вам дали ссылку на дубликат)) потому что как минимум вывести ошибки PHP и второе - сделать отладку кода............ а вообще bindValue третьим параметром наверное надо тип указать, судя по документации https://www.php.net/manual/en/pdostatement.bindvalue.php – Алексей Шиманский Sep 13 '23 at 13:50
  • Если это PDO, то можно попроще писать. сразу в execute передавать массив с бинд параметрами https://www.php.net/manual/en/pdostatement.execute.php – Алексей Шиманский Sep 13 '23 at 13:53
  • @АлексейШиманский, ваши замечания здесь - это такое же снайперское попадание пальцем в небо, как и ссылка в первом комментарии. – Ипатьев Sep 13 '23 at 14:47
  • @u_mulder я смотрел ту статью. Она никак мне не поможет. Типа как тут связан дебаг с этим вопросом? Я уже пробовал под корень как я мог найти где заложена проблема. Безуспешно, сейчас я пришел к выводу, что я просто не совсем знаю sqlite3 на php. На Python да, я имею представление. Но на php появились какие-то новые методы для объекта базы данных. Поэтому я не в силах сам решить этот вопрос. В интернете я копался, не нашёл ответа – Эмиль Ахмадулин Sep 13 '23 at 17:24
  • @ЭмильАхмадулин там надо перейти на ответ в самом низу, вот этот: https://ru.stackoverflow.com/a/701145/179379 он объясняет, в общем, очевидные вещи: поскольку никто не знает, почему ваш код пустой массив, то вам надо хотя бы приблизительно определить проблемное место в своем коде. У вас может быть и пустой массив $data, и запрос может вернуть пустоту, и json_encode может вернуть false. – Ипатьев Sep 13 '23 at 17:30
  • @ЭмильАхмадулин вы все ставите с ног на голову. Методы у вас как раз нормальные. А без отладки вы ответ на свой вопрос не получите. Телепатию, да еще и такую, которая залезет в мозги вашему компьютеру, ещё не изобрели. И не надо просто говорить "не помогает". Вы выводили массив $data? Что в нем содержится? Вы пробовали выполнить запрос без знаков вопроса и bindValue, а просто написав прямо в запросе SELECT * FROM users WHERE name="Эмиль" AND surname="Ахмадуллин"? – Ипатьев Sep 13 '23 at 17:34
  • @Ипатьев Да, я выводил массив $data, используя json_encode($data, true) – Эмиль Ахмадулин Sep 13 '23 at 17:41
  • @Ипатьев сейчас проверю что будет если подставить эти данные в SQL запрос. Приношу извинения, я не делал этого способа дебага. – Эмиль Ахмадулин Sep 13 '23 at 17:42
  • @Ипатьев я подставил $result = $users->query('SELECT * FROM users WHERE name="Эмиль" AND surname="Ахмадуллин"'); ответ всё ещё {}. print_r() выдало SQLite3Result Object ( ). (Также с кодом из основного поста) – Эмиль Ахмадулин Sep 13 '23 at 17:46
  • ахаха, я только сейчас заметил. вы были правы. не все функции использовали. Надо было еще fetchArray использовать – Ипатьев Sep 13 '23 at 17:50
  • @Ипатьев теперь выводит не пустой {}, а {"0":null,"id":null,"1":"\u042d\u043c\u0438\u043b\u044c","name":"\u042d\u043c\u0438\u043b\u044c","2":"\u0410\u0445\u043c\u0430\u0434\u0443\u043b\u043b\u0438\u043d","surname":"\u0410\u0445\u043c\u0430\u0434\u0443\u043b\u043b\u0438\u043d","3":"Some_password231","password":"Some_password231","4":null,"school":null,"5":null,"class":null,"6":null,"admin":null}, спасибо! Напоследок, есть способ чтобы эти \u000\ превратить в кириллицу? – Эмиль Ахмадулин Sep 13 '23 at 17:58
  • Хотя я уже нашёл в интернете ответ на этот вопрос, спасибо – Эмиль Ахмадулин Sep 13 '23 at 19:12

1 Answers1

0

Спасибо @Ипатьев из комментариев!

Нужно было сделать вот так:

  while($row=$result->fetchArray(SQLITE3_ASSOC)) {
   print_r($row);
  }

Тогда будет прохождение по всем столбцам таблицы из $result.