Почему мой запрос PDO не выполняется с помощью функции fetch()?

#javascript #php #ajax #pdo #fetch-api

Вопрос:

Я пытаюсь выполнить инструкцию update с помощью события onclick кнопки, но мне не удается запустить ее с помощью api выборки.

У меня есть эта функция JavaScript:

 const changeProductAvailability = (id,status) => {
  const formData = new FormData();
  formData.append('product', id);
  formData.append('able', status);
  fetch("change-availability.php", {
    method: "POST",
    body: formData,
  })
  .then((response) => response.text())
  .then((text) => {
    console.log(text);
  })
}
 

и у меня есть это в change-availability.php:

   $query_sql = "UPDATE product SET able_to_order = :able WHERE id = :id";
  $data = [
    "able" => $_POST['able'],
    "id" => $_POST['product']
  ];
  $stmt = $conn->prepare($query_sql);
  $stmt->execute($data);

  if (!$stmt) {
    echo "Error on updating"
  }else{
    echo "Sucessfully changed";
  }
 

В html у меня есть кнопка, которая вызывает функцию следующим образом с 2 параметрами:

 <button
  class="btn <?=$row["able_to_order"] == 0 ? "btn-success" : "btn-danger" ?>"
  onclick="changeProductAvailability(<?= $row['id'] .",".$row['able_to_order']?>)">
  <?=$row["able_to_order"] == 1 ? "Disable" : "Enable" ?>
</button>
 

Оператор PDO работает, так как я попытался напрямую открыть страницу и изменил ее, чтобы получить значения в массиве данных. При нажатии кнопки я получаю «Успешно изменено» на консоли, однако значения в базе данных не меняются. Какую часть этого я делаю неправильно?

Комментарии:

1. !$stmt не делает того, что ты думаешь. Возвращаемое значение вызова to $stmt->execute() возвращает логическое значение, с которым вы должны проводить тестирование.

2. PDO вернет значение false только в том случае, если запрос не удался. Если вы хотите узнать, были ли затронуты какие-либо записи, вы можете проверить количество строк на наличие затронутых строк .

3. Хорошо, я понял это с вашей помощью. После изменения возвращаемого сообщения на $stmt->rowCount() оно вернуло «0 измененных строк», что заставило меня понять, что на самом деле мой запрос был неверным. Спасибо

Ответ №1:

Как упоминал @esqew, !$stmt делает не то, что я ожидал, и вместо этого мне понадобилось решение @aynber, чтобы проверить, не были ли изменены какие-либо строки.

Я обнаружил, что ошибка заключалась в значениях, переданных в запрос вместо этого, поскольку я передавал значения, которые уже присутствовали в базе данных, которая возвращала «0 измененных строк».