J'exécute un script PHP et continue de recevoir des erreurs telles que:
Remarque: Variable non définie: nom_variable_mis dans C:\wamp\www\mypath\index.php à la ligne 10
Avis: Index non défini: mon_index C:\wamp\www\mypath\index.php à la ligne 11
Les lignes 10 et 11 ressemblent à ceci:
echo "My variable value is: " . $my_variable_name;
echo "My index value is: " . $my_array["my_index"];
Quelle est la signification de ces messages d'erreur?
Pourquoi apparaissent-ils tout d'un coup? J'avais l'habitude d'utiliser ce script pendant des années et je n'ai jamais eu de problème.
Comment puis-je les réparer?
Il s'agit d'une question de référence générale à laquelle les personnes doivent créer un lien en double, au lieu d'avoir à expliquer le problème encore et encore. Je pense que cela est nécessaire car la plupart des réponses concrètes à ce problème sont très spécifiques.
Méta discussion connexe:
De la grande sagesse de la PHP Manual :
S'appuyer sur la valeur par défaut d'une variable non initialisée est problématique dans le cas de l'inclusion d'un fichier dans un autre qui utilise le même nom de variable. C'est également un important risque de sécurité avec register_globals activé. E_NOTICE Une erreur de niveau est générée lors de l'utilisation de variables non initialisées, mais pas lors de l'ajout d'éléments au tableau non initialisé. isset () La construction de langage peut être utilisée pour détecter si une variable a déjà été initialisée. De plus, la solution de empty () est plus idéale, car elle 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 == false .
Cela signifie que vous pouvez utiliser uniquement empty()
pour déterminer si la variable est définie et la comparer à la variable suivante: 0
, 0.0
, ""
, "0"
, null
, false
ou []
.
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";
});
Testez l'extrait ci-dessus dans l'éditeur v4l.org en ligne PHP
Bien que PHP ne nécessite pas de déclaration de variable, il est recommandé de le faire afin d'éviter certaines vulnérabilités de sécurité ou des bogues qui empêcheraient de donner une valeur à une variable qui sera utilisée ultérieurement dans le script. Ce que PHP fait dans le cas de variables non déclarées, c’est une erreur de très bas 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 régler le problème:
Recommandé: Déclarez vos variables, par exemple lorsque vous essayez d'ajouter une chaîne à une variable non définie. Ou utilisez isset()
/ !empty()
pour vérifier si elles sont déclarées 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, vous pouvez maintenant utiliser le opérateur null coalesce :
// Null coalesce operator - No need to explicitly initialize the variable.
$value = $_POST['value'] ?? '';
Définissez un gestionnaire d'erreurs personnalisé pour E_NOTICE et redirigez les messages loin de la sortie standard (éventuellement dans un fichier journal):
set_error_handler('myHandlerForMinorErrors', E_NOTICE | E_STRICT)
Désactivez E_NOTICE de la création de rapports. Un moyen rapide d'exclure uniquement E_NOTICE
est:
error_reporting( error_reporting() & ~E_NOTICE )
Supprimez l'erreur avec l'opérateur @ .
Remarque: Il est fortement recommandé de ne mettre en œuvre que le point 1.
Cette notification apparaît lorsque vous (ou PHP) essayez d'accéder à un index non défini d'un tableau.
Façons de régler le problème:
Vérifiez si l'index existe avant de pouvoir y accéder. Pour cela, vous pouvez utiliser isset()
ou array_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 de langage list()
peut générer cela lorsqu'elle 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. Cependant, il n’existe qu’un seul élément, index 0
, ce qui génère:
Avis: Offset non défini: 1
$_POST
/$_GET
/$_SESSION
variableLes avis ci-dessus apparaissent souvent lorsque vous utilisez $_POST
, $_GET
ou $_SESSION
. Pour $_POST
et $_GET
, il vous suffit de vérifier si l'index existe ou non avant de les utiliser. Pour $_SESSION
, vous devez vous assurer que la session a été ouverte avec session_start()
et que l'index existe également.
Notez également que les 3 variables sont superglobales et majuscules.
Apparenté, relié, connexe:
Essayez ces
Q1: cet avis signifie que $ nomvar n'est pas défini dans la portée actuelle du script.
Q2: L'utilisation de 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 une solution rapide et sale:
// 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, il est nécessaire que session_start();
soit placé dans tous les fichiers utilisant des sessions.
@
Pour les avis non désirés et redondants, on pourrait utiliser l’opérateur @
à " dédié (*) à masquer " variable/index indéfini.
$var = @($_GET["optional_param"]);
isset?:
ou ??
. Les avis peuvent toujours être enregistrés. Et on peut ressusciter @
- avis masqués avec: set_error_handler("var_dump");
if (isset($_POST["shubmit"]))
dans votre code initial.@
ou isset
après la vérification de la fonctionnalité .Fixez la cause en premier. Pas les avis.
@
est principalement acceptable pour les paramètres d'entrée $_GET
/$_POST
, en particulier s'ils sont facultatifs .Et puisque cela couvre la majorité de ces questions, développons les causes les plus courantes:
$_GET
/$_POST
/$_REQUEST
entrée non définieLa 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?"];
Deuxièmement, si la notification n’a pas de cause évidente, utilisez var_dump
ou print_r
pour vérifier all tableaux d'entrée pour leur contenu actuel:
var_dump($_GET);
var_dump($_POST);
//print_r($_REQUEST);
Les deux indiqueront si votre script a été appelé avec le droit ou aucun paramètre.
Vous pouvez également utiliser votre navigateur devtools (F12) et inspectez l'onglet réseau pour connaître les requêtes et les paramètres:
Les paramètres POST et l'entrée GET seront affichés séparément.
Pour les paramètres $_GET
, vous pouvez également jeter un œil au QUERY_STRING
dans
print_r($_SERVER);
PHP a quelques règles pour coalesce noms de paramètres non standard dans les superglobales. Apache pourrait aussi faire de la réécriture. Vous pouvez également consulter le $_COOKIES
brut et les autres en-têtes de requêtes HTTP de cette manière.
Plus évidemment, regardez 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 vos paramètres de requête (GET). Ainsi, cette URL ne pourrait éventuellement que générer $_GET["id"]
et $_GET["sort"]
.
Enfin, vérifiez vos <form>
ET <input>
déclarations, si vous attendez un paramètre mais n'en recevez aucune.
<input name=FOO>
id=
ou title=
ne suffit pas.method=POST
doit renseigner $_POST
.method=GET
(ou le laisser de côté) produirait des variables $_GET
.action=script.php?get=param
via $ _GET et les champs method=POST
restants dans $ _POST à côté.$_REQUEST['vars']
, ce qui écrase GET et POST params.Si vous utilisez mod_rewrite, vous devriez vérifier le access.log
et activer le RewriteLog
pour déterminer les paramètres absents.
$_FILES
$_FILES["formname"]
.enctype=multipart/form-data
method=POST
dans votre déclaration <form>
.$_COOKIE
$_COOKIE
n'est jamais rempli juste après setcookie()
, mais uniquement lors d'une demande HTTP ultérieure.Généralement à cause de "mauvaise programmation" et d'une possibilité d'erreur dès maintenant ou plus tard.
if (isset($varname))
, avant de l'utiliserCela 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 ou 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.
Je ne voulais pas désactiver la notification parce que c'était utile, mais je voulais éviter de trop taper.
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 faire référence à $ _REQUEST ['name']:
<?=ifexistsidx($_REQUEST,'name')?>
Le meilleur moyen d'obtenir une entrée chaîne est:
$value = filter_input(INPUT_POST, 'value');
Ce one-liner équivaut presque à:
if (!isset($_POST['value'])) {
$value = null;
} elseif (is_array($_POST['value'])) {
$value = false;
} else {
$value = $_POST['value'];
}
Si vous voulez absolument chaîne valeur, comme ceci:
$value = (string)filter_input(INPUT_POST, 'value');
En réponse à "" Pourquoi apparaissent-ils tout d'un coup? J'avais l'habitude d'utiliser ce script pendant des années et je n'ai jamais eu de problème. "
Il est très courant que la plupart des sites fonctionnent avec le rapport d'erreur "par défaut" de "Afficher toutes les erreurs, mais pas les" avis "et" déconseillé "". Cela sera défini dans le fichier php.ini et s'appliquera à tous les sites du serveur. Cela signifie que les "avis" utilisés dans les exemples seront supprimés (masqués), tandis que les autres erreurs, considérées comme plus critiques, seront affichées/enregistrées.
L’autre paramètre critique est que les erreurs peuvent être masquées (c.-à-d. display_errors
réglé sur "off" ou "syslog").
Dans ce cas, ce qui est arrivé est que soit le error_reporting
a été modifié pour afficher également les notifications (comme dans les exemples) et/ou que les paramètres ont été modifiés en display_errors
à l'écran (par opposition à leur suppression/en les enregistrant).
Pourquoi ont-ils changé?
La réponse évidente/la plus simple est que quelqu'un a ajusté l'un de ces paramètres dans php.ini, ou une version mise à niveau de PHP utilise maintenant un php.ini différent de celui utilisé auparavant. C'est le premier endroit à regarder.
Cependant, il est également possible de remplacer ces paramètres dans
et n'importe lequel d'entre eux aurait également pu être changé.
Il existe également une complication supplémentaire: la configuration du serveur Web peut activer/désactiver les directives .htaccess. Par conséquent, si vous avez des directives dans .htaccess qui démarrent/arrêtent soudainement de fonctionner, vous devez le vérifier.
(.htconf/.htaccess suppose que vous utilisez Apache. Si vous exécutez une ligne de commande, cela ne s'appliquera pas; si vous exécutez IIS ou un autre serveur Web, vous devrez vérifier ces configurations en conséquence)
Résumé
error_reporting
et display_errors
les directives php dans php.ini n’ont pas changé, ou que vous n’utilisez pas un php.ini différent d’avant.error_reporting
et display_errors
les directives php dans .htconf (ou vhosts, etc.) n'ont pas changéerror_reporting
et display_errors
les directives php dans .htaccess n'ont pas changéerror_reporting
et display_errors
php y ont été définies.C'est parce que la variable '$ user_location' n'est pas définie. Si vous utilisez une boucle if dans laquelle vous déclarez la variable '$ user_location', vous devez également 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 générera une erreur car la boucle if n'est pas satisfaite et dans la boucle else, '$ user_location' n'a pas été défini. Encore PHP a été invité à faire écho à la variable. Donc, pour modifier le code, vous devez procéder comme suit:
$a=10;
if($a==5) { $user_location='Paris';} else { $user_location='SOMETHING OR BLANK'; }
echo $user_location;
la solution rapide consiste à affecter votre variable à null en haut de votre code
$user_location = null;
J'avais l'habitude de maudire cette erreur, mais il peut être utile de vous rappeler d'échapper à la saisie de l'utilisateur.
Par exemple, si vous pensiez qu'il s'agissait d'un code intelligent et abrégé:
// Echo whatever the hell this is
<?=$_POST['something']?>
... Repensez-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 des caractères, votre kilométrage peut varier)
J'utilise tout le temps ma propre fonction utile exst () qui déclare automatiquement des 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 PHP 7.0, il est maintenant possible d'utiliser l'opérateur de coalescence Null:
echo "My index value is: " . ($my_array["my_index"] ?? '');
Égal à:
echo "My index value is: " . (isset($my_array["my_index"]) ? $my_array["my_index"] : '');
Au fil du temps, PHP est devenu un langage davantage 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 est E_STRICT
, qui est devenu activé par défaut à compter de PHP 5.4. .
De plus, conformément à la documentation PHP, _ par défaut, E_NOTICE
est désactivé dans php.ini. PHP docs recommend l'activer pour le débogage . Cependant, lorsque je télécharge PHP à partir du référentiel 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 défini par défaut sur la valeur de production et non sur la valeur "par défaut". Ceci est quelque peu déroutant et n'est pas documenté en dehors de php.ini, donc j'ai not ] == validé cela sur d'autres distributions.
Pour répondre à votre question, toutefois, cette erreur s’affiche alors qu’elle n’était pas apparue avant car:
Vous avez installé PHP et les nouveaux paramètres par défaut sont quelque peu mal documentés mais n'excluez pas E_NOTICE
.
E_NOTICE
les avertissements tels que les variables non définies et les index non définis contribuent à rendre votre code plus propre et plus sûr. Je peux vous dire que, il y a des années, garder E_NOTICE
activé, m'a obligé à déclarer mes variables. Cela rendait BEAUCOUP plus facile l’apprentissage de C, ne pas déclarer que les variables est beaucoup plus grave.
Désactivez E_NOTICE
en copiant la "valeur par défaut" E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED
et en le remplaçant par ce qui n'est pas mis en commentaire après le signe égal dans error_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. Si le code existant est extrêmement difficile à modifier, il pourrait être votre meilleur choix.
Désactivez E_NOTICE
au niveau du fichier ou du dossier. Cela pourrait être préférable si vous avez du code existant, mais que vous voulez faire les choses de la "bonne" manière autrement. Pour ce faire, vous devriez consulter Apache2, Nginx ou le serveur de votre choix. Dans Apache, vous utiliseriez php_value
à l'intérieur de <Directory>
.
Réécris ton code pour qu'il soit plus propre. Si vous avez besoin de le faire lors du passage à un environnement de production ou si vous ne voulez pas que vos erreurs apparaissent, assurez-vous de désactiver l'affichage de celles-ci, et seulement journalisation vos erreurs (voir display_errors
et log_errors
dans php.ini et les paramètres de votre serveur).
Pour développer l’option 3: c’est l’idéal. Si vous pouvez aller dans cette voie, vous devriez. Si vous n'utilisez pas initialement cette route, envisagez de la déplacer éventuellement en testant votre code dans un environnement de développement. Pendant que vous y êtes, supprimez ~E_STRICT
et ~E_DEPRECATED
pour voir ce qui pourrait mal tourner à l’avenir. Vous allez voir BEAUCOUP d'erreurs inconnues, mais cela vous empêchera d'avoir des problèmes désagréables lorsque vous aurez besoin de mettre à jour PHP à l'avenir.
Undefined variable: my_variable_name
- Cela se produit lorsqu'une variable n'a pas été définie avant son utilisation. Lorsque le script PHP est exécuté, il assume 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, ceci est un argument en faveur d'un "code bâclé". En tant que développeur, je peux vous dire que j'aime ça quand je vois un projet open source dans lequel les variables sont définies aussi haut que possible dans leur champ d'application. Il est plus facile de savoir 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 d'un tableau et que celle-ci n'existe pas. Pour éviter cette erreur, effectuez 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 consiste à 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';
vim
de nos jours :).pourquoi ne pas garder les choses simples?
<?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
?>
index non défini signifie dans un tableau que vous avez demandé pour un index de tableau non disponible, par exemple
<?php
$newArray[] = {1,2,3,4,5};
print_r($newArray[5]);
?>
variable non définie signifie que vous avez utilisé une variable complètement non existante ou qui n'est pas définie ou initialisée sous ce nom, par exemple
<?php print_r($myvar); ?>
offset non défini signifie dans le tableau que vous avez demandé une clé non existante. Et la solution à cela est de vérifier avant utilisation
php> echo array_key_exists(1, $myarray);
En ce qui concerne cette partie de la question:
Pourquoi apparaissent-ils tout d'un coup? J'avais l'habitude d'utiliser ce script pendant des années et je n'ai jamais eu de problème.
Pas de réponses définitives, mais voici quelques explications possibles sur la raison pour laquelle les paramètres peuvent "soudainement" changer:
Vous avez mis à niveau PHP vers une version plus récente, qui peut comporter d'autres paramètres par défaut pour error_reporting, display_errors ou d'autres paramètres pertinents.
Vous avez supprimé ou introduit un code (éventuellement dans une dépendance) définissant les paramètres appropriés à l'exécution à l'aide de ini_set()
ou error_reporting()
(recherchez-les dans le code).
Vous avez modifié la configuration du serveur Web (en supposant ici Apache): .htaccess
les fichiers et les configurations vhost peuvent également manipuler les paramètres php.
Les avis ne sont généralement pas affichés/rapportés (voir manuel PHP ) il est donc possible que lors de la configuration du serveur, le fichier php.ini ne puisse pas être chargé pour une raison quelconque (autorisations 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 fichier php.ini correct avec le paramètre error_reporting défini pour afficher les notifications.
Si vous travaillez avec des classes, vous devez vous assurer de référencer les variables de membre avec $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 émis est 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 = ?";
Ensuite, essayez d'accéder à plus de colonnes/lignes dans 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
}
Une autre chose à noter est que sur un OS * NIX et Mac OS X, les choses sont sensibles à la casse.
Consultez les questions et réponses suivantes sur Stack:
Utiliser un ternaire est simple, lisible et propre:
Pre PHP 7
Attribuez une variable à la valeur d'une autre variable si elle est définie, sinon attribuez null
(ou peu importe valeur par défaut la valeur dont vous avez besoin):
$newVariable = isset($thePotentialData) ? $thePotentialData : null;
PHP 7 +
Idem sauf avec Opérateur de coalescence nul . Il n'est plus nécessaire d'appeler isset()
car elle est intégrée, et il n'est pas nécessaire de fournir la variable à renvoyer car elle est supposée renvoyer la valeur de la variable en cours de contrôle:
$newVariable = $thePotentialData ?? null;
Les deux vont arrêter les avis de la question OP, et les deux sont les é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 directement utiliser la valeur renvoyée par le ternaire, comme avec echo
, les arguments de la 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 de la même manière avec les tableaux, y compris les sessions, etc., en remplaçant la variable en cours de vérification par exemple:$_SESSION['checkMe']
ou quel que soit le nombre de niveaux dont vous avez besoin, par exemple:$clients['personal']['address']['postcode']
Suppression:
Il est possible de supprimer les PHP Avis avec @
ou de réduire le niveau de signalement des erreurs, mais cela ne résout pas le problème , il cesse simplement de le signaler dans le journal des erreurs. Cela signifie que votre code a quand même essayé d'utiliser une variable non définie, ce qui peut signifier que quelque chose ne fonctionne pas comme prévu - en fonction de l'importance de la valeur manquante.
Vous devriez vraiment vérifier ce problème et le gérer de manière appropriée, soit en envoyant un message différent, soit en renvoyant simplement une valeur nulle pour tout le reste, afin d’identifier l’état précis.
Si vous tenez à ce que la notification ne figure pas dans le journal des erreurs, vous pouvez tout simplement ignorer le journal des erreurs.
J'ai posé une question à ce sujet et on m'a renvoyé à ce message avec le message suivant:
Cette question a déjà une réponse ici:
"Avis: Variable non définie", "Avis: Index non défini" et "Avis: Décalage non défini" en utilisant PHP
Je partage ma question et solution ici:
C'est l'erreur:
La ligne 154 est le problème. Voici ce que j'ai à 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 les conditions de la variable $city
, qui n'est pas la clé mais la valeur de $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 ne puis-je pas écrire une condition basée sur la valeur? Doit-il être avec la clé dont j'ai besoin pour é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 en fonction des données de ma boucle. Ce dont j'ai besoin, c'est de définir une condition pour que si $key
existe dans le tableau, exécutez le code, sinon, ignorez-le.
MISE À JOUR 2: Voici comment 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)){
L'une des causes courantes de la non-existence d'une variable après l'envoi d'un formulaire HTML est que l'élément de formulaire n'est pas contenu dans une balise <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>
Lorsqu’il s’agit de fichiers, un enctype approprié et une méthode POST sont nécessaires, ce qui déclenchera un avis d’index non défini si aucun n’est inclus dans le formulaire.
Le manuel indique 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:
Ces erreurs se produisent chaque fois que nous utilisons une variable non définie.
La meilleure façon de traiter ces problèmes est de définir les rapports d'erreur pendant le développement.
Pour définir le rapport d’erreur sur:
ini_set('error_reporting', 'on');
ini_set('display_errors', 'on');
error_reporting(E_ALL);
Sur les serveurs de production, le signalement des erreurs est désactivé. Par conséquent, nous ne rencontrons pas ces erreurs.
Sur le serveur de développement, toutefois, nous pouvons définir le rapport d'erreur.
Pour se débarrasser de cette erreur, nous voyons l'exemple suivant:
if ($my == 9) {
$test = 'yes'; // Will produce error as $my is not 9.
}
echo $test;
Nous pouvons initialiser les variables à NULL
avant d'affecter leurs valeurs ou de les utiliser.
Nous pouvons donc modifier le code comme suit:
$test = NULL;
if ($my == 9) {
$test = 'yes'; // Will produce error as $my is not 9.
}
echo $test;
Cela ne perturbera aucune logique de programme et ne produira pas d'avis même si $test
n'a pas de valeur.
Il est donc toujours préférable de définir le rapport d'erreur pour le développement.
Et corrigez toutes les erreurs.
Et en production, le signalement des erreurs doit être désactivé.
Vous utilisiez probablement l'ancienne version PHP jusque maintenant mise à niveau PHP et c'est la raison pour laquelle il fonctionnait sans erreur depuis des années. Jusqu'à PHP4, il n'y avait pas d'erreur si vous utilisez une variable sans la définir, mais à partir de PHP5, les erreurs sont générées pour les codes tels que ceux mentionnés dans la question.