web-dev-qa-db-fra.com

php $ _GET et index non défini

Un nouveau problème est survenu lorsque j'ai essayé d'exécuter mon script sur un autre serveur PHP.

Sur mon ancien serveur, le code suivant semble fonctionner correctement, même si aucun paramètre s n'est déclaré. 

<?php
 if ($_GET['s'] == 'jwshxnsyllabus')
echo "<body onload=\"loadSyllabi('syllabus', '../syllabi/jwshxnporsyllabus.xml',         '../bibliographies/jwshxnbibliography_')\">";
if ($_GET['s'] == 'aquinas')
echo "<body onload=\"loadSyllabi('syllabus', '../syllabi/AquinasSyllabus.xml')\">"; 
 if ($_GET['s'] == 'POP2')
echo "<body onload=\"loadSyllabi('POP2')\">";
elseif ($_GET['s'] == null)
echo "<body>"
?>

Mais maintenant, sur un serveur local de ma machine locale (XAMPP - Apache), le message d'erreur suivant s'affiche lorsqu'aucune valeur pour s n'est définie.

Notice: Undefined index: s in C:\xampp\htdocs\teaching\index.php on line 43
Notice: Undefined index: s in C:\xampp\htdocs\teaching\index.php on line 45
Notice: Undefined index: s in C:\xampp\htdocs\teaching\index.php on line 47
Notice: Undefined index: s in C:\xampp\htdocs\teaching\index.php on line 49

Ce que je veux faire pour que le script appelle certaines fonctions javascript si une valeur est déclarée pour s, mais si rien n'est déclaré, j'aimerais que la page se charge normalement. 

Pouvez-vous m'aider?

39
Jeff

Les rapports d'erreur n'auront pas inclus les avis sur le serveur précédent, c'est pourquoi vous n'avez pas vu les erreurs.

Vous devriez vérifier si l'index s existe réellement dans le tableau $_GET avant de tenter de l'utiliser.

Quelque chose comme cela serait suffisant:

if (isset($_GET['s'])) {
    if ($_GET['s'] == 'jwshxnsyllabus')
        echo "<body onload=\"loadSyllabi('syllabus', '../syllabi/jwshxnporsyllabus.xml',         '../bibliographies/jwshxnbibliography_')\">";
    else if ($_GET['s'] == 'aquinas')
        echo "<body onload=\"loadSyllabi('syllabus', '../syllabi/AquinasSyllabus.xml')\">"; 
    else if ($_GET['s'] == 'POP2')
        echo "<body onload=\"loadSyllabi('POP2')\">";
} else {
    echo "<body>";
}

Il peut être avantageux (si vous envisagez d'ajouter plusieurs observations) d'utiliser une instruction switch pour rendre votre code plus lisible.

switch ((isset($_GET['s']) ? $_GET['s'] : '')) {
    case 'jwshxnsyllabus':
        echo "<body onload=\"loadSyllabi('syllabus', '../syllabi/jwshxnporsyllabus.xml',         '../bibliographies/jwshxnbibliography_')\">";
        break;
    case 'aquinas':
        echo "<body onload=\"loadSyllabi('syllabus', '../syllabi/AquinasSyllabus.xml')\">";
        break;
    case 'POP2':
        echo "<body onload=\"loadSyllabi('POP2')\">";
        break;
    default:
        echo "<body>";
        break;
}

EDIT: BTW, le premier ensemble de code que j'ai écrit imite ce que le vôtre est censé faire dans son intégralité. Le résultat attendu d'une valeur inattendue dans ?s= est-il censé ne générer aucune balise <body> ou s'agit-il d'un oubli? Notez que le commutateur résoudra ce problème en choisissant toujours par défaut <body>.

58
Rudi Visser

Prenez l’habitude de vérifier si une variable est disponible avec isset , par ex.

if (isset($_GET['s']))
{
     //do stuff that requires 's'
}
else
{
     //do stuff that doesn't need 's'
}

Vous pouvez désactiver le signalement des notifications, mais leur gestion est une bonne hygiène et peut vous permettre de détecter les problèmes que vous auriez sinon manqués.

6
Paul Dixon

J'utilise toujours une fonction/classe d'utilitaire pour lire à partir des tableaux $ _GET et $ _POST afin d'éviter de devoir toujours vérifier que l'index existe ... Une telle chose fera l'affaire.

class Input {
function get($name) {
    return isset($_GET[$name]) ? $_GET[$name] : null;
}

function post($name) {
    return isset($_POST[$name]) ? $_POST[$name] : null;
}

function get_post($name) {
    return $this->get($name) ? $this->get($name) : $this->post($name);
}
}
$input = new Input;
$page = $input->get_post('page');
5
evilunix

J'avais le même problème dans localhost avec xampp. Maintenant, j'utilise cette combinaison de paramètres:

// Report all errors except E_NOTICE
// This is the default value set in php.ini
error_reporting(E_ALL ^ E_NOTICE);

php.net: http://php.net/manual/pt_BR/function.error-reporting.php

3
rodrigoio

En réalité, aucune des réponses proposées, bien qu’une bonne pratique, ne supprimerait l’avertissement.

Par souci d'exactitude, je procéderais comme suit:

function getParameter($param, $defaultValue) {
    if (array_key_exists($param, $_GET)) {
        $value=$_GET[$param];
        return isSet($value)?$value:$defaultValue;
    }
    return $defaultValue;
}

De cette façon, je vérifie dans le tableau _GET la présence de la clé sans déclencher l'avertissement. Ce n'est pas une bonne idée de désactiver les avertissements, car il est souvent intéressant de les consulter.

Pour utiliser la fonction que vous venez de faire:

$myvar = getParameter("getparamer", "defaultValue")

donc si le paramètre existe, vous obtenez la valeur, et s'il ne le fait pas, vous obtenez la valeur par défaut.

1
rupps

Commencez par vérifier si le $_GET['s'] est défini ou non. Changez vos conditions comme ça

<?php
if (isset($_GET['s']) && $_GET['s'] == 'jwshxnsyllabus')
echo "<body onload=\"loadSyllabi('syllabus', '../syllabi/jwshxnporsyllabus.xml',         '../bibliographies/jwshxnbibliography_')\">";
elseif (isset($_GET['s']) && $_GET['s'] == 'aquinas')
echo "<body onload=\"loadSyllabi('syllabus', '../syllabi/AquinasSyllabus.xml')\">"; 
elseif (isset($_GET['s']) && $_GET['s'] == 'POP2')
echo "<body onload=\"loadSyllabi('POP2')\">";
elseif (isset($_GET['s']) && $_GET['s'] == null)
echo "<body>"
?>

Et gérez également correctement vos conditions ifelse

1
Awais Qarni

Je vous recommande de vérifier vos tableaux avant d'y accéder aveuglément: 

if(isset($_GET['s'])){
    if ($_GET['s'] == 'jwshxnsyllabus')
        /* your code here*/
}

Une autre solution (rapide) consiste à désactiver le signalement des erreurs en écrivant ceci en haut du script: 

error_reporting(0);  

Dans votre cas, il est très probable que la configuration du rapport d'erreurs dans php.ini soit définie par défaut sur votre autre serveur.
En appelant le error_reporting avec le paramètre 0, vous désactivez tous les avis/avertissements et erreurs. Pour plus de détails, consultez le manuel php

Rappelez-vous qu'il s'agit d'une solution rapide et qu'il est fortement recommandé d'éviter les erreurs plutôt que de les ignorer.

0
gion_13

Vous devriez vérifier si l'index existe avant de l'utiliser (comparez-le)

if (isset($_GET['s']) AND $_GET['s'] == 'foobar') {
    echo "foo";
}

Utilisez E_ALL | E_STRICT en développement!

0
erenon

Fonction simple, fonctionne avec GET ou POST. De plus, vous pouvez attribuer une valeur par défaut.

function GetPost($var,$default='') {
    return isset($_GET[$var]) ? $_GET[$var] : (isset($_POST[$var]) ? $_POST[$var] : $default);
}
0
bolhaskutya

Une autre option serait de supprimer l'avis d'index non défini PHP avec le symbole @ devant la variable GET, comme suit:

$s = @$_GET['s'];

Cela désactivera la notification. Il est préférable de vérifier si la variable a été définie et d'agir en conséquence. 

Mais cela fonctionne aussi.

0
Floris

Evitez si, sinon et sinon!

$loadMethod = "";
if(isset($_GET['s'])){
    switch($_GET['s']){
        case 'jwshxnsyllabus':
            $loadMethod = "loadSyllabi('syllabus', '../syllabi/jwshxnporsyllabus.xml', '../bibliographies/jwshxnbibliography_')";
        break;
        case 'aquinas':
            $loadMethod = "loadSyllabi('syllabus', '../syllabi/AquinasSyllabus.xml')";
        break;
        case 'POP2':
            $loadMethod = "loadSyllabi('POP2')";
    }
}

echo '<body onload="'.$loadMethod.'">';

code propre et lisible est un code maintenable

0
SparK