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 offset: 1 sur parsing de $_SERVER['REMOTE_ADDR']


Sujet :

Langage PHP

  1. #1
    Membre habitué
    Homme Profil pro
    sans
    Inscrit en
    Mai 2007
    Messages
    482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : sans

    Informations forums :
    Inscription : Mai 2007
    Messages : 482
    Points : 193
    Points
    193
    Par défaut Notice: Undefined offset: 1 sur parsing de $_SERVER['REMOTE_ADDR']
    Bonjour,

    Souhaitant mettre en place un système d'affichage du nombre de personnes connectées, je rencontre un message d'erreur de type "Notice: Undefined offset".
    Comme je ne comprends pas complètement l'origine du message d'erreur, je joins ci-après les différents fichiers potentiellement concernés, soit index.php, adet1.php, adet2.php et enfin adet11.php

    index.php est le suivant:
    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
    <?php
    	session_start();
    	$_SESSION['langue_util'] = 'français';		// Initialisation de la langue
    	include('adet11.php');	// MAJ du compteur
    ?>
    <HTML>
    <HEAD></HEAD>
    <BODY>
     
    <?php
    	include('adet2.php');
    ?>
     
    </BODY>
    </HTML>
    adet1.php est :
    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
    <?php
    	// Paramètres de configuration de la base de données
    	$host = 'localhost';
    	$base = 'mabase';
    	$login = 'root';
    	$password = '';
     
    	$link = mysqli_connect($host,$login,$password,$base) or die(mysqli_error($link));
    	mysqli_set_charset ( $link , 'UTF8' );
     
     
    /* Vérification de la connexion */
    	if (!$link) {
    		echo "Error: Unable to connect to MySQL." . PHP_EOL;
    		echo "Debugging errno: " . mysqli_connect_errno() . PHP_EOL;
    		echo "Debugging error: " . mysqli_connect_error() . PHP_EOL;
    		exit;
    	}
     
    	if (mysqli_connect_errno())
    		{
    			printf("Échec de la connexion SSS: %s\n", mysqli_connect_error());
    			exit();
    		}
     
    ?>
    adet2.php est :
    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
    	include "php/adet1.php"; // Inclusion du fichier de connexion &agrave; la base de données
    	$link = mysqli_connect($host,$login,$password,$base) or die(mysqli_error($link));	// Connexion à MySql
     
     
    if (!$link) {
        echo "Error: Unable to connect to MySQL." . PHP_EOL;
        echo "Debugging errno: " . mysqli_connect_errno() . PHP_EOL;
        echo "Debugging error: " . mysqli_connect_error() . PHP_EOL;
        exit;
    }
     
     
     
     
    $retour = mysqli_query($link,'SELECT COUNT(*) AS nbre_entrees FROM connectes WHERE ip=\'' . $_SERVER['REMOTE_ADDR'] . '\'');
    $donnees = mysqli_fetch_array($retour);
     
    if ($donnees['nbre_entrees'] == 0) // L'IP ne se trouve pas dans la table, on va l'ajouter.
    {
        mysqli_query($link,'INSERT INTO connectes VALUES(\'' . $_SERVER['REMOTE_ADDR'] . '\', ' . time() . ')');
    }
    else // L'IP se trouve déjà dans la table, on met juste à jour le timestamp.
    {
        mysqli_query($link,'UPDATE connectes SET timestamp=' . time() . ' WHERE ip=\'' . $_SERVER['REMOTE_ADDR'] . '\'');
    }
     
    $timestamp_5min = time() - (60 * 5);
    mysqli_query($link,'DELETE FROM connectes WHERE timestamp < ' . $timestamp_5min);
     
    $retour = mysqli_query($link,'SELECT COUNT(*) AS nbre_entrees FROM connectes');
    $donnees = mysqli_fetch_array($retour);
     
    echo '(actuellement ' . $donnees['nbre_entrees'] . ' visiteurs connectés)';
    ?>
    Enfin, adet11.php est :
    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
    <?php
    //	session_start(); // A mettre sur chaque page utilisant la session
     
    	if (!isset($_COOKIE["monCook"]))
    		{
    			// Cookie inexistant donc création du cookie et incrémentation du nbre de visiteurs
    			setcookie("monCook","OK",time()+600);
    			$fp = fopen("compteur.txt","r+");
    			$visiteurs=fgets($fp,10);
    			$visiteurs++;
    			fseek($fp,0);
    			fputs($fp,$visiteurs);
    			fclose($fp);
     
    			// On met à jour les hits de connexion par pays
    			include "php/adet1.php"; // Inclusion du fichier de connexion à la base de données
    			$link = mysqli_connect($host,$login,$password,$base) or die(mysqli_error($link));	// Connexion &agrave; MySql
    //			$base = mysql_select_db($base); // Sélection de la base		// Utilité ?
     
    			if (!$base)
    				{echo 'impossible d\'ouvrir la base.';
    				}
    			else
    				{
    					// On commence par récupérer l'IP du visiteur
    					$dotted = $_SERVER['REMOTE_ADDR'];
     
    					//On transforme cet IP A.B.C.D en un nombre valant A * (256*256*256) + B * (256*256) + C * 256 + D
    					$dotted = preg_split( "/[.]+/", $dotted);			
    					$ip = (double) ($dotted[0]*16777216)+($dotted[1]*65536)+($dotted[2]*256)+($dotted[3]); 	// Nbre calculé sans les points et avec la formule
    					// On interroge la table:		
    					$result = mysqli_query($link,"SELECT CODE FROM `HitsParPaysNew` WHERE `IP_FROM` <= $ip AND `IP_TO` >= $ip");
    					$rows = mysqli_num_rows($result);
    					if ($rows == 1)
    						{
    							$req = mysqli_query($link,"UPDATE `HitsParPaysNew` SET hits=hits+1 WHERE `IP_FROM` <= $ip AND `IP_TO` >= $ip");
    							if (!$req )
    							   {
    									$message = 'Requête invalide : ' . mysqli_error() . "\n";
    									$message .= 'Requête complète : ' . $req ;
    									die($message);
    							   }
    						}	
     
     
     
    				// -----------------        On met aussi à jour les visiteurs connectés à l'instant t --------------------------- 
    					// ÉTAPE 1 : on vérifie si l'IP se trouve déjà dans la table. on compte le nombre d'entrées dont le champ "ip" est l'adresse IP du visiteur.
    					$retour = mysqli_query($link,'SELECT COUNT(*) AS nbre_entrees FROM connectes WHERE ip=\'' . $_SERVER['REMOTE_ADDR'] . '\'');
    					$donnees = mysqli_fetch_array($retour);
     
    					if ($donnees['nbre_entrees'] == 0) // L'IP ne se trouve pas dans la table, on va l'ajouter.
    						{
    							// -----------------        On met à jour la table HitsParPaysNew --------------------------- 
    							mysqli_query($link,'INSERT INTO connectes VALUES(\'' . $_SERVER['REMOTE_ADDR'] . '\', ' . time() . ')');
     
    						}
    					else // L'IP se trouve déjà dans la table, on met juste à jour le timestamp.
    						{
    							mysqli_query($link,'UPDATE connectes SET timestamp=' . time() . ' WHERE ip=\'' . $_SERVER['REMOTE_ADDR'] . '\'');
    						}
     
    					// ÉTAPE 2 : on supprime toutes les entrées dont le timestamp est plus vieux que 5 minutes.
     
    					// On stocke dans une variable le timestamp qu'il était il y a 5 minutes :
    					$timestamp_5min = time() - (60 * 5); // 60 * 5 = nombre de secondes écoulées en 5 minutes
    					mysqli_query($link,'DELETE FROM connectes WHERE timestamp < ' . $timestamp_5min);
     
    					// ÉTAPE 3 : on compte le nombre d'IP stockées dans la table. C'est le nombre de visiteurs connectés.
    					$retour = mysqli_query($link,'SELECT COUNT(*) AS nbre_entrees FROM connectes');
    					$donnees = mysqli_fetch_array($retour);
    			}
    		}
    else
    {			$fp = fopen("compteur.txt","r+");
    			$visiteurs=fgets($fp,10);
    }
    //echo $visiteurs.' visiteurs depuis le 1er novembre 2002';
    ?>
    J'ai trouvé sur le net différents messages relatifs à cette erreur mais pas quelque chose qui se rapproche à mon cas.
    Pourriez-vous me renseigner, svp ?
    Merci d'avance.

  2. #2
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    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
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Salut

    poste le message d'erreur dans son intégralité ça devrait aider.

  3. #3
    Membre habitué
    Homme Profil pro
    sans
    Inscrit en
    Mai 2007
    Messages
    482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : sans

    Informations forums :
    Inscription : Mai 2007
    Messages : 482
    Points : 193
    Points
    193
    Par défaut
    Bonjour rawsrc et merci pour ton intervention.
    Je joins une copie d'écran qui devrait répondre à tes dires :


    Est-ce suffisant ?
    Images attachées Images attachées  

  4. #4
    Membre actif Avatar de zaza576
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2013
    Messages
    175
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Août 2013
    Messages : 175
    Points : 275
    Points
    275
    Par défaut
    Hello,

    ce serait sympa d'avoir l'intégralité du message d'erreur que tu as obtenu. Ne serait-ce que pour identifier la ligne du fichier qui plante !

    A vue d'oeil, tu as un problème là ... <===================



    Plus sérieusement, ton problème "Notice: Undefined offset" est lié au fait que tu essaies de lire un index inexistant dans un tableau de données ! Où ? J'en sais rien vu que tu nous as pas aidé sur ce coup-là !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    function googleIsYourF*ck*ngFriend(String url, String maQuestion){
        goTo(url);
        reponse = find(maQuestion);
        if(isAcceptable(reponse)){
            clickOn(By.xpath("//button[@id='resolvedButton']"));
        }
        sendMessage("Merci");
    }
    
    googleIsYourF*ck*ingFriend("http://www.google.fr", "ma question");

  5. #5
    Membre habitué
    Homme Profil pro
    sans
    Inscrit en
    Mai 2007
    Messages
    482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : sans

    Informations forums :
    Inscription : Mai 2007
    Messages : 482
    Points : 193
    Points
    193
    Par défaut
    Bonjour zaza576,

    Merci de ton intervention. Elle a coïncidé avec ma mise en ligne qui devrait répondre à ton interrogation.

  6. #6
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Points : 16 372
    Points
    16 372
    Par défaut
    A priori, l'erreur est là :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    // On commence par récupérer l'IP du visiteur
    $dotted = $_SERVER['REMOTE_ADDR'];
     
    //On transforme cet IP A.B.C.D en un nombre valant A * (256*256*256) + B * (256*256) + C * 256 + D
    $dotted = preg_split( "/[.]+/", $dotted);			
    $ip = (double) ($dotted[0]*16777216)+($dotted[1]*65536)+($dotted[2]*256)+($dotted[3]); 	// <--- ICI
    En gros, ton tableau $dotted ne contient qu'un seul élément, ce qui revient à dire que l'adresse récupérée n'est pas de la forme A.B.C.D

    Conseils pour résoudre ton problème :
    • Debugguer en affichant la valeur de $dotted avant le split par var_dump($dotted);.
    • Ajouter un contrôle pour vérifier le format récupéré
    • Eviter de se prendre le chou avec preg_split lorsqu'un simple explode suffit amplement.
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  7. #7
    Membre habitué
    Homme Profil pro
    sans
    Inscrit en
    Mai 2007
    Messages
    482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : sans

    Informations forums :
    Inscription : Mai 2007
    Messages : 482
    Points : 193
    Points
    193
    Par défaut
    Bonjour Celira,

    Merci pour ton intervention.

    Debugguer en affichant la valeur de $dotted avant le split par var_dump($dotted);.
    J'ai ajouté cette ligne puis actualisé ma page et .... plus d'erreur
    J'ai commenté cette ligne et actualisé de nouveau et effectivement l'erreur n'est plus là ! Aurais-tu une explication logique ?

    Eviter de se prendre le chou avec preg_split lorsqu'un simple explode suffit amplement.
    Ok, je vais me pencher sur sa syntaxe.

  8. #8
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    $_SERVER['REMOTE_ADDR'] pourrait ne pas être une adresse IPv4, tu peux intercepter les problèmes en tout cas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    $ip = $_SERVER['REMOTE_ADDR'];
    $dotted = explode('.', $ip);
    if (count($dotted) == 4) {
        $number_ip = (double) ($dotted[0]*16777216)+($dotted[1]*65536)+($dotted[2]*256)+($dotted[3]);
    }
    else {
        echo 'Mauvais format d\'ip : ' . $_SERVER['REMOTE_ADDR'];
        $number_ip = FALSE;
    }
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  9. #9
    Membre habitué
    Homme Profil pro
    sans
    Inscrit en
    Mai 2007
    Messages
    482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : sans

    Informations forums :
    Inscription : Mai 2007
    Messages : 482
    Points : 193
    Points
    193
    Par défaut
    Trop fort, Sabotage

    Merci à tous.

  10. #10
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    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
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Salut,

    juste en passant, pour valider une adresse ip en PHP :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4);
    filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6);
    Et pour convertir ton ip, évite la cuisine et privilégie la simplicité :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $number_ip = sprintf('%u', ip2long($ip));

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

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