2009-04-12 10 views
0

Quand je lance ce code:Pourquoi est-ce que j'obtiens un "index indéfini" de mon PHP?

<?php 
if (preg_match('/^[a-z0-9]+$/', $_GET['p'])) { 
    $page = realpath("includes/$_GET[p].php"); 
    if ($page) { 
    include $page; 
    } 
} 
?> 

Je reçois cette erreur:

Notice: Undefined index: p in index.php on line 3

+0

duplication possible de [PHP: "Remarque: Undefined variable" et "Notice: Undefined Index"] (http://stackoverflow.com/questions/4261133/php-notice-undefined-variable-and-notice-undefined- index) – Jocelyn

Répondre

4
$page = realpath("includes/ " . $_GET['p'] . ".php"); 
0

Il n'y a aucun paramètre 'p' à la page, peut-être? Vouliez-vous dire $_REQUEST à la place?
En outre, n'est-ce pas `" $ {_ GET ['p']} "lorsque vous accédez à un tableau?

12

Le message d'erreur indique qu'il n'y a aucun élément de tableau avec la clé p. Si vous ne pouvez pas garantir qu'une variable (ou un élément de tableau) existe, vous devez d'abord vérifier avec le isset function:

if (isset($_GET['p']) && preg_match('/^[a-z0-9]+$/', $_GET['p'])) { 
    $page = realpath("includes/$_GET[p].php"); 
    if ($page) { 
     include $page; 
    } 
} 
+0

dans mon opionion ce n'est pas une solution au problème ... – TheHippo

+1

C'est juste du code incorrect car "$ _GET [p]" signifie que vous accédez à la constante "p". Cela fonctionne néanmoins parce que PHP suppose que vous vouliez dire la chaîne 'p'. – ericteubert

+0

@Dazmorgan: Ce n'est pas vrai. '$ a = array ('foo' => 'foo', 'bar' => 'barre'); define ('foo', 'bar'); echo "$ a [foo]" 'fait écho à" foo "et non à" bar ". Ainsi, il est interprété comme '$ a ['foo']'. – Gumbo

2

Il n'y a pas de problème réel. PHP donne un Remarquez pas un Avertissement ou Erreur. Fondamentalement, votre script ne reçoit pas le paramètre URL p. Donc, il utilise '' et donne un avis dans le journal. Si vous voyez ce message sur votre page de rendu, ajustez les rapports d'erreur php à quelque chose comme E_ERROR | E_WARNING dans PHP.ini

5

Ce que Gumbo a dit pour vérifier si l'index est défini dans le tableau.

De même pour parsing an array index in a string, vous devez utiliser des parenthèses autour du tableau, et vous devez échapper l'index avec des guillemets simples s'il s'agit d'une chaîne.

$page = realpath("includes/{$_GET['p']}.php"); 

Mais pour inclure des fichiers proposés par l'utilisateur, le plus sûr moyen est de rechercher les fichiers dans un tableau, et ne les comprennent si elles existent là.

0

Regardez dans array_key_exists() pour vérifier si une clé de tableau ... existe. Mais dans votre cas, je vous suggère de choisir la classe de fonctions filter qui se spécialise dans le travail avec l'utilisateur.

+0

$ _GET et $ _POST définis par le serveur Web auront uniquement des valeurs de chaîne ou de tableau. array_key_exists n'est nécessaire que si null est une valeur valide. – OIS

Questions connexes