Здраствуйте, у меня небольшая проблемка, я знаю что на многих сайтах ссылки url имеют вид
, объясните пожалуйста принцип работы таких конструкций, просто хочется научиться делать "
как надо".
Как я понимаю, url записывается в переменную
$str = $_SERVER['QUERY_STRING'];, затем разбивается функцией
parse_str(); для получения масива. А что дальше, как по полученному массиву строить страницу, выводить контент?
Надеюсь я понятно объяснил, если возможно, ответьте как можно подробнее, буду признателен за помощь!
QUERY_STRING
Параметры, которые в URL указаны после вопросительного знака. Напомню, что они
доступны как при методе GET, так и при методе POST (если в последнем случае они
были определены в атрибуте action тэга <form>).
Передача параметров методом GET
Тут все просто. Все параметры передаются единой строкой (а именно, точно такой
же, какая была задана в URL после ?) в переменной QUERY_STRING. Единственная
проблема — то, что все данные поступят URL-кодированными. Так что нам понадо-
бится функция декодирования. Но это отдельная тема, пока мы не будем ее касаться.
Для того чтобы узнать значения полученных переменных в Си, нужно воспользовать-
ся функцией getenv(). Вот пример сценария на Си, который это обеспечивает.
Листинг 3.2. Работа с переменными окружения
PHP:
скопировать код в буфер обмена
#include <stdio.h> // Включаем функции ввода/вывода
#include <stdlib.h> // Включаем функцию getenv()
void main(void) {
// получаем значение переменной окружения REMOTE_ADDR
char
*RemoteAddr
= getenv("REMOTE_ADDR");// ... и еще QUERY_STRING
char
*QueryString
= getenv("QUERY_STRING");// печатаем заголовок
printf("Content-type: text/htmlnn"); // печатаем документ
printf("<h1>Здравствуйте. Мы знаем о вас все!</h1>"); ",RemoteAddr);
printf("Вот параметры, которые Вы указали: %s",QueryString
); }
Откомпилируем сценарий и поместим его в "CGI-каталог". Теперь в адресной строке
введем:
PHP:
скопировать код в буфер обмена
http://www.myhost.com/cgi-bin/script.cgi?a=1&b=2
Мы получим примерно такой документ:
Здравствуйте. Мы знаем о Вас все!
Ваш IP-адрес: 192.232.01.23
Вот параметры, которые Вы указали: a=1&b=2
Передача параметров методом POST
В отличие от метода GET, здесь параметры передаются сценарию не через перемен-
ные окружения, а через стандартный поток ввода (в Си он называется stdin). То
есть программа должна работать так, будто никакого сервера не существует, а она
читает данные, которые вводит пользователь с клавиатуры. (Конечно, на самом деле
никакой клавиатуры нет и быть не может, а заправляет всем сервер, который "изо-
бражает из себя" клавиатуру.)
Следует заметить очень важную деталь: то, что был использован метод POST,
вовсе не означает, что не был применен также и метод GET. Иными словами,
метод POST подразумевает также возможность передачи данных через URL-
строку. Эти данные будут, как обычно, помещены в переменную окружения
QUERY_STRING.
Но как же узнать, сколько именно данных переслал пользователь методом POST? До
каких пор нам читать входной поток? Для этого служит переменная окружения
CONTENT_LENGTH, в которой хранится строка с десятичным представлением числа
переданных байтов данных (разумеется, перед использованием ее надо перевести в
обычное число).
Модифицируем предыдущий пример так, чтобы он принимал POST-данные, а также
выводил и GET-информацию, если она задана:
Листинг 3.3. Получение данных POST
PHP:
скопировать код в буфер обмена
#include <stdio.h>
#include <stdlib.h>
void main(void) {
// извлекаем значения переменных окружения
char
*RemoteAddr
= getenv("REMOTE_ADDR");char
*ContentLength
= getenv("CONTENT_LENGTH");char
*QueryString
= getenv("QUERY_STRING");// вычисляем длину данных — переводим строку в число
int NumBytes = atoi(ContentLength);
// выделяем в свободной памяти буфер нужного размера
char *Data = (char *)malloc(NumBytes + 1);
// читаем данные из стандартного потока ввода
fread(Data
, 1
, NumBytes
, stdin
); // добавляем нулевой код в конец строки
// (в Си нулевой код сигнализирует о конце строки)
Data[NumBytes] = 0;
// выводим заголовок
printf("Content-type: text/htmlnn"); // выводим документ
printf("<h1>Здравствуйте. Мы знаем о вас все!</h1>"); ",RemoteAddr);
printf("Количество байтов данных: %d ",NumBytes);
printf("Вот параметры, которые Вы указали: %s ",Data);
printf("А вот то, что мы получили через URL: %s", QueryString);
}
Дааа уж
... !
Спасибо вам огромное за проделанную работу по объяснению! Я несколько раз перечитал все это и немного не понял: это на языке СИ (мне бы на PHP)?
А неужели все так сложно
, я наверное плохо разъяснил вопрос
, имелось в виду вот что: у меня на сайте
будут, например, ссылки вида
<a href="?content=news&id=10 и т.д.>новость №10</a>. Вопрос: каким образом обрабатывать такой запрос(ссылки такого вида)? Как на основании полученных данных делать вывод опр. данных.
Для пояснения, расскажу
как делаю я:
Куча ссылок типа
href=?news=10, а обрабатываю так:
if (isset($_GET['baza']
{
if (!empty($_GET['baza']))
{
$id = $_GET['news'];
<!-- делаю вывод новости из базы данных news по id=10 -->
}
}
Даже мне ясно что крайне каряво, поэтому и спрашиваю, как правельно?
Сразу прошу прощения, я наверно ваще ламер
!
Спасибо за помощь!
Я тут придумал кое-что по теме, что скажите?
Имеем ссылки типа href="?content=module_...¶metr=valye"
При нажатии по ссылке открываем папку module_... и передаем файлу index.php параметр со значением valye (Что-то типа модулей в CMSке). Возможен ли такой вариант принципа работы динамического сайта с 1 страницей? И если возможно, каким образом можно передать параметр?
P.S. надеюсь я не сильно в дебри полез, просто очень уж нужен механизм построения динамического сайта.