intval ($ id) не соответствует идентификатору в базе данных

#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=""> 
  

и все обновляется отлично. Если кто-нибудь захочет объяснить, ПОЧЕМУ это произошло, я был бы очень признателен.