Problème PHP

Résolu

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. Merci beaucoup cela fonctionne.

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

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

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

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

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

    3. @avion-f16

      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

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

    5. @avion-f16

      Bonjour,

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

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

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

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

    2. @avion-f16

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

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

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

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