Как сделать поиск по id по числу без преобразования?
Есть таблица page со столбцом id (int PRIMARY KEY NOT NULL AUTO_INCREMENT)
Для получения по id: SELECT * FROM page WHERE id = '1 LIMIT 1
все находит корректно.
Но также находит и по запросу, где в id есть число со строкой, например: SELECT * FROM page WHERE id = '1dsf' LIMIT 1
Если я правильно понимаю, то MySQL просто преобразует значение к числу и обрезает строчные символы.
Если это так, как мне делать запросы со строгой проверкой, а если не из-за преобразования, то как мне этого избежать?
scooby_doe, если честно сам не знаю. Делаю админку и для редактирования страницы, собираю url с id страницы. Но когда тестировал отдачу 404 ошибки, добавил к id строку и получил страницу)) Может и не критично это, но почему-то смутило)
Лев Салатов, звучит как sql inj, где-то экранируется id при получении его из запроса?
Если нужно использовать некий символьный код для страниц, а не id, например уйти от site.ru/page/1 на site.ru/page/someshit, тогда нужно ввести столбец строковый slug и уже по нему делать выборку. И опять же, экранирование!
scooby_doe, да, slug использую для фронта, по id в админке проще.
ID экранирую обязательно, а теперь и бракую если после site.ru/page/ приходит что-то кроме числа. Просто стало интересно, можно ли это устранить на стороне MySQL.
А насчет проблемы на ровном месте — согласен, но без саморазвития не будет прогресса)
Лев Салатов, наоборот, выше уровнем.
Собственно, валидация внешних данных (а дело, видимо, в них) делается в контроллере, в модель уже должны приходить такие, чтобы шаманить с ними не требовалось.
Лев Салатов, можно и нужно. Причём одно другому не мешает.
В strict mode БД будет не "не находить", а выдавать ошибку. А доводить БД до ошибки - это моветон. Так что валидация входящих параметров всё равно должна выполняться. Мои студенты делали что-то вроде
function http_error($code, $message = "") {
http_response_code($code);
die($message);
}
if (!isset($_GET['id'])) {
http_error(404);
}
$id = $_GET['id'];
if (!ctype_digit($id)) {
http_error(400);
}
$page = get_page_by_id($id);
if (!$page) {
http_error(404);
}