2011-11-30 3 views
3

Я работаю со сценарием, который не позволяет переменным $_GET[] в URL-адресе (это URL-адрес реферера, который я выдаю, и мне нужно иметь какой-то способ отслеживания Это). Я не могу иметь это, например, domain.com/index.php?id=test. Однако я могу это сделать domain.com/index.php/idd=testPHP GET variable `/` вместо `?`

Мой вопрос в том, что я использую / вместо ? и рассматриваю его как переменную get. Как получить переменную из URL-адреса. Что является простым способом сделать это

+0

Посмотрите метод [mod_rewrite] (http://www.cyberdesignz.com/blog/website-design/url-rewriting-top-5-ways-of-php-url-rewriting/). –

+0

Первое, что приходит в голову, это использовать POST вместо GET? Вторая мысль использует $ _SERVER ['REQUEST_URI'] и выполняет некоторые синтаксические разборки объявлений? - edit - или если вы можете использовать mod_rewrite, то что @BradChristie предложил. – favoretti

+2

Используйте пост вместо этого? – vascowhite

ответ

4

Если у вас есть URL, как это:

http://example.com/index.php/whatever 

Тогда /whatever обычно известный как PATH_INFO и доступный как:

print $_SERVER["PATH_INFO"] 

Обратите внимание, что в некоторых средах (CGI) он может быть установлен в заполнитель values ​​(request_uri), когда фактического path_info не было. (Смотрите также PHP руководство по переменным окружения http://php.net/manual/en/reserved.variables.server.php и заметки о PATH_INFO и PATH_TRANSLATED.)

.htaccess: php_value arg_separator.input &;/ 
# Else strtr(..., "/", "&") 

parse_str($_SERVER["PATH_INFO"], $_GET); 

должны заполнить $ _GET.

+0

Я смущен, что не знал о 'PATH_INFO'. Bravo –

+1

Узнал что-то новое. Благодарю. – Pinkie

1
$segments = explode("/", $_SERVER['REQUEST_URI']); 

тогда вы решаете оттуда. каждый из результатов из сегментов $ можно манипулировать одинаково. Вы можете выбрать id = test или просто идентификатор и всегда знать, что $ segment [2] является id, например. Ваш звонок.

Вы должны обязательно изучить mod_rewrite. вам нужно перенаправить вызовы в файл, потому что этот метод не позволит ничего пропустить .php, если вам не разрешено получать vars. (при условии, что через некоторую конфигурацию? и дальше не читается)

в основном перенаправляет все на index.php, если это ваш единственный контроллер.

+0

И функция [parse_str()] (http://php.net/parse_str) полезна с этим. – drew010

1

Вы можете разобрать его, как это:

$uriParts = array_reverse((array) explode('/', $_SERVER['REQUEST_URI'])); 
$GET = explode('=', $uriParts[0]); // however you wanted to parse it form here 

ли с ним, как вы хотите, просто знаю, что $uriParts[0] будет содержать id=whatever.

+0

Должен ли я проверить, существует ли '=' в '$ _SERVER ['REQUEST_URI']', поэтому я знаю, что есть переменная для работы с – Pinkie

+1

. Я бы предположил, что это зависит от вас, поскольку вы будете предоставлять реферальную ссылку, не так ли? –

1

Что вам нужно сделать, это разобрать $_SERVER['REQUEST_URI'], а затем сделать то, что вам нужно.

из вашего примера вам нужно что-то вроде этого:

//get rid of "/index.php 
$uri = substr($_SERVER['REQUEST_URI'], 11); 
//explode incase there are other parameters 
$arr = explode('&', $uri); 
$token = array(); 
foreach($token as $t){ 
    $part = explode('=', $t); 
    $token[$part[0]] = $part[1] 
} 
2

Нет никакого «простого» способа заменить всю функциональность параметров $ _GET, но есть некоторые неудобные хаки, по крайней мере, под Apache. Учитывая, что вы не можете использовать параметры $ _GET, я предполагаю, что у вас также нет доступа к mod_rewrite, но кто знает.

Запрос как http://www.example.com/index.php/foo/bar/baz будет генерировать следующие элементы в $ _SERVER суперглобальное:

[REQUEST_URI] => /index.php/foo/bar/baz 
[SCRIPT_NAME] => /index.php 
[PATH_INFO] => /foo/bar/baz 

В теории, вы можете разобрать $ _SERVER [ 'PATH_INFO'] путем разделения на "/", пробегает по этот массив и разбиение на «=» (предполагая, что вы все еще собираетесь использовать структуру key = value).

Имейте в виде, однако, что побочный эффект шатких структур URL является то, что относительные ссылки в документе будет относительно шатким URL, поэтому изображение как

<img src="images/myimage.jpg">

будет пытаться загрузить http://www.example.com/index.php/foo/bar/images/myimage.jpg

Этого можно избежать, используя абсолютные URL-адреса (http://www.example.com/images/myimage.jpg) или корневые URL-адреса (/images/myimage.jpg).

Но в основном вы просите мир о проблемах ... и устранении неполадок.