#php #mysqli
#php #mysqli
Вопрос:
Мой запрос на обновление не работает с моей переменной $id, НО работает, например, когда я использую буквенное число 29. У меня есть var_dumped $id, и я получаю INT(29). Что-то изменилось недавно, потому что я скопировал код, который работал в прошлом.
$id = (ISSET($_GET['id'])) ? intval($_GET['id']):0;//prevents sql inject
var_dump($id);
Мой запрос, который работает, следующий:
$sqlUpdate = $db->query("UPDATE sites SET site_name='$site_name',population='$population' WHERE id=29");
Этот запрос не работает:
$sqlUpdate = $db->query("UPDATE sites SET site_name='$site_name',population='$population' WHERE id=$id");
Комментарии:
1. Как вы предотвращаете SQL-инъекции с вашими строками? Выведите запрос с переменной и убедитесь, что он соответствует ожиданиям.
2. Я использую mysqli_real_escape_string для предотвращения SQL-инъекции других моих переменных. Не уверен, что вы подразумеваете под выводом, но я выполнил var_dump всех переменных, и запрос возвращает TRUE . Кажется, что intval ($ id) в конечном итоге НЕ совпадает с тем, что хранится в поле id
3. Сохраните
"UPDATE sites SET site_name='$site_name',population='$population' WHERE id=$id"
в переменной, а затем выведите ее перед выполнением. Использование параметризованных запросов было бы лучшим подходом.
Ответ №1:
Я нашел свою проблему / ответ. Я использовал <form method="post" action="<?php echo $_SERVER['PHP_SELF'];?>">
в своей форме, потому что код для обработки сообщений моей формы находится в том же файле. После нажатия кнопки «ОБНОВИТЬ» я заметил в адресной строке, что имя файла было правильным, но оно на короткое время отбросило переменную GET. В это время снова выполняется следующий код…
$id = (ISSET($_GET['id'])) ? intval($_GET['id']):0;
$id = protect($db,$id);
и моя переменная $id была изменена с правильного значения GET на 0, что не позволяет моему коду обновлять правильную запись. Я изменил свой код на следующий:
<form method="post" action="">
и все обновляется отлично. Если кто-нибудь захочет объяснить, ПОЧЕМУ это произошло, я был бы очень признателен.