Vasya Pupkin
Мракобес | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору Всем привет. Имеется приложение на PHP и запрос в PostgreSQL вида: Код: $query = "SELECT id FROM public.files WHERE counter_id = '".$channel."' AND updated_at >= '".$startDate." 08:00:00' AND updated_at <= '".$endDate." 20:00:00' ORDER BY updated_at ASC"; | что преобразуется в итоговый запрос: Код: SELECT id FROM public.files WHERE counter_id = 'xxx' AND updated_at >= '2023-11-01 08:00:00' AND updated_at <= '2023-11-22 20:00:00' ORDER BY updated_at ASC LIMIT 1000 | Все работает четко, но небезопасно. По аналогии с mysql_real_escape_string хочу экранировать запрос. Лезем в мануал, находим функцию pg_escape_string(). Экранируем запрос: Код: $query_escaped = pg_escape_string("SELECT id FROM public.files WHERE counter_id = '".$channel."' AND updated_at >= '".$startDate." 08:00:00' AND updated_at <= '".$endDate." 20:00:00' ORDER BY updated_at ASC LIMIT 1000"); | Запрос приобретает вид: Код: SELECT id FROM public.files WHERE counter_id = ''6890f91a-7bb7-4a18-88a4-062c6aa1f920'' AND updated_at >= ''2023-11-01 08:00:00'' AND updated_at <= ''2023-11-22 20:00:00'' ORDER BY updated_at ASC LIMIT 1000 | после чего PHP сразу дает нам отлуп: Цитата: Warning: pg_query(): Query failed: ERROR: syntax error at or near "6890" LINE 1: SELECT id FROM public.files WHERE counter_id = ''6890f91a-7b... ^ | Я сначала не обратил внимание, подумал, что при экранировании кавычки превратились в двойные, однако, как оказалось, функция продублировала все мои одинарные кавычки, что ожидаемо привело к ошибке. Окей, может попробуем двойные кавычки в запросе вместо одинарных? Заменяем и экранируем, получая такой код: Код: $query_escaped = pg_escape_string("SELECT id FROM public.files WHERE counter_id = \"".$channel."\" AND updated_at >= \"".$startDate." 08:00:00\" AND updated_at <= \"".$endDate." 20:00:00\" ORDER BY updated_at ASC LIMIT 1000"); | на что получаем другой отлуп: Цитата: Warning: pg_query(): Query failed: ERROR: column "6890f91a-7bb7-4a18-88a4-062c6aa1f920" does not exist LINE 1: SELECT id FROM public.files WHERE counter_id = "6890f91a-7bb... ^ | Ладно, бог с ним, может функция эта какая-то нерабочая? Тем более, что в мануале черным по белому написано, что лучше использовать функцию pg_escape_literal(). Ок, ею и воспользуемся. Меняем функцию и после экранирования видим такой запрос: Код: 'SELECT id FROM public.files WHERE counter_id = ''6890f91a-7bb7-4a18-88a4-062c6aa1f920'' AND updated_at >= ''2023-11-01 08:00:00'' AND updated_at <= ''2023-11-22 20:00:00'' ORDER BY updated_at ASC LIMIT 1000' | что на выходе дает уже третий отлуп: Цитата: Warning: pg_query(): Query failed: ERROR: syntax error at or near "'SELECT id FROM public.files WHERE counter_id = ''6890f91a-7bb7-4a18-88a4-062c6aa1f920'' AND updated_at >= ''2023-11-01 08:00:00'' AND updated_at <= ''2023-11-22 20:00:00'' ORDER BY updated_at ASC LIMIT 1000'" LINE 1: 'SELECT id FROM public.files WHERE counter_id = ''6890f91a-7... ^ | Обратите внимание, интерпретатор споткнулся сразу же, вначале, потому что теперь весь запрос обернут в одинарные кавычки, которые так не нравятся PHP. Так как правильно пользоваться этими функциями? Что я делаю не так? В интернете, на удивление, скудная и одинаковая информация по этой теме. Спасибо!
---------- я не люблю людей |
|