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?
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>
.
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.
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');
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
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
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.
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!
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
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.
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);
}
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.