Problème PHP

Résolu
Zizanie -  
avion-f16 Messages postés 19182 Date d'inscription   Statut Contributeur Dernière intervention   -

Bonjour,

Jusqu'à présent, et depuis 7 ans, ce code fonctionnait et me retournait le nombre de visiteurs.

Hors depuis que je suis passée au PHP 8.0, cela fonctionne toujours mais avec ces lignes :

Warning: Undefined array key "#HTTP_REFERER#" in/homepages/8/d560574319/htdocs/clickandbuilds/test/wp-content/plugins/insert-php-code-snippet/stats_passages.phpon line174

Warning: Undefined array key "#HTTP_HOST#" in/homepages/8/d560574319/htdocs/clickandbuilds/test/wp-content/plugins/insert-php-code-snippet/stats_passages.phpon line175

Voici les lignes en question et je pense que la variable est vide :

$site_referant = $_SERVER['#HTTP_REFERER#'];
         $monsite = '#' . $_SERVER['#HTTP_HOST#'];
        if (preg_match($monsite,$site_referant))
            {
            $site_referant = "";}

Merci de m'aider à trouver une solution

5 réponses

  1. avion-f16 Messages postés 19182 Date d'inscription   Statut Contributeur Dernière intervention   4 511
     

    Bonjour,

    J'ai appris le PHP il y a plus de 15 ans et je n'ai jamais vu cette notation pour les variables $_SERVER, avec des dièses autour des clés HTTP_REFERER ou HTTP_HOST.

    Peut-être que cela fonctionnait sur un serveur spécifique dans un fonctionnement non-standard mais alors c'est un choix fait par l'administrateur du serveur, ce n'est pas la façon "standard" de nommer ces variables.

    Tu peux accéder aux valeurs avec $_SERVER['HTTP_REFERER'] au lieu de $_SERVER['#HTTP_REFERER#'] et idem pour HTTP_HOST.

    Voir ici pour plus d'infos : https://www.php.net/manual/fr/reserved.variables.server.php

    0
  2. Zizanie
     

    Bonjour,

    Merci beaucoup : Il semble que grâce à vos explications à tous deux, le problème soit résolu.

    Si, j'ai de nouveau des ennuis, je ne manquerai pas de vous le signaler.

    Cordialement

    0
  3. Zizanie
     

    Bonjour,

    Nouveau problème depuis que j'ai ôté les dièses :

    Warning: Undefined array key "HTTP_REFERER" in /homepages/8/d560574319/htdocs/clickandbuilds/test/wp-content/plugins/insert-php-code-snippet/stats_passages.php on line 174

    Warning: preg_match(): Delimiter must not be alphanumeric or backslash in /homepages/8/d560574319/htdocs/clickandbuilds/test/wp-content/plugins/insert-php-

    code-snippet/stats_passages.php on line 176

    La ligne 175 s'en est trouvée améliorée

    Merci

    0
    1. avion-f16 Messages postés 19182 Date d'inscription   Statut Contributeur Dernière intervention   4 511
       

      Bonjour,

      L'entête HTTP Referer n'est pas toujours définie, il faut vérifier si elle existe avant de tenter de la lire.

      0
      1. Zizanie > avion-f16 Messages postés 19182 Date d'inscription   Statut Contributeur Dernière intervention  
         

        jE COMPRENDS bien, mais je ne me souviens plus du tout comment on fait !!! Le temps a passé depuis mes premières codifications.

        Bien

        Merci pour votre aide

        Ave empty bien sûr !!!!

        0
      2. avion-f16 Messages postés 19182 Date d'inscription   Statut Contributeur Dernière intervention   4 511 > Zizanie
         

        Avec la fonction isset : https://www.php.net/manual/en/function.isset.php

        isset permet de s'assurer que la clé existe avant de continuer et donc éviter l'erreur "Undefined array key".

        Mais la fonction empty() est peut-être préférable si tu souhaites aussi t'assurer que la valeur est non-vide.

        0
  4. Zizanie
     

    Voilà ce que j'ai fait mais bon.

    La valeur n'est pas vide puisque ma BDD enregistre

    Merci

    $site_referent = $_SERVER['HTTP_REFERER'];
              if(isset($site_referent)){
              echo "valeur déclarée";}
              else {
              echo "valeur nulle";}
             $site_referent = $_SERVER['HTTP_REFERER'];
              $monsite = 'http://' . $_SERVER['HTTP_HOST']; 
             if (preg_match($monsite,$site_referent))

    0
    1. Zizanie
       

      Je n'en ai fait qu'une pour voir si cela fonctionnait mais non.....

      0
    2. avion-f16 Messages postés 19182 Date d'inscription   Statut Contributeur Dernière intervention   4 511
       

      Bonjour,

      Il faut vérifier si $_SERVER['HTTP_REFERER'] existe avant de l'utiliser ou de l'attribuer à une autre variable.

      Faire une vérification isset() sur une variable que tu as définie manuellement juste au-dessus n'apporte rien...

      0
    3. Zizanie > avion-f16 Messages postés 19182 Date d'inscription   Statut Contributeur Dernière intervention  
       

      Cela donnerait donc ceci :
                if(isset($site_referent)){
                echo "valeur déclarée";}
                else {
                echo "valeur nulle";}
               $site_referent = $_SERVER['HTTP_REFERER'];
                $monsite = 'http://' . $_SERVER['HTTP_HOST']; 
               if (preg_match($monsite,$site_referent)){blabla

      0
    4. avion-f16 Messages postés 19182 Date d'inscription   Statut Contributeur Dernière intervention   4 511 > Zizanie
       

      Non c'est encore pire là. Tu fais un isset sur une variable non-déclarée, et plus tard, tu lui assignes $_SERVER['HTTP_REFERER'] sans avoir vérifié si $_SERVER['HTTP_REFERER'] est défini.

      Il faut d'abord vérifier si $_SERVER['HTTP_REFERER'] existe avant de l'utiliser.

      0
    5. Zizanie > avion-f16 Messages postés 19182 Date d'inscription   Statut Contributeur Dernière intervention  
       

      Bonjour,

      Excuse-moi, mais je ne comprends plus du tout, où je dois mettre mon isset !

      Désolée, d'être si "obtus"

      0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. Zizanie
     

    Merci beaucoup cela fonctionne.

    L'erreur referer est partie, je vais faire maintenant l'undefined key HOST

    0
    1. Zizanie
       

      Bonsoir, 

      Mes deux "undefined key" sont réglées.

      Me reste ceci à la ligne 179

      		
      		$monsite = isset($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] : ''; 
      		
      		 if (preg_match($monsite,$site_referant))
      		    {
      			$site_referant = "";}

      Warning: preg_match(): Delimiter must not be alphanumeric or backslash in

      /homepages/8/d560574319/htdocs/clickandbuilds/test/wp-content/plugins/insert-php-code-snippet/stats_passages.php on line 179 (la ligne de l'ouverture de la parenthèse du preg_match)

      voilà ce que j'avais pour $monsite

      $monsite = 'http://' . $_SERVER['HTTP_HOST'];
      0
      1. avion-f16 Messages postés 19182 Date d'inscription   Statut Contributeur Dernière intervention   4 511 > Zizanie
         

        Bonjour,

        La premier argument de la fonction preg_match ne peut pas être simplement ton domaine, il faut inclure des délimiteurs comme « # » ou « / ». C'est exactement ce que l'erreur te dit.

        Là encore, rien de neuf depuis des années, c'était déjà une erreur de faire ce que tu fais avec les anciennes versions de PHP.

        Voir ici pour des exemples : https://www.php.net/manual/fr/function.preg-match.php

        Afin de vérifier si une chaine ($site_refereant) en contient une autre ($monsite), on utilise généralement strpos() qui retourne la position si la chaine est trouvée, ou false sinon.
        https://www.php.net/manual/en/function.strpos.php

        Depuis PHP 8.0, il y a aussi https://www.php.net/manual/en/function.str-contains.php

        0