PHP switch with GET request

getPHPswitch statement

I am building a simple admin area for my site and I want the URLs to look somewhat like this:

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

But I am not sure how I would retrieve what page is being requested and then show the required page. I tried this in my switch:

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

But I get this error:

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

Is there any way around this? I want to avoid setting a value to the GET request, like:

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

If you know what I mean. Thanks. 🙂

Best Answer

Use $_SERVER['QUERY_STRING'] – that contains the bits after the ?:

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

You can take this method even further and have URLs like this:

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

Just use explode() to split the query string into segments, get the first one and pass the rest as arguments for the method:

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

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

        doSomething($user_id);
        break;
}

This method is popular in many frameworks that employ the MVC pattern. An additional step to get rid of the ? altogether is to use mod_rewrite on Apache servers, but I think that's a bit out of scope for this question.