2012-04-19 15 views
5

Tengo un montón de obtener los valores que definen la página que el usuario va a ver, por ejemplo, para "perfil" Voy a mostrar la página de perfil y así sucesivamente ..

para averiguar qué página a pantalla i trató de hacer algo así:

switch ($_GET) { 
    case 'profile': 
     require_once('function/profile.php'); 
     break; 
    case 'team': 
     require_once('function/team.php'); 
     break; 

pero no muestra ningún resultado ..

de que envíe la solicitud GET de esa manera: index.php? perfil, por ejemplo ..

lo es el problema aquí y cómo puedo lograr hacer algo similar que funcione también. ¡gracias de antemano!

+0

puede usted llamar print_r ($ _ GET) y mostrar lo que es ¿impreso? –

Respuesta

9

Para hacer su trabajo ejemplo, podría reemplazar $_GET con key($_GET)

tener en cuenta sin embargo que key() devolverá el primera clave una matriz, por lo que si cambia el orden de las variables de su URL, esta línea dejará de funcionar.

+0

eso es increíble, gracias! –

+0

De nada :) – stewe

+0

¡Gracias! ¡Increíble! Nunca pensé en eso. ¿Hay algo malo con este enfoque? –

1

trata de una matriz, por lo que es necesario utilizar un bucle para iterar sobre los valores:

foreach($_GET as $key => $val){ 
    switch ($key) { 
     case 'profile': 
      require_once('function/profile.php'); 
      break; 
     case 'team': 
      require_once('function/team.php'); 
      break; 
    } 
} 
+0

esto debería ser foreach ($ _ GET as $ key => $ val) y luego cambiar ($ clave), gracias, me ayudó mucho. –

+0

Vuelva a verificarlo, especifiqué 'clave => valor' – Michelle

1

$ _GET es una variable global estupendo, al que se envían los datos almacenados como matriz. Así que hay que acceder a ella mediante el índice de

que Asumiendo página que está tratando de incluir una página cuando los datos se envían como esto:

domain.com?page=product

entonces usted tiene que usar el interruptor como esto

switch($_GET['page']) { 
    .... 
} 

Nota: Puede ser que no tengo que recordarle cuán vulnerable es este código para la inyección.

+0

Cualquier comentario para ese voto abajo? – Starx

5

$_GET es una matriz o variables que se completan en función de la cadena de consulta de la URL. Es necesario hacer algo como:

switch ($_GET['myVar']) { ... } 

donde su URL se vería así:

http://www.domain.com/index.php?myVar=value 

Para obtener más información, consulte la PHP Manual for $_GET.

0

con foreach se puede obtener la clave y el valor par

foreach ($_GET as $switchkey => $switchval) { 
    switch ($switchkey) { 
    case 'profile': 
     require_once('function/profile.php'); 
     break; 
    case 'team': 
     require_once('function/team.php'); 
     break; 
    } 
} 
+0

esto debería ser foreach ($ _ GET as $ key => $ val) y luego cambiar ($ clave), gracias, me ayudó mucho ... –

+0

maldita sea, yo estaba 30 segundos demasiado lento. :) – user1289347

8

$ _GET es una matriz a partir de los pares de valores clave encontrados en la cadena de consulta (parte de la url después del nombre del script y un signo de interrogación).

Por ejemplo, la cadena de consulta test=1&foo=bar se traducirá en:

Array(
    test => 1 
    foo => 'bar' 
) 

En el ejemplo OP, index.php?profile, el resultado final será con una matriz _GET $ como:

Array(
    profile => null 
) 

problema de hacer URL como esta es que no es estándar. Cuando haces cosas de una manera no estándar, tienes que encontrar soluciones no estándar para solucionar los problemas.

Estas son algunas opciones, junto con los problemas que cada uno tiene:

  1. Puede utilizar $_SERVER['QUERY_STRING'], que pueden ayudarle todo después de la ? en la url. Esto está bien si lo único que se pasa en la url es solo profile (o algún otro valor único). En ese caso, $_SERVER['QUERY_STRING'] no tendrá nada más que profile en él. Pero también pierde la capacidad de pasar parámetros adicionales en la cadena get.

  2. Puede ir con el método descrito por @stewe. La función php key devolverá la clave desde la posición actual en la matriz pasada. Si no ha realizado ningún bucle, la posición actual es el primer elemento. Esto funcionará bien con múltiples parámetros de obtención también. Su cadena de consulta se verá como index.php?profile&test=1&foo=bar. El problema es que profile (o cualquier página) tiene que ser la primera o la tecla else devolverá la clave que sea para el primer parámetro pasado.

  3. Otra opción es simplemente ir con el método estándar de usar una clave y un valor. Independientemente de la página, usa la misma clave y solo cambia el valor. A continuación, tiene las URL que se parecen a index.php?page=profile y siempre puede acceder a la página usando $_GET['page'].

  4. Puede usar mod_rewrite. Es fácil de configurar, la mayoría de los hosts lo admiten (o algún otro similar) y hay millones de tutoriales y ejemplos sobre cómo hacer que funcione. Terminas con las URL más limpias y funciona con los parámetros de cadena de consulta. Por ejemplo, /profile/ puede reescribirse para apuntar a /index.php?page=profile. El usuario ve /profile/ y php ve el estándar. Esto le permite usar $_GET['page'] para obtener la página solicitada y no tener que realizar un análisis adicional para obtener otros valores dentro de php.

+0

+1 para las alternativas y las advertencias, pero ¿por qué pasar un elemento de cadena de consulta de valor nulo no sería estándar? Estoy de acuerdo en que tiene que privilegiar la reescritura pero, en algunos casos, es excesivo. Puede usar comething como 'switch (true) {case in_array ('profile', array_keys ($ _ GET)): ...; break;}' para resolver el problema de "siempre tiene que estar en primera posición" – Capsule

+0

@ Cápsula en mi humilde opinión no es estándar porque está utilizando la clave como un valor.Solo me refiero a que no es estándar porque normalmente no está hecho. No estoy diciendo que sea incorrecto, pero generalmente cuando tienes que codificar una solución en torno a algo que es fácil e integrado no es estándar. Y para contrarrestar el cambio, si tiene varias claves que coinciden con los nombres de las páginas, entonces está sujeto al orden en que aparecen en su interruptor. –

+1

Solo tienes que ser consciente de eso y usar el tipo de interruptor que propuse en mi comentario anterior, pero sí, entiendo tu punto. Las URL de "clave corta" solo son útiles fuera de un interruptor, como si solo quisieras probar 'if (isset ($ _ GET ['profile'])) {...}'. El orden no importa en este caso. – Capsule

2

$ _GET por sí solo no es muy útil para usted. Supongo que estás buscando una clave, como 'página', ¿verdad? Recuerde declarar un valor predeterminado también.

así ..

$page = $_GET['page']; 

switch ($page) { 
    case 'profile': 
    require_once('function/profile.php'); 
    break; 
    case 'team': 
    require_once('function/team.php'); 
    break; 
    default: 
    require_once('function/page-not-found.php'); 
} 
+0

supongo que no soy el único que lo llama página. en php.ini puedes jugar con los selectores también. lo teníamos creando urls como 'index.php? page-> home' antes de la producción. el jefe no pensó que fuera muy gracioso. – r3wt

0

utilizo realmente lo siguiente después de un encuentro normal, lo que resulta en vulnerabilidades LFI/RFI. la siguiente solución se me envió a través de un programa de recompensas de error y funciona muy bien. observe la inclusión del atributo default. muy importante. la siguiente debería ser la única respuesta aceptable. El crédito al monstruo volador de espagueti (Su noodly orejuela)

    switch($_GET['page']) { 

         case 'foo': 

          include('pages/foo.php'); 

          break; 

         case 'bar': 

          include('pages/bar.php'); 

          break; 
         default: 

          include('pages/home.php'); 

        } 
0

Como se mencionó antes, la primera cosa que parece venir a la mente es la forma no estándar de transmitir la información. lo que generará algunas dificultades al analizar los valores.Aunque, para mí, el principal problema no es verificar/sanitar/limpiar los datos en $ _GET. Puede ser que sea demasiado obvio y dado que casi todas las respuestas han sido dadas por personas que parecen saber lo que están haciendo, supongo que simplemente no lo mencionaron por eso

Pero recuerde que si no lo hace Verifíquelo, usted es vulnerable a ataques y mal funcionamiento de su script. La magnitud del daño depende de su propia aplicación, por lo que no es fácil de predecir.

En cualquier caso, esto es lo que voy a hacer, incluyendo el html

<?php 
    // initialize variables 
    $variable_1 = false; // assume this is the page you want to load 
    $variable_2 = false; 
    $default = 'index.php'; // the idea is to load something controlled by you. index, error, 404, etc. 

    // process $_GET, check, clean and assign values 
    if (isset($_GET) !== false) { 
     foreach ($_GET as $keys => $values) { 
      // check both, $keys and $values for; character set, length, validity against a white list, content 
      // using an if to match the $keys garantees that regardless of the order, you will get what you want 
      if ($keys === 'field_1') { 
       // do what you have to do with this, for instance ... 
       $variable_1 = $values; 
      } 
      if ($keys === 'field_2') { 
       // do what you have to do with this, for instance ... 
       $variable_2 = $values; 
      } 
      unset($_GET[$keys]); 
     } 
     unset ($keys, $values); 
    } 

    // check there are no surprises on $_GET. Load and study anything here 
    if (empty($_GET) === false) { 
     // it should be empty, so log what is in here and prepare your code for that 
     unset($_GET); 
    } else { 
     unset($_GET); 
    } 

    // process the variables according to what you want to do 
    // if there are just a few options, and they are not going to change often 
    // use a switch, otherwise, use a method to check if a file/content exists 
    // for the request and load it. If it doesn't exist, inform the user 
    // with out giving away internals and suggest a new destination 

    // process other variables, here or before this part, wherever makes sense 


?> 
<!DOCTYPE html> 
<html lang="en"> 
    <head> 
     <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
     <title>testing get</title> 
    </head> 
    <body> 
     <form method="get" action="test_get_00.php" accept-charset="utf-8"> 
      <p><label for="field_1">write something<input type="text" id="field_1" name="field_1" /></label></p> 
      <p><label for="field_2">write something<input type="text" id="field_2" name="field_2" /></label></p> 
      <p><button type="submit">send</button></p> 
     </form> 
    </body> 
</html> 

Por supuesto que puede hacer algunas cosas más, pero si usted prepara su forma adecuada, incluyendo el conjunto de caracteres, tener menos preocupaciones, o al menos algunos elementos más conocidos. No es a prueba de fallas, pero ayuda.

Además, los mecanismos que mencioné anteriormente funcionan en una mentalidad de lista blanca, esa es la idea del foreach, para verificar que obtenga lo que espera y descartar el resto, después de iniciar sesión.

0

Está intentando archivar las URL de SEO de forma incorrecta.

Veo que index.php?profile es mejor que index.php?page=profile pero es la forma incorrecta de actuar en este caso.

Debe utilizar index.php?page=profile y luego aplicar una regla de reescritura para crear direcciones URL de SEO, como éste:

RewriteEngine On 

RewriteRule ^(.*)$ index.php?page=$1 

De esta manera, los usuarios van a utilizar:

http://example.com/profile 

y la página mostrada se ser:

http://example.com/index.php?page=profile 
0

en lugar de encender las llaves (como lo propone la llave ($ _ GET)) usted podría definir una variable, en $ _GET (url) nombrada, por ejemplo, "acción" que contendría "perfil", o "equipo" o lo que sea que desee en el futuro. entonces su interruptor, simplemente, será:

switch ($_GET['action']) 

por lo que cualquier acción que se asigna a esta tecla, se puede utilizar como un caso en el conmutador

Cuestiones relacionadas