IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Notice Undefined index et Undefined variable


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de BRUNO71
    Homme Profil pro
    Retraité
    Inscrit en
    Janvier 2007
    Messages
    507
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 507
    Par défaut Notice Undefined index et Undefined variable
    Bonjour,

    J’ai réalisé un site sur l’apiculture et j’ai installé deux quizz qui fonctionnaient sans problème.
    Visible à cette adresse : http://www.ruche-apiculture.org
    Depuis peu des messages d’erreurs apparaissent comme ceci :
    - Pour la même page :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Notice: Use of undefined constant PHP_SELF - assumed 'PHP_SELF'
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Undefined index: result
    - Pour une autre page :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Notice: Undefined variable: resultat in ….. line 16
    J’ai corrigé la première ligne en ajoutant des guillemets ( ‘ et ‘ ) à PHP_SELF….
    Voici le code de la première page… il semblerait qu’il y ai une faute au post (result) ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
     
    <?php 
    $page = basename($_SERVER['PHP_SELF']);
    if (!$_POST[‘result’]) 
    {
      print "<form action=\"$page\" method='post'>\n";
      for ($i=0; $i<count($quizz); $i++) {
            print '<blockquote><span>';
            print "\t".$quizz[$i][0]."\n";
            print '</span><br /><br />';
                for ($j=1; $j<count($quizz[$i])-2; $j++) {
               $quest=$quizz[$i][$j];
               print "<input type='radio' name=\"$i\" value=\"$j\" /> $quest<br />\n ";
                }
            print "</blockquote><hr/>";
      }
      print "<input type='hidden' name='result' value='voir' /><br />\n<center>";
      print "<input type='submit' style='background-color:#2A5C2A' onmouseover=\"this.style.color='#fff'\" onmouseout=\"this.style.color='#000'\" onmousedown=\"this.style.color='#f90'\" value='Valider vos r&eacute;ponses' /></center></form><br/>\n";}
    else {
      print '<h4 align="center">Résultats du quizz</h4><br />';
      $points=0;
      for($i=0; $i<count($quizz); $i++) {
            $reponse = trim($_POST[$i]);
            print  '<blockquote><span>';
            print "\t".$quizz[$i][0]."</span><br /><br />\n";
            $numero_bonne=$quizz[$i][count($quizz[$i])-2]; // avant dernière valeur du tableau
           $bonne=$quizz[$i][$numero_bonne]; // Bonne réponse
            if ($reponse==$numero_bonne) {
               print "Votre réponse <b><i>".$bonne."</i></b> est exacte.<br />";
               $points++;
               }
               else {
                    print "La bonne réponse est <b>".$bonne."</b> mais vous ";
                    if ($reponse=="") {
                       print "n´avez rien répondu.<br />";
                    }
                    else {
                 print 'avez choisi la proposition" <b>'.$quizz[$i][$reponse].' "</b>.<br />';
                    }
               }
            $commentaire=$quizz[$i][count($quizz[$i])-1]; // dernière valeur du tableau
           print "<br />".$commentaire."<br />\n";        
           print "</blockquote><hr />\n";
      }
      if($points==count($quizz)) {
            print"<br /><h4 align='center'>Félicitations vous avez tout juste&nbsp;!</h4>\n";
            }
            else {
              print "<br /><h4 align='center'>Vous avez $points bonne";
              if ($points>1) print "s";
              print " réponse";
              if ($points>1) print "s";
              print " sur ".count($quizz)." questions.</h4>\n";
     print "<p align='center'><a href='questions_abeille.php'>Réinitialiser le quizz</a></p>\n";
       //Ajout d'un enregistrement pour le cpt   
     $con = mysql_connect("SERVEUR", "LOGIN", "MTP");
     $ip = $_SERVER['REMOTE_ADDR'];
     
    if (!$con)
      {
      die('Could not connect: ' . mysql_error());
      }
     
    mysql_select_db("BDD", $con);
     
    mysql_query("INSERT INTO table (nb_click, ip) VALUES ('1', '$ip')");
     
    mysql_close($con);
     
            }
     
    }
     
    ?>
    Je ne vois pas les erreurs !
    Entre Notice Undefined index et Undefined variable
    Merci beaucoup pour votre savoir faire.

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 39
    Par défaut
    Bonjour

    Pour le message Undefined index: result, PHP te dit que l'index result n'existe pas.

    Donc pour éviter ce message d'erreur, il faut d'abord tester que l'indice result est défini avec la fonction isset() http://www.php.net/isset

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <?php
    if (isset($_POST['result'])) {
     
    //ton code
     
    }
    ?>
    Il me semble que tu as aussi oublié une accolade fermente avant le else de la ligne 19

  3. #3
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    Citation Envoyé par BRUNO71 Voir le message
    Je ne vois pas les erreurs !
    Tu m'étonnes, Elton !
    On ne code plus comme ca depuis un bon demi-siècle ...

    - "nettoie" le code (indentation, passages a la ligne, ...) pour le rendre plus lisible et facile à débuguer
    - remplace print par echo
    - sort le code html du code php
    - réserve les " au html et les ' au php
    - if (!$_POST[result]) ?? -> if (!$_POST['result'])

    Voici une "bonne pratique" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    <?php 
    $page = basename($_SERVER['PHP_SELF']);
    if (!$_POST['result']) 
    {
    ?>
    	<form action="<?php echo $page; ?>" method="post">
    <?php
    	for ($i=0; $i<count($quizz); $i++) 
    	{
    ?>
    		<blockquote>
    			<span><?php echo $quizz[$i][0]; ?></span>
    			<br /><br />
    <?php
    		for ($j=1; $j<count($quizz[$i])-2; $j++) {
    			$quest=$quizz[$i][$j];
    ?>
    			<input type="radio" name="<?php echo $i; ?>" value="<?php echo $j; ?>" /> <?php echo $quest; ?><br />
    <?php		} // fin for 
    ?>
    		</blockquote>
    		<hr/>
    <?php
    	} // fin for
    ?>
    		<input type="hidden" name="result" value="voir" /><br />
    		<center>
    		<input type="submit" style="background-color:#2A5C2A" onmouseover="this.style.color='#fff';" onmouseout="this.style.color='#000';" onmousedown="this.style.color='#f90';" value="Valider vos r&eacute;ponses" />
    		</center>
    	</form>
    	<br/>
    <?php
    } else {
    ?>
    [........]
    Tu verras que les erreurs éventuelles seront plus faciles à trouver ...

    .. de quoi faire de toi un ... happy-culteur
    Dernière modification par Invité ; 14/08/2011 à 11h35.

  4. #4
    Expert confirmé
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Billets dans le blog
    12
    Par défaut
    Bonjour,

    comme le préconise le collègue jreaux62, il vaut mieux suivre ses conseils car
    ton code est illisible. Tout est imbriqué, mal organisé et pour la maintenance bonjour le stress.
    Le copain jreaux62 te propose une approche qui sépare le code html du php et je te propse la même chose mais un peu différemment :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    <?php 
     
    $page    = basename($_SERVER['PHP_SELF']);
    $nbQuizz = count($quizz);
     
    if ( ! $_POST['result']) {
       echo <<<HTML
    <form action="$page" method="post">
    HTML;
     
       for($i = 0; $i < $nbQuizz; $i++) {
          echo <<<HTML
       <blockquote>
          <span>{$quizz[$i][0]}</span>
          <br /><br />
    HTML;
     
          for ($j = 1; $j < count($quizz[$i])-2; $j++) {
             echo <<<HTML
          <input type="radio" name="$i" value="$j" /> {$quizz[$i][$j]}<br />
    HTML;
          }
     
          echo <<<HTML
       </blockquote>
       <hr />
    HTML;
       }
     
       echo <<<HTML
       <input type="hidden" name="result" value="voir" /><br />
       <center>
          <input type="submit" style="background-color:#2A5C2A" onmouseover="this.style.color='#fff'" onmouseout="this.style.color='#000'" onmousedown="this.style.color='#f90'" value="Valider vos r&eacute;ponses" />
       </center>
    </form>
    <br />
    HTML;
    }
    else {
     
       # RESULTATS DU QUIZZ
       echo <<<HTML
    <h4 align="center">Résultats du quizz</h4><br />
    HTML;
     
       # DETAILS DES REPONSES
       $points = 0;
       for($i = 0; $i < $nbQuizz; $i++) {
          $reponse = trim($_POST[$i]);
     
          echo <<<HTML
    <blockquote>
       <span>{$quizz[$i][0]}</span><br /><br />
    HTML;
     
          $numero_bonne = $quizz[$i][count($quizz[$i])-2];   // avant dernière valeur du tableau
          $bonne        = $quizz[$i][$numero_bonne];         // Bonne réponse
          $commentaire  = $quizz[$i][count($quizz[$i])-1];   // dernière valeur du tableau
     
          if ($reponse == $numero_bonne) {
             $points++;
             echo <<<HTML
       <span>Votre réponse <b><i>$bonne</i></b> est exacte.</span>
    HTML;
          }
          elseif ($reponse === "") {
             echo <<<HTML
       <span>La bonne réponse est <b>$bonne</b> mais vous n´avez rien répondu.</span>
    HTML;
          }
          else {
             echo <<<HTML
       <span>La bonne réponse est <b>$bonne</b> mais vous avez choisi la proposition" <b>{$quizz[$i][$reponse]}</b>".</span>
    HTML;
          }
     
          echo <<<HTML
       <br />$commentaire<br />
    </blockquote>
    <hr />
    HTML;
       }
     
       # SCORE
       if ($points === $nbQuizz) {
          echo <<<HTML
    <br />
    <h4 align="center">Félicitations vous avez tout juste&nbsp;!</h4>
    HTML;
       }
       else {
          $plural = ($points > 1) ? 's' : NULL;
          echo <<<HTML
    <br />
    <h4 align="center">Vous avez $points bonne$plural réponse$plural sur $nbQuizz questions.</h4>
    HTML;
       }
     
       # REINITIALISATION DU QUESTIONNAIRE
       echo <<<HTML
    <p align="center"><a href="questions_abeille.php">Réinitialiser le quizz</a></p>
    HTML;
     
       # STATS
       $con = mysql_connect("SERVEUR", "LOGIN", "MTP");
       $ip  = $_SERVER['REMOTE_ADDR'];
     
       if ( ! $con) {
          die('Could not connect: ' . mysql_error());
       }
     
       mysql_select_db("BDD", $con);    
       mysql_query("INSERT INTO table (nb_click, ip) VALUES ('1', '$ip')");
       mysql_close($con);
    }
    ?>
    Sinon les commentaires précédents de l'ami jreaux62 sont très judicieux

  5. #5
    Membre éprouvé
    Homme Profil pro
    Lycéen
    Inscrit en
    Décembre 2008
    Messages
    106
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Décembre 2008
    Messages : 106
    Par défaut
    ce que tu fais avec la syntaxe heredoc cest un peu - pardonnez moi la trivialité de l'expression - cacher la merde au chat..
    Faudrait séparer complètement les couches.. Faire les vérifications des formulaires, les accès à la base de données avant la sortie.

  6. #6
    Membre éclairé Avatar de BRUNO71
    Homme Profil pro
    Retraité
    Inscrit en
    Janvier 2007
    Messages
    507
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 507
    Par défaut
    Bonjour à vous,

    Merci pour votre contribution.
    Merci ( rawsrc ) pour ce code très très bien codé.... Je prends quelques exemples de code de gauche à droite et de PHP5 chez Eyrolles...
    Je prendrais cet exemple par la suite..
    Mai bon, je suis amateur c'est quand même pas évident..
    Bref, j'ai installé ton nouveau code sur ma page quizz abeilles et j'ai toujour le même problème à la ligne 6.
    Ce qui correspond a :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if ( ! $_POST['result']) {
    Et si je valide le quizz j'ai une erreur à la ligne 49:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     $reponse = trim($_POST[$i]);
    Que faire ?

  7. #7
    Expert confirmé
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Billets dans le blog
    12
    Par défaut
    Citation Envoyé par lucas74 Voir le message
    ce que tu fais avec la syntaxe heredoc cest un peu - pardonnez moi la trivialité de l'expression - cacher la merde au chat..
    Faudrait séparer complètement les couches.. Faire les vérifications des formulaires, les accès à la base de données avant la sortie.
    Tu es gentil, mais parfois il faut lire un peu avant de poster. Tu penses qu'en voyant son code initial, BRUNO71 va directement appliquer tes préconisations simplement parce que tu le dis : séparation des couches et toutle toutim... Je suis désolé mais cela n'est pas à la portée de n'importe quel développeur amateur (et même pro). Alors des conseils de ce genre tu peux franchement te les garder (et je reste poli).

    @BRUNO71
    Est ce que ton tableau $_POST est bien renseigné avant tout le traitement ?
    Essaie de poser avant ton code un histoire de voir le contenu

  8. #8
    Invité
    Invité(e)
    Par défaut
    Bonjour rawsrc,
    Citation Envoyé par rawsrc Voir le message
    ... comme le préconise le collègue jreaux62, il vaut mieux suivre ses conseils
    ... Sinon les commentaires précédents de l'ami jreaux62 sont très judicieux
    D'abord,un grand merci pour ta sollicitude !
    Citation Envoyé par rawsrc Voir le message
    ... Le copain jreaux62 te propose une approche qui sépare le code html du php et je te propose la même chose mais un peu différemment
    Sur ce point, je t'invite à lire ceci : Apostrophes ou guillemets : Temps d'exécution

    Je m'en suis inspiré pour voir la différence de temps d'execution.
    Voici le test (avec microtime()):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    <?php
    $debut_avececho = microtime(true);
    for ($i=0; $i<5000; $i++) {
       echo '
    	<input type="hidden" value="$toto" style="$style"/>
    	';
    }
    $fin_avececho = microtime(true) - $debut_avececho;
     
    $debut_endehors = microtime(true);
    for ($i=0; $i<5000; $i++) {
    ?>	<input type="hidden" value="<?php echo $toto; ?>" style="<?php echo $style; ?>"/>
    <?php
    }
    $fin_endehors = microtime(true) - $debut_endehors;
     
    $debut_avecHTML = microtime(true);
    for ($i=0; $i<5000; $i++) {
       echo <<<HTML
    	<input type="hidden" value="$toto" style="$style"/>
    HTML;
    }
    $fin_avecHTML = microtime(true) - $debut_avecHTML;
     
    ?>
    temps avec '?php' : <?php echo $fin_endehors; ?><br />
    temps avec 'HTML' : <?php echo $fin_avecHTML; ?><br />
    temps avec 'echo' : <?php echo $fin_avececho; ?>
    On obtient :
    temps avec '?php' : 0.396687984467
    temps avec 'HTML' : 0.483137845993
    temps avec 'echo' : 0.57389497757
    Donc plus rapide en mettant le html en dehors du php !

    La raison est simple :
    - avec <?php echo "...du-code-html..."; ?> ou <?php echo <<<HTML ...du-code-html... HTML; ?>
    => php est obligé d'"interpréter" le code html avant de l'afficher.

    - avec le code html hors du code php,
    => il est afficher directement. Donc plus rapidement.
    Dernière modification par Invité ; 14/08/2011 à 20h17.

  9. #9
    Expert confirmé

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Par défaut
    Citation Envoyé par jreaux62 Voir le message
    La raison est simple :
    - avec <?php echo "...du-code-html..."; ?> ou <?php echo <<<HTML ...du-code-html... HTML; ?>
    => php est obligé d'"interpréter" le code html avant de l'afficher.

    - avec le code html hors du code php,
    => il est afficher directement. Donc plus rapidement.
    c'est faux, PHP compile d’abord le code en token puis en opcode, ensuite il est interprété (par l'opcode), les mesures sont donc fausses seul le nombre d'opération compte

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    1 test : 1  eop
    2 test : 12 eop
    3 test : 6  eop
    cette article est faux, je pense qui serait plus que bon de le supprimer

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Notice: Undefined index & Variable
    Par MTHYC dans le forum Langage
    Réponses: 3
    Dernier message: 05/03/2012, 08h01
  2. Notice: Undefined index method post
    Par vanou dans le forum Langage
    Réponses: 8
    Dernier message: 07/03/2007, 09h33
  3. Pb erreur Notice: Undefined index: pseudo
    Par PAINCO dans le forum Langage
    Réponses: 15
    Dernier message: 19/02/2007, 18h20
  4. Notice: Undefined index
    Par abusatif dans le forum Langage
    Réponses: 4
    Dernier message: 08/02/2007, 09h03
  5. Réponses: 9
    Dernier message: 01/05/2006, 00h02

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo