0

Как посмотреть запрос, который executится после prepare? Вот код:

public function edit($data)
{
$login = $data['login'];
$password = password_hash($data['password'], PASSWORD_DEFAULT);
$id = $data['id'];

$st = $this->db->prepare("UPDATE users SET login = ?, password = ? WHERE id = ?");
$st->bindParam(1, $login, PDO::PARAM_STR);
$st->bindParam(2, $password, PDO::PARAM_STR);
$st->bindParam(3, $id, PDO::PARAM_INT);
$st->execute();

}

  • 1
    Нативно - никак. Только создать свою функцию, которая подставит вместо плейсхолдеров значения. Только зачем это надо? Вы же итак видите свой запрос – Алексей Шиманский Nov 18 '23 at 17:20
  • А дело в том, что у меня не обновляется запись в базе :/ Все происходит успешно, ошибок никаких нет, но запись не обновляется :/ – Андрей Nov 18 '23 at 17:37
  • 1
    https://www.php.net/manual/en/pdo.errorinfo.php ,https://www.php.net/manual/en/pdostatement.errorinfo.php , https://ru.stackoverflow.com/a/701145/191482 – Алексей Шиманский Nov 18 '23 at 17:40
  • 1
    Включить General Log на сервере MySQL. Там и можно увидеть, что именно приходит на него от клиентского приложения. – Akina Nov 18 '23 at 17:57

1 Answers1

0

Если "запрос не работает", это может быть вызвано следующими причинами:

  • До выполнения запроса дело вообще не дошло, из-за некорректной логики в коде программы. Чтобы это проверить, надо добавить временный отладочный вывод (или использовать пошаговую отладку в IDE)
  • При выполнении запроса произошла ошибка. Необходимо настроить РНР так, чтобы он сообщал обо всех ошибках, в том числе при работе с БД. См. рекомендации в этом ответе.

В случае, если запрос был выполнен, и при этом без ошибок, но при этом не сделал то что нужно, причины могут быть следующие:

  • Не было найдено совпадение в условии WHERE. Надо проверять входящие данные, и данные, которые лежат в БД.
  • Если запрос на изменение данных, то иногда бывает, что результат запрса проверяют не в той базе данных. Например, phpmyadmin работает с БД, которая настроена на порт 8889, а РНР работает с БД на порту 3306. Надо убедиться, что результат запроса проверяется в той же самой БД.
  • Как вариант, изменения происходят в рамках открытой транзакции, которой потом не делают commit. Надо убедиться, что транзакция не стартует или что она подтверждается.

Для данного случая можно предложить настроить РНР и PDO, чтобы они информировали программиста об ошибках, как оказано по ссылке выше, и добавить следующий отладочный код:

var_dump($login, $password, $id);
$st = $this->db->prepare("UPDATE users SET login = ?, password = ? WHERE id = ?");
$st->bindParam(1, $login, PDO::PARAM_STR);
$st->bindParam(2, $password, PDO::PARAM_STR);
$st->bindParam(3, $id, PDO::PARAM_INT);
$st->execute();
die("Запрос выполнен");

И смотреть на то, что он выведет.

  • если ничего не выведет, то значит этот метод даже не был вызван. Гадо добавлять отладочный вывод выше по коду и разбираться с логикой. Например, код проверяет какой-то параметр из формы, а он не пришел, или написан с опечаткой
  • если выведет ошибку, то прочитать и исправить её
  • если выведет id, то проверить, есть ли такое значение в БД

После решения проблемы добавленные строки убрать.