Я создаю простую область администрирования для своего сайта, и я хочу, чтобы URL-адреса выглядели примерно так:
http://mysite.com/admin/?home http://mysite.com/admin/?settings http://mysite.com/admin/?users
Но я не уверен, как получить информацию о том, какая страница запрашивается, а затем показать нужную страницу. Я попробовал это в своем коммутаторе:
switch($_GET[]) { case 'home': echo 'admin home'; break; }
Но я получаю эту ошибку:
Fatal error: Cannot use [] for reading in C:\path\to\web\directory\admin\index.php on line 40
Есть ли способ обойти это? Я хочу, чтобы не устанавливать значение для запроса GET, например:
http://mysite.com/admin/?action=home
Если вы понимаете, о чем я. Благодарю. 🙂
Использовать $_SERVER['QUERY_STRING']
– который содержит биты после ?
:
switch($_SERVER['QUERY_STRING']) { case 'home': echo 'admin home'; break; }
Вы можете использовать этот метод еще больше и иметь такие URL-адреса:
http://mysite.com/admin/?users/user/16/
Просто используйте explode()
чтобы разделить строку запроса на сегменты, получить первый и передать остальные в качестве аргументов для метода:
$args = explode('/', rtrim($_SERVER['QUERY_STRING'], '/')); $method = array_shift($args); switch($method) { case 'users': $user_id = $args[2]; doSomething($user_id); break; }
Этот метод популярен во многих средах, в которых используется шаблон MVC. Дополнительный шаг, чтобы избавиться от ?
вообще-то использовать mod_rewrite
на серверах Apache, но я думаю, что это немного выходит за рамки этого вопроса.
Как и упомянутые, другой key($_GET)
был бы key($_GET)
, который вернул бы первый ключ массива $ _GET, что означало бы, что он будет работать с URL-адресами с другими параметрами
Одна из проблем заключается в том, что вы можете сначала использовать reset () в массиве, если вы изменили указатель массива, когда key
возвращает ключ указателя массива элементов в настоящее время.
$_SERVER['QUERY_STRING']
Это не самый «изящный» способ сделать это, но самая простая форма для ответа на ваш вопрос:
if (isset ($ _ GET ['home'])): # показать индекс .. elseif (isset ($ _ GET ['settings'])): # настроек ... elseif (isset ($ _ GET ['users'])): # действия пользователя .. еще: # действие по умолчанию или нет ... ENDIF;
Код PHP:
switch($_GET){ case !empty($_GET['home']): enter code here break; case !empty($_GET['settings']): enter code here break; default: enter code here break;
}
Вы можете сделать ваши ссылки «более приятными», используя переменную $_SERVER['REQUEST_URI']
.
Это позволит вам использовать URL-адреса, такие как:
http://mysite.com/admin/home http://mysite.com/admin/settings http://mysite.com/admin/users
Используемый код PHP:
// get the script name (index.php) $doc_self = trim(end(explode('/', __FILE__))); /* * explode the uri segments from the url ie: * http://mysite.com/admin/home * yields: * $uri_segs[0] = admin * $uri_segs[1] = home */ // this also lower cases the segments just incase the user puts /ADMIN/Users or something crazy $uri_segs = array_values(array_filter(explode('/', strtolower($_SERVER["REQUEST_URI"])))); if($uri_segs[0] === (String)$doc_self) { // remove script from uri (index.php) unset($uri_segs[0]); } $uri_segs = array_values($uri_segs); // $uri_segs[1] would give the segment after /admin/ switch ($uri_segs[1]) { case 'settings': $page_name = 'settings'; break; case 'users': $page_name = 'users'; break; // use 'home' if selected or if an unexpected value is given case 'home': default: $page_name = 'home'; break; }
не// get the script name (index.php) $doc_self = trim(end(explode('/', __FILE__))); /* * explode the uri segments from the url ie: * http://mysite.com/admin/home * yields: * $uri_segs[0] = admin * $uri_segs[1] = home */ // this also lower cases the segments just incase the user puts /ADMIN/Users or something crazy $uri_segs = array_values(array_filter(explode('/', strtolower($_SERVER["REQUEST_URI"])))); if($uri_segs[0] === (String)$doc_self) { // remove script from uri (index.php) unset($uri_segs[0]); } $uri_segs = array_values($uri_segs); // $uri_segs[1] would give the segment after /admin/ switch ($uri_segs[1]) { case 'settings': $page_name = 'settings'; break; case 'users': $page_name = 'users'; break; // use 'home' if selected or if an unexpected value is given case 'home': default: $page_name = 'home'; break; }