"Notice: Undefined variable"," Notice: Undefined index", et" Notice: Undefined offset " en utilisant PHP
j'exécute un script PHP, et je continue à recevoir des erreurs comme:
Remarque: variable non définie: my_variable_name in C:wampwwwmypathindex.php sur la ligne 10
avis: index non défini: my_index C:wampwwwmypathindex.php sur la ligne 11
ligne 10 et 11 ressemble à ceci:
echo "My variable value is: " . $my_variable_name;
echo "My index value is: " . $my_array["my_index"];
que signifient ces messages d'erreur?
pourquoi apparaissent-ils soudainement? J'ai utilisé ce script depuis des années et je n'ai jamais eu aucun problème.
comment les réparer?
il s'agit d'une question de référence générale à laquelle les gens peuvent faire référence en tant que duplicata, au lieu d'avoir à expliquer la question encore et encore. Je pense que c'est nécessaire parce que la plupart des réponses du monde réel sur cette question sont très spécifiques.
Related Meta discussion:
- Ce qui peut être fait à propos de questions répétitives?
- Faire "de référence" questions de sens?
27 réponses
avis: variable non définie
De la grande sagesse de la Manuel PHP :
S'appuyer sur la valeur par défaut d'une variable non initialisée est problématique dans le cas d'inclure un fichier dans un autre qui utilise le même nom de variable. Il s'agit également d'un grand risque de sécurité avec register_globals activé. E_NOTICE l'erreur de niveau est émise dans le cas de travailler avec des variables non initialisées, mais pas dans le cas d'ajouter des éléments au tableau non initialisé. isset() construction du langage peut être utilisé pour détecter si une variable a déjà été initialisé. En outre et plus idéal est la solution de empty () car il ne génère pas de message d'avertissement ou d'erreur si la variable n'est pas initialisée.
de documentation PHP :
aucun avertissement n'est généré si la variable n'existe pas. Cela signifie que empty () est essentiellement l'équivalent concis de !isset ($var) / / $ var = = faux .
cela signifie que vous pouvez utiliser seulement empty()
pour déterminer si la variable est définie, et en outre il vérifie la variable par rapport à ce qui suit, 0,"",null
.
exemple:
$o = [];
@$var = ["",0,null,1,2,3,$foo,$o['myIndex']];
array_walk($var, function($v) {
echo (!isset($v) || $v == false) ? 'true ' : 'false';
echo ' ' . (empty($v) ? 'true' : 'false');
echo "\n";
});
tester l'extrait ci-dessus dans le 3v4l.org éditeur PHP en ligne
bien que PHP ne nécessite pas de déclaration de variable, il la recommande afin d'éviter certaines vulnérabilités de sécurité ou des bogues où l'on oublierait de donner une valeur à une variable qui sera utilisée plus tard dans le script. Ce que fait PHP dans le cas de les variables non déclarées émettent une très faible erreur de niveau, E_NOTICE
, qui n'est même pas signalée par défaut, mais le manuel conseille d'autoriser pendant le développement.
façons de traiter la question:
-
recommandé: Déclarez vos variables, par exemple lorsque vous essayez d'ajouter une chaîne à une variable non définie. Ou utiliser
isset()
/!empty()
vérifier s'ils sont déclarés avant de les référencer, comme dans://Initializing variable $value = ""; //Initialization value; Examples //"" When you want to append stuff later //0 When you want to add numbers later //isset() $value = isset($_POST['value']) ? $_POST['value'] : ''; //empty() $value = !empty($_POST['value']) ? $_POST['value'] : '';
cela est devenu beaucoup plus propre à partir de PHP 7.0, maintenant vous pouvez utiliser le null coalesce opérateur :
// Null coalesce operator - No need to explicitly initialize the variable. $value = $_POST['value'] ?? '';
-
Définir un gestionnaire d'erreur personnalisé pour E_NOTICE et de rediriger les messages depuis la sortie standard (peut-être à un fichier journal):
set_error_handler('myHandlerForMinorErrors', E_NOTICE | E_STRICT)
-
Désactiver E_NOTICE. Un moyen rapide d'exclure juste
E_NOTICE
est:error_reporting( error_reporting() & ~E_NOTICE )
-
supprimez l'erreur avec le @ operator .
Note: il est fortement recommandé de ne mettre en œuvre que le point 1.
avis: index non défini / offset Non défini
cette notice apparaît lorsque vous (ou PHP) essayez d'accéder à un index non défini d'un tableau.
façons de traiter la question:
-
vérifiez si l'index existe avant d'y accéder. Pour cela, vous pouvez utiliser
isset()
ouarray_key_exists()
://isset() $value = isset($array['my_index']) ? $array['my_index'] : ''; //array_key_exists() $value = array_key_exists('my_index', $array) ? $array['my_index'] : '';
-
La construction du langage
list()
peut générer ce lorsqu'il tente d'accéder à un index de tableau qui n'existe pas:list($a, $b) = array(0 => 'a'); //or list($one, $two) = explode(',', 'test string');
deux variables sont utilisées pour accéder à deux éléments de tableau, mais il n'y a qu'un seul élément de tableau, l'index 0
, donc cela générera:
avis: Non défini offset: 1
$_POST
/ $_GET
/ $_SESSION
variable
les notes ci-dessus apparaissent souvent lorsqu'on travaille avec $_POST
, $_GET
ou $_SESSION
. Pour $_POST
et $_GET
vous devez juste vérifier si l'index existe ou non avant de les utiliser. Pour $_SESSION
vous devez vous assurer que vous avez la session commencée avec session_start()
et que l'index existe aussi.
notez aussi que les 3 variables sont superglobales et sont en majuscules.
Related:
Essayez ces
Q1: cet avis signifie que $ varname n'est pas définis au champ d'application actuel de la script.
Q2: L'utilisation des conditions isset (), empty () avant d'utiliser une variable suspecte fonctionne bien.
// recommended solution for recent PHP versions
$user_name = $_SESSION['user_name'] ?? '';
// pre-7 PHP versions
$user_name = '';
if (!empty($_SESSION['user_name'])) {
$user_name = $_SESSION['user_name'];
}
Ou comme un "rapide et sale" solution:
// not the best solution, but works
// in your php setting use, it helps hiding site wide notices
error_reporting(E_ALL ^ E_NOTICE);
note sur les sessions:
-
lors de l'utilisation de sessions,
session_start();
doit être placé dans tous les fichiers utilisant des sessions.
affichage d'Erreur @
opérateur
pour les avis non désirés et redondants, on pourrait utiliser le @
opérateur à " masquer " messages variables/index non définis.
$var = @($_GET["optional_param"]);
- cela est généralement déconseillé. Les nouveaux ont tendance à en abuser.
- il est très inapproprié pour le code profondément à l'intérieur de la logique d'application (en ignorant les variables non déclarées là où vous ne devriez pas), par exemple pour les paramètres de fonction, ou dans les boucles.
- il y en a un à l'envers sur la super-supression
isset?:
ou??
. Les avis peuvent encore se connecté. Et on peut ressusciter@
- avis cachés avec:set_error_handler("var_dump");
- de plus, vous ne devriez pas habituellement utiliser/recommander
if (isset($_POST["shubmit"]))
dans votre code initial. - les nouveaux venus ne verront pas typographique. Cela vous prive juste des avis de PHPs pour ces cas précis. Ajouter
@
ouisset
seulement après vérifier la fonctionnalité. -
fixer la cause en premier. Pas d'avis.
- de plus, vous ne devriez pas habituellement utiliser/recommander
-
@
est principalement acceptable pour les paramètres d'entrée$_GET
/$_POST
, en particulier si ils sont optionnels .
et puisque cela couvre la majorité de ces questions, nous allons développer sur les causes les plus communes:
$_GET
/ $_POST
/ $_REQUEST
entrée non définie
-
la première chose que vous faites lorsque vous rencontrez un index/offset Non défini, est de vérifier les fautes de frappe:
$count = $_GET["whatnow?"];
- est-ce un nom de la clé attendue et présent sur la demande de page chacune ?
- les noms de Variables et tableau indicies sont sensibles à la casse en PHP.
-
deuxièmement, si l'avis n'a pas de cause évidente, utiliser
var_dump
ouprint_r
pour vérifier tous tableaux d'entrées pour leur courant contenu:var_dump($_GET); var_dump($_POST); //print_r($_REQUEST);
les deux révéleront si votre script a été invoqué avec le droit ou tout autre paramètre.
-
Alternativey ou utiliser en plus de votre navigateur devtools ( F12 ) et inspecter l'onglet réseau pour les demandes et les paramètres:
POST les paramètres et les entrées seront présentés séparément.
-
pour
$_GET
paramètres, vous pouvez également jeter un oeil à laQUERY_STRING
dansprint_r($_SERVER);
PHP a quelques règles pour coalesce noms de paramètre non standard dans les superglobales. Apache pourrait réécrire aussi. Vous pouvez également regarder fourni raw
$_COOKIES
et d'autres en-têtes de requêtes HTTP de cette façon. -
regardez plus clairement la barre d'adresse de votre navigateur pour GET parameters :
http://example.org/script.php?id=5&sort=desc
les paires
name=value
après le point d'interrogation?
sont les paramètres de votre requête (GET). Cette URL ne peut donc donner que$_GET["id"]
et$_GET["sort"]
. -
enfin vérifier vos déclarations
<form>
et<input>
, si vous attendez un paramètre mais n'en recevez aucun.- S'assurer que chaque entrée requise comporte un
<input name=FOO>
- l'attribut
id=
outitle=
ne suffit pas. - a
method=POST
la forme doit peupler$_POST
. - alors qu'un
method=GET
(ou en l'omettant) donnerait$_GET
variable. - il est également possible pour un formulaire de fournir
action=script.php?get=param
via $_GET et les autres champsmethod=POST
dans $_POST à côté. - avec les configurations PHP modernes (≥ 5.6) il est devenu faisable (pas à la mode) à utiliser
$_REQUEST['vars']
encore, qui mashes obtenir et POST params.
- S'assurer que chaque entrée requise comporte un
-
si vous utilisez mod_rewrite, ensuite, vous devriez vérifier à la fois le
access.log
ainsi que permettre le" 15191860920RewriteLog
pour comprendre les paramètres absents.
$_FILES
- les mêmes contrôles de santé mentale s'appliquent aux fichiers téléchargés et
$_FILES["formname"]
. - vérifier en outre pour
enctype=multipart/form-data
- ainsi que
method=POST
dans votre déclaration<form>
. - See also: PHP Undefined index error $_FILES?
$_COOKIE
- le tableau
$_COOKIE
n'est jamais rempli juste aprèssetcookie()
, mais seulement sur n'importe quelle requête HTTP de suivi. - en plus de leur période de validité, ils peuvent être une contrainte pour les sous-domaines ou les chemins individuels, et l'utilisateur et le navigateur peuvent simplement les rejeter ou les supprimer.
cela signifie que vous testez, évaluez ou imprimez une variable à laquelle vous n'avez encore rien assigné. Cela signifie que vous avez soit une faute de frappe, soit vous devez vérifier que la variable a été initialisée à quelque chose en premier. Vérifiez vos chemins logiques, il peut être défini dans un chemin mais pas dans un autre.
généralement en raison de "mauvaise programmation", et une possibilité d'erreurs maintenant ou plus tard.
- si c'est une erreur, faites une assignation correcte à la variable first: $ varname=0;
- si elle n'est vraiment définie que de temps en temps, tester pour elle:
if (isset($varname))
, avant de l'utiliser - si c'est parce que vous l'avez mal orthographié, il suffit de corriger que
- peut-être même tourner les avertissements en vous PHP-settings
Je ne voulais pas désactiver la notification Parce que c'est utile, mais je voulais éviter trop de Dactylographie.
ma solution était cette fonction:
function ifexists($varname)
{
return(isset($$varname)?$varname:null);
}
donc si je veux faire référence à $name et echo s'il existe, j'écris simplement:
<?=ifexists('name')?>
pour les éléments de tableau:
function ifexistsidx($var,$index)
{
return(isset($var[$index])?$var[$index]:null);
}
dans la page si je veux me référer à $_REQUEST ['name']:
<?=ifexistsidx($_REQUEST,'name')?>
la meilleure façon d'obtenir l'entrée chaîne est:
$value = filter_input(INPUT_POST, 'value');
cette doublure est presque équivalente à:
if (!isset($_POST['value'])) {
$value = null;
} elseif (is_array($_POST['value'])) {
$value = false;
} else {
$value = $_POST['value'];
}
Si vous voulez absolument chaîne de la valeur, tout comme:
$value = (string)filter_input(INPUT_POST, 'value');
c'est parce que la variable "$user_location " n'est pas définie. Si vous utilisez une boucle if à l'intérieur de laquelle vous déclarez la variable '$user_location', alors vous devez aussi avoir une boucle else et définir la même chose. Par exemple:
$a=10;
if($a==5) { $user_location='Paris';} else { }
echo $user_location;
le code ci-dessus créera une erreur car la boucle if n'est pas satisfaite et dans la boucle else '$user_location' n'a pas été définie. PHP a quand même été invité à faire écho à la variable. Donc, pour modifier le code, vous devez effectuer les opérations suivantes:
$a=10;
if($a==5) { $user_location='Paris';} else { $user_location='SOMETHING OR BLANK'; }
echo $user_location;
En réponse à ""Pourquoi apparaissent-ils tout d'un coup? J'ai utilisé ce script depuis des années et je n'ai jamais eu aucun problème."
il est très courant pour la plupart des sites de fonctionner sous le rapport d'erreur" par défaut "de"Afficher toutes les erreurs, mais pas 'Avis' et 'déprécié'". Cela sera défini dans php.ini et s'appliquent à tous les sites sur le serveur. Cela signifie que les "notices" utilisées dans les exemples seront supprimées (cachées) tandis que les autres erreurs, considéré plus critique, sera montré/enregistré.
l'autre paramètre critique est que les erreurs peuvent être masquées (i.e. display_errors
défini à" off "ou"syslog").
ce qui s'est produit dans ce cas, c'est que soit le error_reporting
a été modifié pour afficher également les notices (selon les exemples) et/ou que les paramètres ont été changés en display_errors
à l'écran (au lieu de les supprimer/les enregistrer).
pourquoi ils changé?
la réponse évidente/la plus simple est que quelqu'un a ajusté l'un ou l'autre de ces paramètres en php.ini, ou une version améliorée de PHP utilise maintenant un php différent.ini avant. C'est le premier endroit à regarder.
cependant, il est également possible de modifier ces paramètres dans
- .htconf (de la configuration du serveur, y compris les serveurs virtuels et les sous-configurations)*
- .htaccess
- dans le code php lui-même
et n'importe lequel de ceux-ci aurait pu être changé.
il y a aussi la complication supplémentaire que la configuration du serveur web peut activer/désactiver .htaccess directives, donc si vous avez des directives .htaccess qui démarre/arrête soudainement de fonctionner alors vous devez vérifier pour cela.
(.htconf/.htaccess suppose que vous êtes apache. Si vous lancez la ligne de commande cela ne s'appliquera pas; si vous utilisez IIS ou un autre serveur web, vous devrez vérifier ces configs en conséquence)
résumé
- Vérifier
error_reporting
etdisplay_errors
du php dans php.ini n'a pas changé, ou que vous n'utilisez pas un php différent.ini avant. - Vérifier
error_reporting
etdisplay_errors
directives php .htconf (ou vhosts etc) n'ont pas changé - Vérifier
error_reporting
etdisplay_errors
directives php .htaccess n'ont pas changé - si vous avez la directive.htaccess, Vérifiez s'ils sont encore autorisés dans le .fichier htconf
- Vérifiez enfin votre code; peut-être une bibliothèque sans lien; pour voir si les directives
error_reporting
etdisplay_errors
php y ont été définies.
la solution rapide est d'attribuer votre variable à null en haut de votre code
$user_location = null;
j'ai utilisé pour maudire cette erreur, mais il peut être utile de vous rappeler d'échapper à l'entrée de l'utilisateur.
par exemple, si vous pensez que c'est intelligent, code raccourci:
// Echo whatever the hell this is
<?=$_POST['something']?>
...Détrompez-vous! Une meilleure solution est:
// If this is set, echo a filtered version
<?=isset($_POST['something']) ? html($_POST['something']) : ''?>
(j'utilise une fonction personnalisée html()
pour échapper aux caractères, votre kilométrage peut varier)
j'utilise à tout moment propre fonction utile exst () qui déclare automatiquement les variables.
votre code sera -
$greeting = "Hello, ".exst($user_name, 'Visitor')." from ".exst($user_location);
/**
* Function exst() - Checks if the variable has been set
* (copy/paste it in any place of your code)
*
* If the variable is set and not empty returns the variable (no transformation)
* If the variable is not set or empty, returns the $default value
*
* @param mixed $var
* @param mixed $default
*
* @return mixed
*/
function exst( & $var, $default = "")
{
$t = "";
if ( !isset($var) || !$var ) {
if (isset($default) && $default != "") $t = $default;
}
else {
$t = $var;
}
if (is_string($t)) $t = trim($t);
return $t;
}
Dans un esprit très Langage Simple .
l'erreur est que vous utilisez une variable $user_location
qui n'est pas défini par vous plus tôt et il n'a aucune valeur donc je vous recommande de s'il vous plaît déclarer cette variable avant en utilisant it, par exemple:
$user_location = '';
ou
$user_location = 'Los Angles';
C'est une erreur très courante à laquelle vous pouvez faire face.Alors ne vous inquiétez pas il suffit de déclarer la variable et profitez du codage .
en PHP 7.0 il est maintenant possible D'utiliser L'opérateur Null coalescing:
echo "My index value is: " . ($my_array["my_index"] ?? '');
égale à:
echo "My index value is: " . (isset($my_array["my_index"]) ? $my_array["my_index"] : '');
pourquoi ne pas faire simple?
<?php
error_reporting(E_ALL); // making sure all notices are on
function idxVal(&$var, $default = null) {
return empty($var) ? $var = $default : $var;
}
echo idxVal($arr['test']); // returns null without any notice
echo idxVal($arr['hey ho'], 'yo'); // returns yo and assigns it to array index, nice
?>
POURQUOI CELA SE PRODUIT-IL?
au fil du temps, PHP est devenu un langage plus axé sur la sécurité. Les paramètres qui étaient désactivés par défaut sont maintenant activés par défaut. Un exemple parfait de cela est E_STRICT
, qui est devenu allumé par défaut à partir de PHP 5.4.0 .
de plus, selon la documentation PHP, par defualt, E_NOTICE
est désactivé en php.ini. PHP docs recommande tourner . Cependant, lorsque je télécharge PHP à partir du dépôt Ubuntu–et de la pile Windows de BitNami–je vois autre chose.
; Common Values:
; E_ALL (Show all errors, warnings and notices including coding standards.)
; E_ALL & ~E_NOTICE (Show all errors, except for notices)
; E_ALL & ~E_NOTICE & ~E_STRICT (Show all errors, except for notices and coding standards warnings.)
; E_COMPILE_ERROR|E_RECOVERABLE_ERROR|E_ERROR|E_CORE_ERROR (Show only errors)
; Default Value: E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED
; Development Value: E_ALL
; Production Value: E_ALL & ~E_DEPRECATED & ~E_STRICT
; http://php.net/error-reporting
error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT
notez que error_reporting
est en fait défini à la valeur de production par défaut, et non à la valeur" par défaut " par défaut. Ceci est quelque peu confus et n'est pas documenté en dehors de php.ini, donc j'ai pas validé ceci sur d'autres distributions.
pour répondre à votre question, cependant, cette erreur apparaît maintenant alors qu'elle n'est pas apparue avant parce que:
-
vous avez installé PHP et les nouveaux paramètres par défaut sont quelque peu mal documentés, mais n'excluent pas
E_NOTICE
. -
E_NOTICE
les avertissements comme les variables non définies et les index non définis aident en fait à rendre votre code plus propre et plus sûr. Je peux vous dire que, ans il y a longtemps, le fait de garderE_NOTICE
m'a forcé à déclarer mes variables. Il a rendu beaucoup plus facile d'apprendre C, où ne pas déclarer les variables est beaucoup plus grande d'une nuisance.
QUE PUIS-JE FAIRE?
-
désactiver
E_NOTICE
par la copie de la "valeur par Défaut"E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED
et son remplacement par ce qui est actuellement sans commentaire après le signe égal danserror_reporting =
. Redémarrez Apache, ou PHP Si vous utilisez CGI ou FPM. Assurez-vous que vous éditez le "bon" php.ini. Le bon sera Apache si vous exécutez PHP avec Apache, fpm ou php-fpm si vous exécutez PHP-FPM, cgi si vous exécutez PHP-CGI, etc. Ce n'est pas la méthode recommandée, mais si vous avez le code d'héritage qui va être excessivement difficile à éditer, alors il pourrait être votre meilleur pari. -
désactiver
E_NOTICE
sur le fichier ou le dossier. Cela pourrait être préférable si vous avez du code d'héritage mais je veux faire les choses de la "bonne" façon autrement. Pour ce faire, vous devez consulter Apache2, nginx, ou quel que soit le serveur de votre choix. Dans Apache, vous utiliserezphp_value
à l'intérieur de<Directory>
. -
réécrivez votre code pour être plus propre. Si vous avez besoin de faire cela tout en se déplaçant dans un environnement de production, ou ne voulez pas que quelqu'un voit vos erreurs, assurez-vous que vous désactivez tout affichage d'erreurs, et seulement logging votre erreurs (voir
display_errors
etlog_errors
en php.ini et les paramètres de votre serveur).
pour développer l'option 3: c'est l'idéal. Si tu peux suivre cette voie, tu devrais. Si vous n'empruntez pas cette voie au départ, envisagez éventuellement de l'emprunter en testant votre code dans un environnement de développement. Pendant que vous y êtes, débarrassez-vous de ~E_STRICT
et ~E_DEPRECATED
pour voir ce qui pourrait mal tourner à l'avenir. Vous allez voir beaucoup d'inconnus erreurs, mais cela va vous empêcher d'avoir des problèmes désagréables lorsque vous avez besoin de mettre à jour PHP à l'avenir.
QUE SIGNIFIENT LES ERREURS?
Undefined variable: my_variable_name
- cela se produit lorsqu'une variable n'a pas été définie avant l'utilisation. Quand le script PHP est exécuté, il prend juste en interne une valeur nulle. Cependant, dans quel scénario auriez-vous besoin de vérifier une variable avant qu'elle ne soit définie? En fin de compte, il s'agit d'un argument en faveur du "code bâclé". En tant que développeur, je peux vous dire que j'aime quand je vois un projet open source où les variables sont définies aussi haut dans leurs portées qu'elles peuvent être définies. Il est plus facile de dire quelles variables vont apparaître dans le futur, et il est plus facile de lire/apprendre le code.
function foo()
{
$my_variable_name = '';
//....
if ($my_variable_name) {
// perform some logic
}
}
Undefined index: my_index
- Cela se produit lorsque vous essayez d'accéder à une valeur dans un tableau et il n'existe pas. Pour prévenir cette erreur, effectuer une vérification conditionnelle.
// verbose way - generally better
if (isset($my_array['my_index'])) {
echo "My index value is: " . $my_array['my_index'];
}
// non-verbose ternary example - I use this sometimes for small rules.
$my_index_val = isset($my_array['my_index'])?$my_array['my_index']:'(undefined)';
echo "My index value is: " . $my_index_val;
une Autre option est de déclarer un tableau vide en haut de votre fonction. Ce n'est pas toujours possible.
$my_array = array(
'my_index' => ''
);
//...
$my_array['my_index'] = 'new string';
(pointe supplémentaire)
- lorsque j'ai rencontré ces problèmes et d'autres, J'ai utilisé NetBeans IDE (gratuit) et il m'a donné une foule d'avertissements et d'avis. Certains d'entre eux offrent des conseils très utile. Ce n'est pas une exigence, et je n'utilise plus L'IDEs sauf pour les grands projets. Je suis de plus en plus d'un
vim
personne ces jours-ci :).
indexe Non défini signifie Dans un tableau que vous avez demandé pour indisponible array index par exemple
<?php
$newArray[] = {1,2,3,4,5};
print_r($newArray[5]);
?>
variable non définie signifie que vous avez utilisé une variable totalement inexistante ou qui n'est pas définie ou initialisée par ce nom par exemple
<?php print_r($myvar); ?>
offset Non défini signifie dans le tableau que vous avez demandé la clé non existante. Et la solution pour cela est de vérifier avant l'utilisation
php> echo array_key_exists(1, $myarray);
concernant cette partie de la question:
pourquoi apparaissent-ils soudainement? J'ai utilisé ce script depuis des années et je n'ai jamais eu aucun problème.
Pas de réponses définitives, mais voici quelques explications possibles de pourquoi paramètres "subitement" le changement:
-
vous avez mis PHP à jour vers une version plus récente qui peut avoir d'autres défauts pour error_reporting, display_errors ou autres paramètres pertinents.
-
vous avez supprimé ou introduit un code (peut-être dans une dépendance) qui définit les paramètres pertinents à l'exécution en utilisant
ini_set()
ouerror_reporting()
(rechercher ces codes dans le code) -
vous avez modifié la configuration du serveur web (en supposant apache ici):
.htaccess
les fichiers et les configurations vhost peuvent aussi manipuler les paramètres php. -
habituellement, les avis ne sont pas affichés / signalés (voir manuel PHP ) donc il est possible que lors de la configuration du serveur, le php.le fichier ini ne pouvait pas être chargé pour une raison quelconque (permissions de fichiers??) et vous étiez sur les paramètres par défaut. Plus tard, le 'bug' a été résolu (par accident) et maintenant il peut charger le php correct.fichier ini avec le paramètre error_reporting pour afficher les notices.
si vous travaillez avec des classes, vous devez vous assurer de faire référence aux variables des membres en utilisant $this
:
class Person
{
protected $firstName;
protected $lastName;
public function setFullName($first, $last)
{
// Correct
$this->firstName = $first;
// Incorrect
$lastName = $last;
// Incorrect
$this->$lastName = $last;
}
}
une autre raison pour laquelle un avis d'index non défini sera lancé, serait qu'une colonne a été omise d'une requête de base de données.
c'est-à-dire:
$query = "SELECT col1 FROM table WHERE col_x = ?";
essaie ensuite d'accéder à plus de colonnes/rangées à l'intérieur d'une boucle.
c'est-à-dire:
print_r($row['col1']);
print_r($row['col2']); // undefined index thrown
ou dans une boucle while
:
while( $row = fetching_function($query) ) {
echo $row['col1'];
echo "<br>";
echo $row['col2']; // undefined index thrown
echo "<br>";
echo $row['col3']; // undefined index thrown
}
autre chose qui doit être noté est que sur A * NIX OS et Mac OS X, les choses sont sensible à la casse.
consultez les questions et réponses suivantes sur Stack:
à l'Aide d'un ternaire est simple, lisible, et propre:
Pre PHP 7
Assignez une variable à la valeur d'une autre variable si elle est définie, sinon assignez null
(ou n'importe quoi par défaut valeur dont vous avez besoin):
$newVariable = isset($thePotentialData) ? $thePotentialData : null;
PHP 7+
La même à l'exception à l'aide de Null Coalescence Opérateur . Il n'est plus nécessaire d'appeler isset()
car cela est intégré, et il n'est plus nécessaire de fournir la variable à retourner car il est supposé retourner la valeur de la variable contrôlée:
$newVariable = $thePotentialData ?? null;
les deux arrêteront les avis de la question OP, et les deux sont l'équivalent exact de:
if (isset($thePotentialData)) {
$newVariable = $thePotentialData;
} else {
$newVariable = null;
}
Si vous n'avez pas besoin de définir une nouvelle variable, vous pouvez utiliser directement la valeur retournée par le ternaire, comme avec echo
, arguments de fonction, etc:
Écho:
echo 'Your name is: ' . isset($name) ? $name : 'You did not provide one';
fonction:
$foreName = getForeName(isset($userId) ? $userId : null);
function getForeName($userId)
{
if ($userId === null) {
// Etc
}
}
ce qui précède fonctionnera exactement de la même manière avec les tableaux, y compris les sessions etc, en remplaçant la variable vérifiée par exemple:
$_SESSION['checkMe']
ou de tous les niveaux de profondeur dont vous avez besoin, par exemple:
$clients['personal']['address']['postcode']
la Répression:
il est possible de supprimer les Notices PHP avec @
ou de réduire votre niveau de déclaration des erreurs, mais il ne règle pas le problème , il arrête tout simplement être déclaré dans le journal des erreurs. Cela signifie que votre code a quand même essayé d'utiliser une variable qui n'a pas été définie, ce qui peut signifier que quelque chose ne fonctionne pas comme prévu - selon l'importance de la valeur manquante.
vous devriez vraiment vérifier pour ce problème et le traiter correctement, soit servir un message différent, ou même simplement retourner une valeur nulle pour tout le reste pour identifier l'état précis.
si vous vous souciez juste de L'avis Non étant dans le journal des erreurs, alors en tant qu'option vous pouvez simplement ignorer le journal des erreurs.
probablement vous utilisiez L'ancienne version de PHP jusqu'à maintenant mis à niveau C'est la raison pour laquelle il fonctionnait sans aucune erreur jusqu'à maintenant des années. jusqu'à PHP4, il n'y avait pas d'erreur si vous utilisez la variable sans la définir mais à partir de PHP5, elle produit des erreurs pour les codes mentionnés dans la question.
Lorsqu'il s'agit de fichiers, un type d'enctype approprié et une méthode de POST sont nécessaires, ce qui déclenchera un avis d'index non défini si l'un ou l'autre ne sont pas inclus dans le formulaire.
le manuel énonce la syntaxe de base suivante:
HTML
<!-- The data encoding type, enctype, MUST be specified as below -->
<form enctype="multipart/form-data" action="__URL__" method="POST">
<!-- MAX_FILE_SIZE must precede the file input field -->
<input type="hidden" name="MAX_FILE_SIZE" value="30000" />
<!-- Name of input element determines name in $_FILES array -->
Send this file: <input name="userfile" type="file" />
<input type="submit" value="Send File" />
</form>
PHP
<?php
// In PHP versions earlier than 4.1.0, $HTTP_POST_FILES should be used instead
// of $_FILES.
$uploaddir = '/var/www/uploads/';
$uploadfile = $uploaddir . basename($_FILES['userfile']['name']);
echo '<pre>';
if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile)) {
echo "File is valid, and was successfully uploaded.\n";
} else {
echo "Possible file upload attack!\n";
}
echo 'Here is some more debugging info:';
print_r($_FILES);
print "</pre>";
?>
référence:
une cause courante d'une variable qui n'existe pas après qu'un formulaire HTML a été soumis est que l'élément de formulaire n'est pas contenu dans une étiquette <form>
:
exemple: élément Non contenu dans le <form>
<form action="example.php" method="post">
<p>
<input type="text" name="name" />
<input type="submit" value="Submit" />
</p>
</form>
<select name="choice">
<option value="choice1">choice 1</option>
<option value="choice2">choice 2</option>
<option value="choice3">choice 3</option>
<option value="choice4">choice 4</option>
</select>
exemple: élément maintenant contenu dans le <form>
<form action="example.php" method="post">
<select name="choice">
<option value="choice1">choice 1</option>
<option value="choice2">choice 2</option>
<option value="choice3">choice 3</option>
<option value="choice4">choice 4</option>
</select>
<p>
<input type="text" name="name" />
<input type="submit" value="Submit" />
</p>
</form>
j'ai posé une question à ce sujet et j'ai été référé à ce post avec le message:
cette question a déjà une réponse ici:
"Notice: Undefined variable"," Notice: Undefined index", et " Notice: Offset Non défini "utilisant PHP
je partage ici ma question et ma solution:
C'est l'erreur:
ligne 154 est le problème. C'est ce que j'ai dans la ligne 154:
153 foreach($cities as $key => $city){
154 if(($city != 'London') && ($city != 'Madrid') && ($citiesCounterArray[$key] >= 1)){
je pense que le problème est que j'écris si conditions pour la variable $city
, qui n'est pas la clé mais la valeur dans $key => $city
. Tout d'abord, pourriez-vous confirmer si c'est la cause de l'avertissement? Deuxièmement, si tel est le problème, pourquoi est-ce que je ne peux pas écrire une condition basée sur la valeur? A-t-elle d'être avec la clé que je dois écrire la condition?
UPDATE 1: le problème est que lors de l'exécution de $citiesCounterArray[$key]
, parfois le $key
correspond à une clé qui n'existe pas dans le tableau $citiesCounterArray
, mais ce n'est pas toujours le cas basé sur les données de ma boucle. Ce dont j'ai besoin est de définir une condition de sorte que si $key
existe dans le tableau, puis exécutez le code, sinon, l'ignorer.
mise à jour 2: C'est ainsi que je l'ai corrigé en utilisant array_key_exists()
:
foreach($cities as $key => $city){
if(array_key_exists($key, $citiesCounterArray)){
if(($city != 'London') && ($city != 'Madrid') && ($citiesCounterArray[$key] >= 1)){
ces avis sont parce que vous n'avez pas la variable utilisée defined
et my_index
la touche n'était pas présente dans la variable $my_array
.
ces avis ont été déclenchés à chaque fois, parce que votre code
n'est pas correct, mais probablement vous n'aviez pas la déclaration des avis sur.
résolvez les bogues:
$my_variable_name = "Variable name"; // defining variable
echo "My variable value is: " . $my_variable_name;
if(isset($my_array["my_index"])){
echo "My index value is: " . $my_array["my_index"]; // check if my_index is set
}
une Autre façon d'obtenir ceci:
ini_set("error_reporting", false)
en PHP vous avez besoin de fist pour définir la variable après que vous pouvez l'utiliser.
Nous pouvons vérifier que la variable est définie ou pas de manière très efficace!.
//If you only want to check variable has value and value has true and false value.
//But variable must be defined first.
if($my_variable_name){
}
//If you want to check variable is define or undefine
//Isset() does not check that variable has true or false value
//But it check null value of variable
if(isset($my_variable_name)){
}
Explication Simple
//It will work with :- true,false,NULL
$defineVarialbe = false;
if($defineVarialbe){
echo "true";
}else{
echo "false";
}
//It will check variable is define or not and variable has null value.
if(isset($unDefineVarialbe)){
echo "true";
}else{
echo "false";
}