Разделение GET запроса
Из url строки извлечь нужные переменные получилось так:
$parts = parse_url($_SERVER['REQUEST_URI']); parse_str( $parts['query'] , $query ); echo $query['id']; echo $query['name'];
Отслеживать
ответ дан 9 фев 2023 в 22:31
59 10 10 бронзовых знаков
- php
- get
-
Важное на Мете
Похожие
Подписаться на ленту
Лента вопроса
Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.
Дизайн сайта / логотип © 2024 Stack Exchange Inc; пользовательские материалы лицензированы в соответствии с CC BY-SA . rev 2024.1.3.2953
Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.
Как разбить get запрос и занести все в свои переменные?
site.sits/classpr.add?count=1&v=4
Вот у меня есть такой запрос к сайту на файл index.php
Как мне сделать чтобы я мог разделить всё по своим местам?
Мне нужно получить примерно так
classpr
add
cout = 1
v = 4
Вот как мне разбить такой запрос? Что после ? там могут быть куча разных запросов и с разными именами и мне также их нужно сохранить
С SERVER я получаю его вот так
[«REDIRECT_QUERY_STRING»]=> «action=classpr.add&count=1&v=4»
[«QUERY_STRING»]=> «action=classpr.add&count=1&v=4»
[«REQUEST_URI»]=>»/classpr.add?count=1&v=4″
- Вопрос задан более трёх лет назад
- 1079 просмотров
Комментировать
Решения вопроса 1

Чебуратор тега РНР
Не нужно никогда get запрос заносить ни в какие переменные.
Никогда не надо заниматься такой фигнёй, как выковыривание элементов массива в отдельные переменные.
Массив для того и придуман, чтобы работать с изменяемой неструктурированной информацией
Поэтому если тебе надо получить 1, то прсто пишешь $_GET[‘count’]. ВСЁ. Никаких тебе страданий и проблем.
Ответ написан более трёх лет назад
Комментировать
Нравится 5 Комментировать
Ответы на вопрос 3

Web-программист
1. Берем $_SERVER[‘REQUEST_URI’] прогоняем через parse_url($_SERVER[‘REQUEST_URI’], PHP_URL_PATH) так вы получите часть classpr.add
2. Все что после знака вопроса, автоматически располагается в $_GET
Безопасность
1. НЕ используйте extract() за такие советы надо банить!
2. Не доверяйте ничему, что получаете от пользователя (POST, GET, COOKIE, etc), ничего напрямую не вставляйте в базу, не пытайтесь вызвать и тд.
Вместо $_GET[‘count’] используйте filter_input(INPUT_GET, ‘count’, FILTER_VALIDATE_INT).
Пусть (classpr.add) прогоните через регулярку if ( ! preg_match(‘~^/([a-z0-9.]*)$~’, $path, $matches)) return false;
Как делить переменные в get запросе
Метод GET — это способ передачи данных. Методом GET данные передаються через адресную строку URL.
Максимальное количество данных передаваемых методом GET до 1024 символов.
Синтаксис метода GET
https://dwweb.ru/example_metod_get.html ? name = Vasya & den = sreda
После окончания тела ссылки ставится знак вопроса — ?
Далее идут название переменных name и den
Что такое массив GET
GET — не только метод, но и одновременно это массив, обозначается «$_GET» :
Переменная GET — это одна из глобальных переменных, которая является ассоциативным массивом и подчиняется всем законам поведения массивов.
Пока, вы ничего не отправили методом get, то массив $_GET» — пустой, если мы применим к данному массиву функцию var_dump($_GET); , то получим ноль :
Как вывести результат переменной GET на экран?
Для того, чтобы вывести результат переменной GET на экран нам потребуется инструмент для работы с массивом print_r
print_r($_GET);
Опасно отправлять на сервер пароль или другую важную информацию! Для этого существует другой метод
Пример метода GET в адресной строке:
https://dwweb.ru/example_metod_get.html ? name=Vasya & den=sreda
Чем отличается GET от POST!?
Метод POST используется в скрытой передаче данных, а Get – передаёт данные в адресную строку!
Видео как отправлять, получать данные с помощью метода GET
Видео о получении и отправки данные методом get, к сожалению, видео не очень хорошего качества, сделано на старом оборудовании, вы уж извините! Нового видео о методе гет пока нет. и даже не знаю будет ли. времени катастрофически ни на что не хватает!
Друзья!
Мне очень нужны подписчики!
Пожалуйста подпишись на Дзене!
Заранее спасибо!
Пример формы( 1 ) с отправкой методом — get( 2 )
Разберем простой пример.
Если увидели много буков, то можно сразу перейти к результату №1
Для того, чтобы его сделать нам понадобится:
1). Форма из которой мы будем отправлять данные с помощью get метода.
2). И вторая часть, с объяснением, как зачем и почему — о методе гет.
1). Форма для отправки данных с помощью get метода.
Внутрь тега form помещаем атрибут action, со значением якоря primer_1, чтобы вернуться прямо к результату. Там же внутри прописываем метод — method=»get»
Внутрь формы поместим два инпутаinput, один с типом type text , второй — кнопка отправки submit — соберем нашу форму:
2). Обработка данных с помощью get метода.
Как мы можем и что мы можем получить с использованием выше приведенной формы!?
Мы можем получить данные прямо из формы обращаясь к массиву $_GET/
Как получить и отправить данные get запросом?
Форма уже готова! Теперь получим данные из этой формы!
Для получения данных используется условие по значению атрибута «name»(см форму).
Далее просто выводим результат гет запроса:
Помните про якорь, который я говорил в одном из пунктов, чтобы нам вернуться прямо к результату!? Если у вас не нужно перемещаться по странице, то использовать якорь не нужно.Размещаем его тоже здесь:
Соберем форму, код и вывод в одно целое
Результат отправки данных из формы методом GET
Можете ввести какие-то данные в поле ввода и нажать отправить, либо не изменяя нажать. После отправки данных, отройте адресную строку и посмотрите что в ней.
Вставим весь тот код, что мы разобрали выше — прямо сюда:
Проверить отправлен ли get запрос!?
Для проверки get нужно написать простую конструкцию — проверяем есть ли get запрос -> if(!$_GET) , если нет, то выводим, что get запрос не был отправлен, если же get был отправлен, то выведем через print_r — потому, что это будет не строка, а массив!
if(!$_GET)
‘; print_r ($_GET) ; >
Ну и естественно, что выведем прямо здесь
Если вы нажали кнопку отправить в верхнем пункте, либо в любом другом пункте на этой страницу, то здесь проверка на гет запрос сработает! И выведется текст, что гет запрос был отправлен не из этой формы.
Форму создадим аналогичную, которую мы рассматривали в пункте 3.
Лишь изменим action, name, value
get запрос не был отправлен!
Проверить отправлен ли get с определенным именем!?
Как мы увидели в предыдущем пункте, что проверять просто наличие get запроса, если есть несколько форм на странице — будет довольно проблематично, в смысле отслеживания — из какой формы данный get был отправлен!
Мы можем написать такое условие, если get запрос не отправлен из атрибута name со значением «name3_1»
if(!$_GET[name3_1])
И выведем соответствующее сообщение:
Определенный гет запрос с именем
Иначе(else) — т.е. если «$_GET[name3_1]» будет существовать, выводим:
$_GET[name3_1] переменная была отправлена методом GET и равна.
Код формы с GET
$var_3_1 =’Определенный гет запрос с именем
$var_3_1 = ‘
Выведем выше приведенный код прямо здесь:
Определенный гет запрос с именем name3_1 еще не был отправлен
Пример использования GET метода!
Еще, как то мы делали пример, совсем простой, чтобы можно было понять, как работает метод get:
1. Это простая ссылка на страницу, если вы на неё пройдете, то вы ничего не увидите кроме текста и ссылки, уже на самой странице!
https://dwweb.ru/__a-data/__all_for_scripts/__examples/php/get/get.php 2. А вот уже вторая ссылка имеет get запрос и если вы нажмете здесь, либо на странице по ссылке, то вы увидите результат работы метода get.
https://dwweb.ru/__a-data/__all_for_scripts/__examples/php/get/get.php?primer=test
Вывод абсолютно аналогичный. что и при выводе get запроса выше..
Если интересен код данной страницы, то вот:
echo «Вы нажали на ссылку и в условии проверки есть проверка на то, что передано в строке…
echo «Переданные данные не верны!»;
echo «И обратите внимание на адресную строку, скрипт не сработал, потому, что ни переменной, ни параметра GET в строке нет «;
Как передать две переменные в get запросе?
Как передать две переменные в get запросе? Почему только две!? Как передать в get запросе две, три, четыре и более переменных!?
Чтобы опять выглядело все наглядно и понятно, как столько переменных будут передаваться, возьмем опять нашу форму и размножим инпут.
Опять возьмем ту же строку и выведем тут же.
if(!$_GET)
‘; print_r ($_GET) ; >
И естественно, что нам понадобится тот же кусок адресной строки:
echo strip_tags($_SERVER[‘REQUEST_URI’]);
Как будет выглядеть адресная строка браузера:
/page/php/function/044_metod_get.html
Вывод echo + print_r:
get запрос не был отправлен
Безопасность при использовании метода get
Не забываем о безопасности, когда работаем с любыми формами, когда у вас есть отправка-примем данных!
GET не является исключением! Не буду разводить, что да как. применяем к полученным данным функцию strip_tags
Как это у вас должно выглядеть!?
if($_GET[‘name6’])< echo strip_tags($_GET['name6']) ); >
Если данные из _GET передаете в переменную, то делаем тоже самое.
if($_GET[‘name6’])< $переменная = strip_tags($_GET['name6']) ); >
Как отправить get запрос на другую страницу живой пример
Для того чтобы понять, как отправить get запрос на другую страницу, нужно сделать дополнительную страницу, куда собственно и будем отправлять get запрос!
Для того, чтобы посмотреть на то, что выдает данная страница без get запроса посмотрите на неё.
Форма для отправки get запроса на другую страницу
Как и прежде, для отправки данных методом get , нам понадобится какая-то форма, в которой в атрибуте action указываем ту страницу на которую будем отправлять данные с помощью get запроса!
Все остальные данные будут аналогичные фомам сверху!
Страница, которая будет принимать данные с другой страницы методом get
Для того, чтобы принять данные, которые будут отправляться этой, либо с любой другой страницы, мы на странице применика должны написать совершенно аналогичные условия приема данный get запроса!
Как видим на страницу есть условие, по которому , если ничего не происходит, то будет выдаваться, что ничего не произошло, а если мы нажмем в форме ниже отправить, то сработает условие if($_GET[‘send_2’]) , когда данные переданы с помощью get ! И будет выдавать все данные, которые были переданы!
Немного о связываемых переменных (prepared statements)
Если бы мне пришлось писать книгу о том, как создавать немасштабируемые приложения Oracle, первая и единственная ее глава называлась бы «Не используйте связываемые переменные».
Том Кайт, вице-президент Oracle
Недавно на Хабре появилась статья от AlexanderPHP «SQL injection для начинающих. Часть 1». По ее содержимому и комментарием к ней может создаться впечатление, что у многих разработчиков нет понятия, что такое связываемые переменные, зачем ими следует пользоваться и какие преимущества они дают. Попытаюсь в данной статье пролить небольшой свет на данные вопросы.
Определение связываемых переменных
Связываемые переменные, они же prepared statements, они же подготовленные выражения (четко устоявшегося перевода обнаружить не удалось; будем использовать и тот, и тот) — это часть функциональности SQL-баз данных, предназначенная для отделения данных запроса и собственно выполняемого SQL-запроса. Например, у нас есть запрос:
insert into someTable(name) values(‘Вася’);
Что мы можем заметить, просто посмотрев на него? Во-первых, сам запрос insert обычно статичен и не меняется в разных запросах, в 90% случаев просто жестко вбит в коде или генерируется при помощи некоторого ORM; значение данных (в данном случае ‘Вася’) меняется постоянно и задается извне — из ввода пользователя или из других источников. Связываемые переменные позволяют задать запрос отдельно, а потом передавать данные в него отдельно, приблизительно так (псевдокод):
$request = sql_prepare('insert into table(name) values(:1)'); /*также можно insert into someTable(name) values(?);*/ sql_execute($request, Array('Вася'));
Так мы отдельно задаем запрос, вместо данных подставляя в него номера связываемых переменных (:1, :2. ) или просто вопросительные знаки. Далее вызываем запрос, указывая, какие именно данные надо подставить вместо указанных переменных.
Результат выполнения этого кода полностью аналогичен результату выполнения запроса insert into someTable(name) values(‘Вася’); , но есть несколько важных отличий, которые будут рассмотрены далее.
Преимущества и особенности связываемых переменных
При использовании связываемых переменных есть несколько преимуществ:
1. Очевидное преимущество — один и тот же подготовленный запрос можно использовать несколько раз для разных данных, тем самым сокращая код.
2. Запросы со связываемыми переменными лучше кэшируются сервером, сокращая время синтаксического разбора.
3. Запросы со связываемыми переменными обладают готовой встроенной защитой от SQL-инъекций.
Рассмотрим каждый пункт подробнее.
Первый пункт очевиден — при наборе данных можно использовать одно и тоже подготовленное выражение несколько раз:
$request = sql_prepare('insert into table(name) values(:1)'); sql_execute($request, Array('Вася')); sql_execute($request, Array('Петя')); sql_execute($request, Array('Коля')); sql_execute($request, Array('Иван'));
Код генерации SQL-запроса сокращается, а вам любой разработчик скажет, что сокращение объемов кода — это сокращение вероятности ошибки в нем.
Для пояснения второго пункта следует рассказать подробнее, как именно сервер баз данных обрабатывает SQL-запрос. Первейшим этапом выполнения запроса является синтаксический разбор самого запроса, то есть сервер переводит запрос из SQL-языка в какой-то свой внутренний формат, чтобы определить, что именно хочет от сервера клиент. За синтаксическим разбором следует собственно выполнение — составление плана запроса, формирование индексов, сканирование таблиц и множество других неинтересных вещей. Надо отметить, что сам по себе синтаксический разбор — операция довольно «тяжелая» по времени выполнения (хотя бы по сравнению с поиском по индексу, например). Подавляющее большинство современных систем управления базами данных (увы, насколько я знаю, MySQL в данном случае к таковым не относится), «умеют» кэшировать результаты синтаксического разбора и заново использовать их. В этом случае становится очень выгодным, если есть возможность повторять один и тот же SQL-запрос не один раз — будет использоваться синтаксический кэш. Обратимся к примеру в пункте 1 — очевидно, что в данном случае синтаксический разбор выполняется один раз, хотя сам запрос — четыре раза. Если бы мы писали:
sql_execute("insert into table(name) values('Вася')"); sql_execute("insert into table(name) values('Петя')"); sql_execute("insert into table(name) values('Коля')"); sql_execute("insert into table(name) values('Иван')");
то в этом случае каждый раз запрос для сервера был бы новым (потому что анализируется полный текст запроса), и синтаксический разбор пришлось бы выполнить четырежды. Это еще не говоря о том, что такие запросы забивают «мусором» описанный синтаксический кэш.
Перейдем к третьему пункту. Почему же связываемые переменные — это гарантированная защита от SQL-инъекций (по крайней мере, того типа, который рассматривается в упомянутой статье)? Существует заблуждение (у меня оно точно было), что prepared statements – это просто синтаксическая «нашлепка» на команду sql_execute (mysql_real_query, например), которая просто
экранирует все указанные переменные, собирает в одну строку и просто вызывает команду sql_execute, избавляя программиста от некоторого ручного труда. Это не так. На самом деле prepared statement – отдельная возможность в любой вменяемой СУБД. Для этой возможности есть отдельные функции в библиотеке, отдельные места в бинарном протоколе между клиентской и серверной частью СУБД. Более того, собственно подготовленный запрос и данные, которые в нем используются, передаются на сервер отдельно. В клиентских библиотеках есть отдельные команды подготовки выражений (для примера можно посмотреть документацию MySQL C API, PostgreSQL C library).
Примечание: есть исключение — в PHP PDO связываемые переменные по умолчанию эмулируются именно описанным методом, то есть конструированием SQL-команды на клиентской стороне. Это лучше отключать (взято со StackOverflow):
$dbConnection = new PDO('mysql:dbname=dbtest;host=127.0.0.1;charset=utf8', 'user', 'pass'); $dbConnection->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); $dbConnection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
Из этого следует важный вывод — поскольку данные передаются полностью отдельно от запроса, у этих данных нет никаких возможностей модифицировать запрос. Нет возможностей. Вообще никаких. (Экзотические атаки типа переполнения буфера здесь мы не рассматриваем — это совсем другой класс атак).
Данные не нужно экранировать, преобразовывать или как-то менять; они идут в базу данных в точно том виде, в каком нужны нам. Если нам передали строку Robert’);drop table students; , не надо заботиться об экранировании, надо просто передать ее как связываемую переменную — ничего она нам не сделает, а так и будет просто лежать в базе данных, как самая обычная строка.
Комментарии к комментариям
В заключение рассмотрим несколько комментариев из уже упомянутой статьи и разберем, что же в них не так:
Rhaps107
а в чем проблема с mysql_real_escape_string? В нём есть какие-то известные уязвимости?
Это мы уже разобрали — проблема с функцией mysql_real_escape_string в том, что ей вообще пользуются. Со связываемыми переменными ей не надо пользоваться. Это экономия на клиентской части (представьте, что функции надо «шерстить» мегабайтную строку, чтобы найти места, где все-таки поставить обратный слэш), а остальные преимущества уже расписаны в статье.
@m_z21
PDO и ORM не панацея. И с использованием pdo можно наделать подобных дыр, если нет понимания как работают sql-инъекции.
Каким боком сюда приплели ORM – непонятно. А вот PDO (и MySQLi) как раз панацея, поскольку SQL injection при их грамотном использовании невозможны, как уже и было описано.
@VolCh21
Выигрыш по потребляемым ресурсам (скорости, памяти), т. к. mysql_* является по сути просто биндингами к libmysql, а mysqli/pdo создают ненужный во многих случаях объектный слой?
И это фактическая ошибка. Команды типа mysqli::prepare — это тоже всего лишь биндинги к соответствующим функциям клиентской библиотеки MySQL. Если желаете убедиться, то можете сами посмотреть на исходные коды PHP. Соответственно, расходы на (якобы ненужный) объектный слой даже если и есть, то они минимальные. Да и экономия на объектном слое уж очень сильно напоминает «экономию на спичках».
Заключение
Надеюсь, мне удалось прояснить для кого-то такую несомненно важную тему, как связываемые переменные (prepared statements). Надеюсь, что многие хотя бы задумаются над тем, чтобы всегда использовать связываемые переменные при работе с БД. Я не претендую на абсолютную полноту и точность изложения, так что буду только рад, если у кого-то найдется что добавить, убавить или откорректировать в написанном.
- prepared statements
- sql
- sql injection
- инъекции
- подготовленные выражения