php $ GET et undefined index

un nouveau problème est apparu pour moi alors que j'essayais d'exécuter mon script sur un serveur PHP différent.

sur mon ancien serveur le code suivant semble fonctionner correctement-même si aucun 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 mon serveur local sur ma machine locale (XAMPP - Apache) je reçois l'erreur suivante quand aucune valeur pour s est défini.

Notice: Undefined index: s in C:xampphtdocsteachingindex.php on line 43
Notice: Undefined index: s in C:xampphtdocsteachingindex.php on line 45
Notice: Undefined index: s in C:xampphtdocsteachingindex.php on line 47
Notice: Undefined index: s in C:xampphtdocsteachingindex.php on line 49

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

Pouvez-vous m'aider?

35
demandé sur Jeff 2011-10-24 18:04:49

11 réponses

la notification des erreurs n'aura pas inclus de notices 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 $_GET array avant d'essayer 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 bénéfique (si vous envisagez sur l'ajout de plus de cas) pour utiliser un switch déclaration 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;
}

modifier: BTW, le première série de code que j'ai écrit imite ce que le vôtre est censé faire dans son intégralité. Est le résultat attendu d'une valeur inattendue dans ?s= destinée à la sortie n <body> balise ou était-ce un oubli? Notez que le commutateur corrigera cette erreur en sautant toujours vers <body>.

55
répondu Rudi Visser 2011-10-24 14:16:51

prenez l'habitude de vérifier si une variable est disponible avec isset, e.g.

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

Vous pouvez désactiver le rapport de notification, mais les traiter est une bonne hygiène, et peut vous permettre de repérer les problèmes que vous pourriez autrement manquer.

6
répondu Paul Dixon 2011-10-24 14:08:30

j'utilise toujours une fonction utilitaire/classe pour lire à partir des tableaux $_GET et $_POST pour éviter d'avoir à toujours vérifier l'index existe... Quelque chose comme ceci 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
répondu evilunix 2014-08-07 12:33:41

j'avais le même problème à 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

2
répondu rodrigoio 2013-09-14 00:21:01

Vérifiez D'abord le $_GET['s'] est définie ou pas. Changez vos conditions comme ceci

<?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 aussi manipuler correctement votre ifelse conditions

1
répondu Awais Qarni 2011-10-24 14:08:24

en fait, aucune des réponses proposées, bien qu'il s'agisse d'une bonne pratique, ne supprimerait l'avertissement.

Par souci d'exactitude, je ferais le suivant:

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 le _GET tableau pour que la clé existe sans déclencher l'avertissement. Ce n'est pas une bonne idée de désactiver les Avertissements parce que souvent ils sont au moins intéressants à regarder.

utilisation De la fonction que vous venez de faire:

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

si le paramètre il existe, vous obtenez la valeur, et si elle ne marche pas, vous obtenez la valeur par défaut.

1
répondu rupps 2015-05-30 20:31:09

Vous devez vérifier si l'index existe avant de l'utiliser (comparer)

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

Utilisez E_ALL / E_STRICT tout en développant!

0
répondu erenon 2011-10-24 14:06:49

eviter si, else et elseifs!

$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.'">';

le code propre et lisible est le code maintenable

0
répondu SparK 2011-10-24 14:20:02

je vous recommande de vérifier vos tableaux avant de vous aveuglément accès :

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

une autre solution (rapide) consiste à désactiver le rapport d'erreur en écrivant ceci en haut du script :

error_reporting(0);  

dans votre cas, il est très probable que votre autre serveur avait la configuration de rapport d'erreur en php.ini 0 par défaut.

En appelant le error_reporting avec 0 comme paramètre, vous éteignez tous les avis / avertissements et les erreurs. Pour plus de détails, consultez le manuel php.

n'oubliez pas que c'est une solution rapide et il est fortement recommandé d'éviter les erreurs plutôt que de les ignorer.

0
répondu gion_13 2014-03-12 15:31:47

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
répondu bolhaskutya 2018-01-13 18:39:49

la vraie réponse à cela est de mettre un symbole @ At avant la variable qui supprimera l'erreur

@$_GET["field"]
@$_POST["field"]

cela fonctionnera un peu plus lentement, mais gardera le code propre.

quand quelque chose économise du temps pour le programmeur, et coûte du temps pour les utilisateurs du site web (ou nécessite plus de matériel), cela dépend de combien de personnes l'utiliseront.

-2
répondu Jew 2018-01-31 19:18:28