GET isteği ile PHP anahtarı

6 Cevap php

Benim site için basit bir yönetici alanı inşa ediyorum ve ben URL'leri biraz böyle bakmak istiyorum:

http://mysite.com/admin/?home
http://mysite.com/admin/?settings
http://mysite.com/admin/?users

Ama ben ne sayfa, istenen ve daha sonra gerekli sayfayı göstermek ediliyor almak nasıl emin değilim. Ben anahtarı bu çalıştı:

switch($_GET[])
{
    case 'home':
        echo 'admin home';
        break;
}

Ama bu hatayı alıyorum:

Fatal error: Cannot use [] for reading in C:\path\to\web\directory\admin\index.php on line 40

Bu etrafında herhangi bir yolu var mı? Ben gibi, GET isteğine bir değer ayarlayarak önlemek istiyorsanız:

http://mysite.com/admin/?action=home

Ne demek istediğimi biliyorum. Teşekkürler. :)

6 Cevap

Kullan $_SERVER['QUERY_STRING'] - bu sonra uç içerir ?,

switch($_SERVER['QUERY_STRING']) {
    case 'home':
        echo 'admin home';
        break;
}

Hatta daha bu yöntemi almak ve bu gibi URL'leri olabilir:

http://mysite.com/admin/?users/user/16/

Sadece explode(), bölümler halinde sorgu dize bölmek ilk almak ve yöntemi için bağımsız değişken olarak geri kalanını geçirmek için kullanabilirsiniz:

$args = explode('/', rtrim($_SERVER['QUERY_STRING'], '/'));
$method = array_shift($args);

switch($method) {
    case 'users':
        $user_id = $args[2];

        doSomething($user_id);
        break;
}

Bu yöntem, MVC deseni istihdam Birçok çerçeveler popüler. ? kurtulmak için ek bir adım tamamen mod_rewrite Apache sunucuları kullanmak için, ama ben bu soru için biraz kapsam dışı olduğunu düşünüyorum.

PHP kodu:

switch($_GET){
case !empty($_GET['home']):
   enter code here
break;

case !empty($_GET['settings']):
     enter code here
break;   

default:
     enter code here
break;

}

$_SERVER['QUERY_STRING']

Yanı sıra olanları da belirtildiği gibi, başka bir seçenek diğer parametreler ile URL'ler ile çalışmak anlamına gelirdi $ _GET dizinin ilk anahtarı dönecekti ki, key($_GET) olurdu

www.example.com/?home&myvar = 1;

Tek sorun, şu anda işaret key eleman dizisi ibrenin anahtarını verir gibi dizi işaretçi modifiye varsa ilk dizide reset() kullanmak isteyebilirsiniz olmasıdır.

Bunu yapmak için en "şık" yoludur ama soru cevap basit formu değil ..


    if (isset($_GET['home'])):  
        # show index..  
    elseif (isset($_GET['settings'])):  
        # settings...  
    elseif (isset($_GET['users'])):  
        # user actions..  
    else:  
        # default action or not...  
    endif;

Sen bağlantıları $_SERVER['REQUEST_URI'] değişkeni kullanarak "güzel bakmak" yapabilirsiniz.

Bu gibi URL'leri kullanmak için izin verecek:

http://mysite.com/admin/home
http://mysite.com/admin/settings
http://mysite.com/admin/users

Kullanılan PHP kodu:

// get the script name (index.php)
$doc_self = trim(end(explode('/', __FILE__)));

/*
 * explode the uri segments from the url i.e.: 
 * 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;
}