A Better way to write a Switch in PHP? - php

I use this example below to ask how to pass an array into a Switch instead of listing them all out like this?
Perhaps if I had an array being fetched from a database for all the 'pages' as page.
I figured this method wasn't the most elegant approach.
switch($_GET['page'])
{
case 'home':
include('home.php');
break;
case 'oem-customers':
include('oem-customers.php');
break;
case 'job-shop':
include('job-shop.php');
break;
case 'anodized-magnet-coils':
include('anodized-magnet-coils.php');
break;
case 'design':
include('design.php');
break;
case 'services':
include('services.php');
break;
case 'black-foil':
include('black-foil.php');
break;
case 'contact':
include('contact.php');
break;
case 'order';
include('order.php');
break;
default:
include('home.php');
}

How about
switch($_GET['page'])
{
case 'home':
case 'oem-customers':
case 'job-shop':
case 'anodized-magnet-coils':
case 'design':
case 'services':
case 'black-foil':
case 'contact':
case 'order';
include("$_GET[page].php");
break;
default:
include('home.php');
}

You can create a mapping:
$mapping = array(
'home' => 'home',
'oem-customers' => 'oem-customers',
#....
);
$page = $_GET['page'];
$file = isset($mapping[$page]) ? $mapping[$page] : 'home';
include($file.'.php');
Or first look up the file, check if the file exists, and perhaps use extra mapping if needed. Note: Sanitize the input, users could send ../../etc/whatever in the request.

Example with an array :
$pages = array(
'oem-customers',
'job-shop',
'anodized-magnet-coils',
'design',
'services',
'black-foil',
'contact',
'order'
);
if(in_array($_GET['page'], $pages)){
include($_GET['page'].'.php');
}else{
include('home.php');
}

You could do the following:
switch($_GET['page']){
case 'home':case 'oem-customers':case 'job-shop':case 'anodized-magnet-coils':
case 'black-foil':case 'services':case 'design':case 'contact':case 'order':
include($_GET['page'].'.php');
break;
default:
include('home.php');
}

well, you seem to have a pretty good match between $_GET['page'] and the filename of the page; an easy thing to do is:
$toInclude = "{$_GET['page']}.php";
include($toInclude);
of course, you want to be careful; someone could trick you by passing something bad in page, like '../../some_other_project/delete_all_data.php'. so can keep a validation list of all of the pages you allow:
$validPages = array('order.php', 'home.php');
if (!in_array($toInclude, $validPages))
$toInclude = 'home.php';

If it were me I'd move your scripts that can be requested into a requests/ folder and do the following:
$script = basename( $_GET['page'] );
$dir = 'requests/';
$file = $dir . $script . '.php';
if ( !file_exists( $file ) ) {
$file = $dir . 'home.php';
}
include( $file );
Much more compact than anything else.
Will auto update whenever you add a new page.
Built-in check for existence of file before include.
Safe due to the containing requests/ folder and basename().

I would suggest a total different way:
$base_path = '/path/to/dir/';
$req = basename($_GET['page'] . '.php');
$page = $base_path . $req;
$file = file_exists($page) ? $page : $base_path . 'home.php';
include($file);

Related

How to get everything after an '#'-selector in the url in php

I'm coding a CDN in PHP, it works this far, but I want to choose different versions by adding an '#' with the version behind it. How do I get the version String after the '#'.
Example: https://cdn.steven2105.de/jquery#3.3.0
<?php
$error = false;
$path = str_replace("/", "", $_SERVER['REQUEST_URI']);
switch($path) {
case "jquery":
$toOpen = "jquery/3.3.1/jquery.min.js";
break;
case "jquery#3.3.0":
$toOpen = "jquery/3.3.0/jquery.min.js";
break;
case "vue":
$toOpen = "vue/2.6.10/vue.min.js";
break;
case "bootstrap-css":
$toOpen = "bootstrap/4.3.1/bootstrap.min.css";
break;
case "bootstrap-js":
$toOpen = "bootstrap/4.3.1/bootstrap.min.js";
break;
case "baguettebox-css":
$toOpen = "baguettebox/1.11.0/baguettebox.min.css";
break;
case "baguettebox-js":
$toOpen = "baguettebox/1.11.0/baguettebox.min.js";
break;
case "popper":
$toOpen = "popper/1.14.7/popper.min.js";
break;
default:
$error = true;
break;
}
if (!$error) {
header("Location: https://cdn.steven2105.de/libs/$toOpen");
} else {
include_once "website.php";
}
EDIT: What should I do now? It doesn't work.
I have different libaries in the path https://cdn.steven2105.de/libs/ e.g. https://cdn.steven2105.de/libs/jquery with files in it such like https://cdn.steven2105.de/libs/jquery/3.3.1/jquery.min.js. I'd like to access these links with a shorter prefix like https://cdn.steven2105.de/jquery#3.3.1. If I use the '#' character it should redirect to the version in the directory https://cdn.steven2105.de/libs/jquery/ and if it's without the '#' it should redirect to the latest version.
What is the easiest way?
You can use explode function for this. It Outputs as an array and fetch it.
<?php
$URL = ' https://cdn.steven2105.de/jquery#3.3.0';
$Result = explode('#', $URL);
echo("<pre>");print_r($Result[1]);
?>
Instead of using PHP you could probably fix this with webserver configuration.
Rewrite rules in Apache (https://httpd.apache.org/docs/2.4/rewrite/remapping.html) should do the trick. I would expect Nginx to offer similar functionality.
If you use Apache or Nginx to do this for you it will be way faster as you won't have the overhead of running a PHP script.

Switch and if statement returns the first case condition regardless if it is true or not

I am working on a , project which i have configured to serves multiple pages from one index.php file using a switch statement like this:
switch(isset($_GET['q']{
case 'page':
require 'link_to_page.php';
break;
case 'login':
require = 'link_to_login.php';
break;
default:
require = 'link_to_404.php';
break;
}
As time goes by and more pages are added, i decided to move it to a selectPage() function which i now called and assigned to a variable $page and required it in my index.php file to make things simpler like this:
myFunctions.php
selectPage()
{
switch(isset($_GET['q']{
case 'page':
$output = 'link_to_page.php';
break;
case 'login':
$output = 'link_to_login.php';
break;
default:
$output = 'link_to_404.php';
break;
return $output;
}
}
My index.php looks like this:
require 'myFunctions.php';
$page = selectPage();
require $page;
Now the problem here is, regardless of which case is true case page: or case 'login':, $output returned is always equal to the first line of case condition checked, for example when case page: is the first line of case statement and $_GET['q'] == 'login', case page: $output value is returned, when i swapped the case 'login': with case page: for it to be the first condition checked, case 'login': $output value which is now the first line of condition is returned even if $_GET['q'] == 'page'.
i have also tried it with an if(statement) and the same thing happened.
How do i fix this, is there something am doing wrong?
Syntax error your Switch statement.
Right SYNTAX :
switch (n) {
case label1:
code to be executed if n=label1;
break;
case label2:
code to be executed if n=label2;
break;
case label3:
code to be executed if n=label3;
break;
...
default:
code to be executed if n is different from all labels;
}
So, myFunctions.php Page
function selectPage()
{
$page = isset($_GET['q']) ? $_GET['q'] : null;
switch ($page) {
case "page":
return 'link_to_page.php';
break;
case "login":
return "link_to_login.php";
break;
default:
return "link_to_404.php";
}
}
index.php page
require 'myFunctions.php';
$page = selectPage();
require $page;
Try this:
switch($_GET['q']){
....
}
You try to check $_GET['q'] but really you check isset($_GET['q']), so when PHP gets true it tries to compare values you give in case statement with true. And as your value are not empty or false values, that condition is true, and code under it will execute.

PHP - Do an else to many ifs?

EDIT: Very simple, figure it out. Just put an else{} without a } before and that will work for both ifs.
Well I wrote this code and it works ok
if($_REQUEST['pag']){
// Variável da página
$pag = $_REQUEST['pag'];
// Possíveis páginas
if($pag == "registrar"){
include "inc/register.php";
}
if ($pag == "recuperar"){
include "inc/recover.php";
}
}
But what if the user types ?pag=ofksaofkoasdkfkopsd ?
The page won't exist, so I want to include a file if that happens.
Is there a way to make this without using a list or something?
you can do this by switch and that would be better way then if because
The switch statement is similar to a series of IF statements on the same expression. In many occasions, you may want to compare the same variable (or expression) with many different values, and execute a different piece of code depending on which value it equals to. This is exactly what the switch statement is for. (manual )
switch($_REQUEST['pag']){
case "registrar":
include "inc/register.php";
break;
case :"recuperar":
include "inc/recover.php";
break;
default:
//default you want to include
break;
}
i hope you know about the complexity of the code and in your case switch case has less complexity in worst/average case
Try with if with else like
$pag = $_REQUEST['pag'];
// Possíveis páginas
if($pag == "registrar"){
include "inc/register.php";
}
elseif ($pag == "recuperar"){
include "inc/recover.php";
}
else{
include "inc/default.php"
}
Or you can use switch case where you can found default option like
switch($pag)
{
case "register":include "inc/register.php";
break;
case "recuperar":include "inc/recover.php";
break;
default : include "inc/default.php";
}
use if {} else{} or switch case.
You can use nested if else though.
At least give an eye on the docs - http://php.net/manual/en/control-structures.elseif.php
Why don't you want to use an array? That really would be the best way to go IMHO. Adding pages is easier, you get less duplicated code... It would also be trivial to load the array from a config file or DB instead of having it hard-coded in a later stadium. I see only benefits.
$pages = array( "registrar" => "inc/register.php",
"recuperar" => "inc/recover.php" );
$requestedPage = $_REQUEST["pag"];
if(array_key_exists($requestedPage, $pages)){
include $pages[$requestedPage];
}
else {
include "inc/error404.php";
}
some Use the switch command.
switch ($_REQUEST['pag']) {
case 'registrar':
echo "some text or action";
break;
case 'xxx':
echo "some text or action";
break;
case 'xxxx':
echo "some text";
break;
default:
echo "some text";
}
$pag = isset($_REQUEST['pag']) ? $_REQUEST['pag'] : null;
switch($pag) {
case 'registrar':
require 'inc/register.php';
break;
case 'recuperar':
require "inc/recover.php";
break;
default:
// Include your default page
}
In a non-dynamic language like C++ you'll have to use
if() elseif() else to compare non-constant values.
if ($condition1)
{
//code
}
elseif ($condition2)
{
//code
}
elseif ($condition3)
{
//code
}
...
else
{
//this is what happens when no other condition is true
}
switch is a better practice. check #user1752647's answer
Try with the elseif and else
if($pag == "registrar"){
include "inc/register.php";
}elseif($pag == "recuperar"){
include "inc/recover.php";
}else{
... //include a file if the page doesn't exist
}
Or you can do it with a switch
switch($pag){
case "registrar":
include "inc/register.php";
break;
case "recuperar":
include "inc/recover.php";
break;
default:
... //include a file if the page doesn't exist
}
Hope it will help you.
You also can use this code
$pages = array("register", "recover");
if (in_array($_REQUEST["pag"], $pages)) {
include $_REQUEST["pag"].".php";
}
else{
include "default.php";
}

how to include a page in php

I usually use this code below to include the page that I need into the body of my website to include the page when clicking on a link.
<?php
switch($_GET['page']){
case '1':
if(file_exists('main.php'))
{
include_once('main.php');
break;
}
default:
include_once('main.php');
break;
}
?>
but then I have to change this everytime i add a menu item by adding a case '2' ... etc
and now my question can this be written shorter/dynamically so that i just can add a link without having to change the piece of code everywhere?
ps: i did made it a little bit shorter.. but its still not good enough i think..
i also want to add this: i get my links from a ini file. i place it in there like this:
[navigation]
main.php = "Home"
if (!isset($_GET['page'])) {
$_GET['page'] = 'main.php';
}
switch ($_GET['page']){
case 'main.php':
case 'about.php':
case 'portfolio.php':
case 'tips.php':
$file = $_GET['page'];
break;
default:
$file = '404.html';
}
include_once $file;
is it possible to get this too from the ini file?
Try this:
$page = isset($_GET['page']) ? $_GET['page'] : "main.php";
if( file_exists($page)) include($page);
else include("404.html");

(?p=home) includes pages not working

I have setup a new server and copyed my website on to it and the follow dont work (?p=home) includes pages.
Code:
if(isset($HTTP_GET_VARS['p']))
{
$page = $HTTP_GET_VARS['p'];
}
else
{
$page = 'home';
}
switch($page)
{
case 'home':
require('home.php');
break;
case 'login':
require('login.php');
break;
default:
echo('Error: There is no file on this server with that name');
}
On the other webhost it was on it worked fine am think in that it is a php.ini config file need editing can anyone help me?
Use the $_GET array instead of $HTTP_GET_VARS. The latter one is deprecated and probably disabled due to register_long_arrays.
This must do the trick :)
if(isset($_GET['p']))
{
$page = $_GET['p'];
}
else
{
$page = 'home';
}

Categories