Include files with $_GET switch statement? - php

guys! I am a newbie. I think about it all day but still not much..
I have one index.php file, one switch statement:
$current_page = $_GET['page'];
switch ($current_page) {
case ('homepage'):
include 'contents/homepage.php';
break;
case ('about'):
include 'contents/about.php';
break;
case ('contacts'):
include 'contents/contacts.php';
break;
default:
include 'contents/homepage.php';
}
I include a file if the get attribute is some of the names.
And if the URL is for example: myproject/index.php?page=about
The proper content file is included.
But when the URL is just: myproject/index.php
No file is included.
I was thinkig to add something like:
if (!isset($_GET['page'])) {
header('Location: index.php?page=homepage');
}
But it is kind of ugly I think and the URI cannot be nver just index.php.. And what if the parameter is not "page"... It is a problem again.
Do you have in mind some simple understandable solution for this. How to include the proper contents according to the different pages?
Thank you very much!

First, when checking if an array's key is set, use array_key_exists instead. It is much faster for the parser.
Second, you shouldn't redirect the page. Instead, use a default value, like so:
// Set default value
$current_page = 'homepage';
// Change value if `page` is specified
if(array_key_exists('page',$_GET) {
$current_page = $_GET['page'];
}
// Check page
switch ($current_page) {
case 'about':
include 'contents/about.php';
break;
case 'contacts':
include 'contents/contacts.php';
break;
case 'homepage':
default:
include 'contents/homepage.php';
}
Additionally, as I have done above, you don't need to specify the include for homepage twice. Without a break statement, the parser will go into the next case statement. If you want to treat multiple values the same, you can simply specify them subsequently.
I hope this helps!

$current_page = isset($_GET['page'])?$_GET['page']:'homepage';

This should do it
$current_page = isset($_GET['page']) ? $_GET['page'] : null;
switch ($current_page) {
case ('homepage'):
include 'contents/homepage.php';
break;
case ('about'):
include 'contents/about.php';
break;
case ('contacts'):
include 'contents/contacts.php';
break;
default:
include 'contents/homepage.php';
}

Related

Issue with switch statement and $_GET

I have an issue with this switch case, I will be glad if someone could give me a hint on what's going wrong.
The lines below keep on adding the case 1, 2 or 3 below the default one (centre_1) instead of replacing it.
I can't find where it goes wrong. Here is the code :
<?php include("mx/centre_1.php");
if(!isset($_GET['page'])) {
$page='centre_mx.php';
} else {
switch($_GET['page']) {
case'centre_1':
include('/mx/centre_1.php');
break;
case'centre_2':
include('/mx/centre_2.php');
break;
case'centre_3':
include('/mx/centre_3.php');
break;
}
}
?>
Any assistance will be helpful.
The reason '/mx/centre_1.php' is always being displayed is because you have it at the top of your code, outside of the if and switch statement. Due to this it'll be included on every page load.
In order to only have '/mx/centre_1.php' appear when no other option is selected you need to make it the default switch case.
$page = '';
if(in_array('page', $_GET)) {
$page = $_GET['page'];
}
switch($page) {
case 'centre_2':
include('/mx/centre_2.php');
break;
case 'centre_3':
include('/mx/centre_3.php');
break;
default:
include('/mx/centre_1.php');
}
The default case in a switch statement will happen when none of the other cases match the variable provided. That is, if $_GET['page'] doesn't equal centre_2 or centre_3 then the default code will be performed.
I'd suggest reading up more on switch statements here, since you don't seem to understand how they work.

I use switch statement to include specific file but it includes the "default" also

Here's my code
<?php
$id = isset($_GET['id']) ? $_GET['id'] : '';
switch ($id) {
default:include_once('default.php');
break;
case 'actiune':include('jocuri/actiune/index.php');
break;
case 'aventura':include('jocuri/aventura/index.php');
break;
}
?>
<!--games-->
<?php
$game = isset($_GET['game']) ? $_GET['game'] : '';
switch ($game) {
case 'nz':include('jocuri/actiune/ninja-vs-zombie/index.php');
break;
case 'aventura':include('/jocuri/aventura/index.php');
break;
}
?>
So when I try to acces case 'nz' from it also includes default from the top part. So how can i do to include only the 'nz' case?
Try moving the default statement to the bottom of the first switch statement. A switch statement goes straight down each case path, hence the need for the break keyword. The default case will always execute in the case no matter what. Putting it at the bottom will ensure it will only get executed when the cases fail.
As I understand you would like to ignore 'top part' (including file by id) when game parameter is provided.
Try to add IF statement to execute first switch-statement only if game is not provided (or not matched with your provided cases ['aventura', 'nz'])
Moreover you can do something like that:
$id = isset($_GET['id']) ? $_GET['id'] : '';
$game = isset($_GET['game']) ? $_GET['game'] : '';
$games = array('nz' => 'jocuri/actiune/ninja-vs-zombie/index.php',
'aventura' => '/jocuri/aventura/index.php');
$ids = array('actiune' => 'jocuri/actiune/ninja-vs-zombie/index.php',
'aventura' => '/jocuri/aventura/index.php');
if (array_key_exists($game, $games))
{
include($games[$game]);
}
else if (array_key_exists($id, $ids))
{
include($ids[$id]);
}
else include('default.php');
try this
<?php
$id = isset($_GET['id']) ? $_GET['id'] : '';
switch ($id) {
case 'actiune':include('jocuri/actiune/index.php');
break;
case 'aventura':include('jocuri/aventura/index.php');
break;
default:include_once('default.php');
break;
}
?>
<!--games-->
<?php
$game = isset($_GET['game']) ? $_GET['game'] : '';
switch ($game) {
case 'nz':include('jocuri/actiune/ninja-vs-zombie/index.php');
break;
case 'aventura':include('/jocuri/aventura/index.php');
break;
}
?>
(I did try to add this as a comment to osulerhia's answer but couldn't and figured it might answer the posters question if I've read it correctly).
I'm not sure if I understand your question correctly and if osulerhia's answer above is what you're looking for.
You're expecting two separate GET variables ("id" and "game") and if the game variable is "nz" you don't want to show the default from the switch statement you're using for "id"?
If that's right then you need to add some sort of logic to how you want your switch statements to play out. You then also need to consider though whether you want either of the others to show if "nz" is the value of "game". Your logic (written plainly) is currently:
Is the id variable "actiune" -> include a file
Is the id variable "aventura" -> include a file
Is the id variable anything else -> include the default file
Is the game variable "nz" -> include a file
Is the game variable "aventura" -> include a file
As you can see both of your switches are completely separate, you need to decide what you want to display and when you want to display it, for example, if you wanted everything to work as above but to not display ANYTHING from the first switch if the value of the game variable is "nz" then you could wrap it in an if statement like:
if((isset($_GET['game']) && $_GET['game'] != "nz") || (!isset($_GET['game']))) { *your original switch statement* }

PHP Switch Case Url's

We currently use Switch case url config to help us with the navigation on some of our urls, Im not sure if there is an easier way to do it but i couldnt seem to find 1.
<?php if (! isset($_GET['step']))
{
include('./step1.php');
} else {
$page = $_GET['step'];
switch($page)
{
case '1':
include('./step1.php');
break;
case '2':
include('./step2.php');
break;
}
}
?>
Now this system works perfectly but the only snag we hit is if they type in xxxxxx.php?step=3 boom they just get a blank page and that should be correct as there is no case for it to handle '3' but what i was wondering is .. is there any php code i could add to the bottom that may tell it for any case other than those 2 to redirect it back to xxxxx.php ?
Thanks
Daniel
Use the default case. That is, change your switch to something like this:
<?php if (! isset($_GET['step']))
{
include('./step1.php');
} else {
$page = $_GET['step'];
switch($page)
{
case '1':
include('./step1.php');
break;
case '2':
include('./step2.php');
break;
default:
// Default action
break;
}
}
?>
The default case will be executed for every case which is not explicitly specified.
All switch statements allow a default case that will fire if no other case does. Something like...
switch ($foo)
{
case 1:
break;
...
default:
header("Location: someOtherUrl");
}
would work. You may, however, want to Google around for other, more robust and extensible, page dispatch solutions.
How about a different approach with something along the lines of:
<?php
$currentStep = $_GET['step'];
$includePage = './step'.$currentStep.'.php'; # Assuming the pages are structured the same, i.e. stepN where N is a number
if(!file_exists($includePage) || !isset($currentStep)){ # If file doesn't exist, then set the default page
$includePage = 'default.php'; # Should reflect the desired default page for steps not matching 1 or 2
}
include($includePage);
?>

how do i add two values for one case using switch?

im trying to create a website using switch commands to navigate with the contents displayed in a table via echo content. everything works fine. but one of the pages consists of multiple pages. The address looks like this website/index.php?content=home etc.
but i want to make it like this for the page consisting multiple pages website/index.php?content=home&page=1
my index code:
<?php
switch($_GET['content'])
{
case "home":
$content = file_get_contents('home.php');
$pages = file_get_contents('pages/1.php'); //like this?
break;
case "faq":
$content = file_get_contents('faq.php');
break;
default:
$content = file_get_contents('home.php');
break;
}
?>
//some code
<?php echo $content; ?>
//some code
the home php:
<?php
switch($_GET['page'])
{
default:
case "1":
$page = file_get_contents('pages/1.php');
break;
default:
$page = file_get_contents('pages/1.php');
break;
}
?>
// some code
<?php echo $page; ?>
//some code
go to page etc.
but when i do it like this the echo command shows me the code of the home.php but not the one of the page i wanna load inside of it.
i appreciate any kind of help!
"default" must logically always come last in your switch, since it will match any input that hasn't already been matched by a previous "case" statement.
If you want to do certain actions for multiple values, you can do it like this:
switch ( $var ) {
case 'foo':
case 'bar':
// Do something when $var is either 'foo' or 'bar'
break;
default:
// Do something when $var is anything other than 'foo' or 'bar'
break;
}
Try using include() instead.
Also, as #Rob said, your second switch() statement is ill formatted. default: should always be last and is used as a "catch-all" for values you didn't specify earlier.
first of all, why don't you use include() instead of file_get_contents()?
Second of all: you could use your "manager" page in this way:
<?php
$myPage = $_GET['page'];
$myContent = $_GET['content']
switch($myContent){
case "mycontent":
case "home": include('/home.php');
if(!empty($myPage)){
include ('/pages/'.$myPage.'.php');
}
break;
default:
// do whatever you want
}
?>
Be careful of (as in steweb's example) including files based on user input, even with a prepended path — remember that there's the possibility of executing untrusted code. (Imagine if $_GET['page'] is set to ../../../some-evil-file.php, for example.)
To avoid this, it's easiest to use a whitelist:
$pages = array( 1, 2, 18, 88 );
switch ( $_GET['content'] ) {
case 'home':
if ( in_array( $_GET['page'], $pages ) ) {
include 'pages/' . $_GET['page'] . '.php';
} else {
// If an invalid page is given, or no page is
// given at all, include a default page.
include 'pages/1.php';
}
break;
}

PHP switch with GET request

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. :)
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.
As well as the ones mentioned, another option would be key($_GET), which would return the first key of the $_GET array which would mean it would work with URLs with other parameters
www.example.com/?home&myvar = 1;
The one issue is that you may want to use reset() on the array first if you have modified the array pointer as key returns the key of the element array pointer is currently pointing to.
The PHP code:
switch($_GET){
case !empty($_GET['home']):
// code here
break;
case !empty($_GET['settings']):
// code here
break;
default:
// code here
break;
}
$_SERVER['QUERY_STRING']
Is not the most "elegant" way to do it but the simplest form to answer your question is..
if (isset($_GET['home'])):
# show index..
elseif (isset($_GET['settings'])):
# settings...
elseif (isset($_GET['users'])):
# user actions..
else:
# default action or not...
endif;
You can make your links "look nicer" by using the $_SERVER['REQUEST_URI'] variable.
This would allow you to use URLs like:
http://mysite.com/admin/home
http://mysite.com/admin/settings
http://mysite.com/admin/users
The PHP code used:
// 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;
}

Categories