web-dev-qa-db-fra.com

"Avis: Variable non définie", "Avis: Index non défini" et "Avis: Décalage non défini" à l'aide de PHP.

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:

1101
Pekka 웃

Avis: Variable non définie

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:

  1. 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'] ?? '';
    
  2. 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)
    
  3. 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 )
    
  4. Supprimez l'erreur avec l'opérateur @ .

Remarque: Il est fortement recommandé de ne mettre en œuvre que le point 1.

Remarque: index non défini/décalage non défini

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:

  1. 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'] : '';
    
  2. 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 variable

Les 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:

1008
Alin Purcaru

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:

131
Ish

Affichage d'erreur Opérateur _@

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"]);
  • Ceci est généralement découragé. Les nouveaux arrivants ont tendance à en abuser.
  • C'est très inapproprié pour le code situé profondément dans la logique de l'application (en ignorant les variables non déclarées là où vous ne devriez pas le faire), par exemple. pour les paramètres de fonction, ou en boucles.
  • Il existe cependant un avantage sur la super-suppression isset?: ou ??. Les avis peuvent toujours être enregistrés. Et on peut ressusciter @- avis masqué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 arrivants ne remarqueront pas de telles fautes de frappe. Cela vous prive simplement de notifications PHP pour ces cas mêmes. Ajoutez uniquement @ 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é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?"];

    • S'agit-il d'un nom de clé attendu et présent sur chaque demande de page ?
    • Les noms de variables et les indicateurs de tableau sont sensibles à la casse en PHP.
  • 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:

    browser developer tools / network tab

    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.

    • Assurez-vous que chaque entrée requise a un <input name=FOO>
    • L'attribut id= ou title= ne suffit pas.
    • Un formulaire method=POST doit renseigner $_POST.
    • Alors qu'un method=GET (ou le laisser de côté) produirait des variables $_GET.
    • Il est également possible pour un formulaire de fournir action=script.php?get=param via $ _GET et les champs method=POST restants dans $ _POST à ​​côté.
    • Avec les PHP configurations modernes (≥ 5.6), il est devenu faisable (non à la mode) d'utiliser $_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

  • Les mêmes contrôles de cohérence s'appliquent aux téléchargements de fichiers et à $_FILES["formname"].
  • De plus vérifier pour enctype=multipart/form-data
  • Ainsi que method=POST dans votre déclaration <form>.
  • Voir aussi: PHP Erreur d'index non défini $ _FILES?

$_COOKIE

  • Le tableau $_COOKIE n'est jamais rempli juste après setcookie(), mais uniquement lors d'une demande HTTP ultérieure.
  • En outre, leur durée de validité expire, ils peuvent constituer une contrainte pour les sous-domaines ou des chemins individuels, et l'utilisateur et le navigateur peuvent simplement les rejeter ou les supprimer.
60
mario

Généralement à cause de "mauvaise programmation" et d'une possibilité d'erreur dès maintenant ou plus tard.

  1. Si c'est une erreur, commencez par affecter correctement la variable: $ varname = 0;
  2. Si elle n'est vraiment définie que parfois, testez-la: if (isset($varname)), avant de l'utiliser
  3. Si c'est parce que vous l'avez mal orthographié, corrigez-le
  4. Peut-être même tourner les avertissements en vous paramètres PHP
44
Erik

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 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.

40
DGM

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')?>
34

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');
26
mpyw

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

  • .htconf (configuration du serveur Web, y compris vhosts et sous-configurations) *
  • .htaccess
  • en php même

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é

  • Vérifiez 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.
  • Vérifiez error_reporting et display_errors les directives php dans .htconf (ou vhosts, etc.) n'ont pas changé
  • Vérifiez error_reporting et display_errors les directives php dans .htaccess n'ont pas changé
  • Si vous avez une directive dans .htaccess, vérifiez si elles sont toujours autorisées dans le fichier .htconf
  • Enfin, vérifiez votre code. peut-être une bibliothèque non liée; pour voir si les directives error_reporting et display_errors php y ont été définies.
25
Robbie

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;
25
Roger

la solution rapide consiste à affecter votre variable à null en haut de votre code

$user_location = null;
20

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)

16
rybo111

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;
}
14
user2253362

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"] : '');

Manuel PHP PHP 7.

14
elpiel

POURQUOI IS CECI ARRIVE?

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:

  1. Vous avez installé PHP et les nouveaux paramètres par défaut sont quelque peu mal documentés mais n'excluez pas E_NOTICE.

  2. 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.

QUE PUIS-JE FAIRE À CE SUJET?

  1. 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.

  2. 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>.

  3. 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.

QUE SIGNIFIENT LES ERREURS?

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';

(astuce supplémentaire)

  • Lorsque je rencontrais ces problèmes et d’autres, j’utilisais IDE NetBeans (gratuit) et cela me donnait une foule d’avertissements et d’avis. Certains d'entre eux offrent des conseils très utiles. Ce n'est pas une obligation et je n'utilise plus les IDE, sauf pour les grands projets. Je suis plus d'une personne vim de nos jours :).
8
smcjones

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

?>
8
gts

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);
6
Sinte

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:

  1. 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.

  2. 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).

  3. 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.

  4. 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.

4
Wouter de Winter

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;
    }
}
3
John Conde

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:

3
Funk Forty Niner

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.

2
James

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:

enter image description here

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)){
0
Jaime Montoya

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>
0
John Conde

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:

0
Funk Forty Niner

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é.

0
Pupil

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.

0
phvish