#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 измененных строк».