2011-07-25 24 views
8

tengo esta afirmación caso PHP¿Hay alguna forma de simplificar esta declaración de caso?

switch ($parts[count($parts) - 1]) { 
    case 'restaurant_pos': 
     include($_SERVER['DOCUMENT_ROOT'] . '/pages/restaurant_pos.php'); 
     break; 
    case 'retail_pos': 
    include($_SERVER['DOCUMENT_ROOT'] . '/pages/retail_pos.php'); 
     break; 
    ..... 

} 

que funciona muy bien, pero tengo muchos muchos archivos (como 190) y me gustaría saber si hay una manera de hacer esta declaración del caso muchos de ellos trabajan con nada, así que no tiene que hacer 190 condiciones del caso. Estaba pensando que puedo usar la condición en el caso y tal vez ver si ese archivo está presente y, en caso afirmativo, mostrar y si no, tal vez una página 404, pero no estaba seguro de una buena manera de hacerlo ... cualquier idea ayudaría mucho

Respuesta

4

Si no es la entrada del usuario, puede hacerlo como

$include = $parts[count($parts) - 1]; 
if ($include) { 
    if (file_exists($_SERVER['DOCUMENT_ROOT'] . '/pages/'.$include.'.php')){ 
      include $_SERVER['DOCUMENT_ROOT'] . '/pages/'.$include.'.php'; 
    } 
} 

repetir, no hacer esto si incluyen $ se está llenando de la entrada del usuario!

+0

¿Estás seguro con respecto a 'file_exists ($ include)'? Es solo parte del camino. Siempre será 'falso'. –

+0

Lo edité unos minutos antes de tu comentario – genesis

+0

Lo siento :) +1 para revisar el código en la respuesta :) –

2

ésta es una aplicación sencilla y sin controles de seguridad:

$file=$_SERVER['DOCUMENT_ROOT']."/pages/".$parts[count($parts) - 1].".php"; 
if(file_exists($file)) include $file; 
else show404(); 

para que sea más segura, por ejemplo, puede eliminar las barras de $parts[count($parts) - 1]

+0

¡este es un gran riesgo de seguridad si es una aportación del usuario! ../../../../etc/passwd ??? – genesis

+0

Como he dicho, no he escrito las comprobaciones de seguridad, pero puede, por ejemplo, eliminar barras o puntos dobles – mck89

+0

Devolveré mi voto tan pronto como se agreguen las comprobaciones de seguridad al ejemplo. – mskfisher

1

por qué no algo como esto?

$include_file = $_SERVER['DOCUMENT_ROOT'] . '/pages/' . $parts[count($parts) - 1] . '.php'; 

if (file_exists($include_file)) 
{ 
    include($include_file); 
} 
1
if (file_exists($path = $_SERVER['DOCUMENT_ROOT'].'/pages/'.$parts[count($parts) - 1].'.php') 
{ 
    include $path; 
} 
2

Compruebe que el archivo exista, y luego inclúyalo.

Tenga en cuenta que DEBE validar el contenido de $page para asegurarse de que no incluye una ruta como /../../../../ para intentar leer en otro lugar en su sistema de archivos si se trata de una entrada del usuario.

Si usted sabe, por ejemplo, que todos tus caminos serán alfanumérica con guiones bajos, se podría hacer:

$page = $parts[count($parts)] - 1; 

if (preg_match('/^[A-Z0-9_]+$/i', $page)) { 
    // it's okay, so include it. 
    if (file_exists($_SERVER['DOCUMENT_ROOT'] . "/pages/$page.php") { 
    include($_SERVER['DOCUMENT_ROOT'] . "/pages/$page.php"); 
    } 
} 
+0

el segundo enunciado if que hace el preg_match ... debería ir antes de $ $ = $ partes [count ($ parts)] - 1; o después y qué es exactamente lo que verifica – Trace

+0

@Tamer coloca el 'if()' dentro de 'preg_match() if()' Voy a modificar la respuesta anterior. –

15

puede predefinir los nombres de archivo en una matriz y luego usar in_array con el fin de comprobar la existencia del nombre:

$files = array('restaurant_pos', 'retail_pos', ......); 
$file = $parts[count($parts) - 1]; 
if (in_array($file, $files)) { 
    include($_SERVER['DOCUMENT_ROOT'] . "/pages/$file.php"); 
} 
+2

+1 para el enfoque de la lista blanca –

+1

La lista blanca es un buen concepto, pero el mantenimiento manual de 190 entradas (que es más que probable que cambie) es engorroso al menos. Sería preferible construir la lista blanca usando scandir() en las páginas/directorio, y usar el directorio como la propia lista blanca. –

+0

cómo construiría esa lista blanca usando scandir() – Trace

1

Otro enfoque sería comprobar si el archivo dado realmente existe en un directorio en particular:

$file = $_SERVER['DOCUMENT_ROOT'] . '/' . basename($parts[count($parts) - 1]) . '.php'; 
if (is_file($file)) include($file); 
Cuestiones relacionadas