Accueil Forum -> Techno Geek -> Programmation  >>  PHP - Notice: Undefined offset: X in /var/www/…
3 messages
Accueil Forum -> Techno Geek -> Programmation  >>  PHP - Notice: Undefined offset: X in /var/www/…
3 messages

PHP - Notice: Undefined offset: X in /var/www/…

25 octobre 2016 à 13:46 MetalTux    
Salut

j'ai un script en PHP qui doit faire des stats à la con depuis un fichier de logs de serveurs web, dont les 5 fichiers les plus demandés, et les IP des machines qui les ont demandés
Mais j'ai quelques erreurs qui commencent à me gonfler… Donc, voilà le résultat du script avec les messages d'erreurs


Résultat a écrit:

Notice: Undefined offset: 3 in /var/www/html/php/logs/logs.php on line 24
Notice: Undefined offset: 3 in /var/www/html/php/logs/logs.php on line 26
Notice: Undefined offset: 1 in /var/www/html/php/logs/logs.php on line 29
Notice: Undefined offset: 1 in /var/www/html/php/logs/logs.php on line 33
Notice: Undefined offset: 2 in /var/www/html/php/logs/logs.php on line 36
Notice: Undefined offset: 2 in /var/www/html/php/logs/logs.php on line 38

Les fichiers les plus demandés:
/schle005/accueil.html = 52
/galic005/afficher.php = 49
/pierr157/login.php = 46
/galic005/login.php = 44
/masso055/login.php = 40

Nombre de requêtes = 1320
Quantité totale des données = 348296
[citation nom]

La tête de mon fichiers logs.txt ressemble à peu près à ça

[citation nom=Fichiers Logs]
IP - - [Date:Heure +0000] "GET /url/vers/un/fichier HTTP/1.1" <HTTP_status_code> <nombre_octets_transférés>
IP - - [Date:Heure +0000] "POST /url/vers/un/autre/ HTTP/1.0" <HTTP_status_code> <nombre_octets_transférés>



Et enfin mon code PHP

logs.php a écrit:

<!DOCTYPE html>
<html>
<head>
<title>Logs : statistiques</title>
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
<body>

<?php

$pattern='#^([^ ]+) [^"]+"[^/]+(/[^ ]*) .+ ([0-9]+|-)$#';
$requestnbr=0;
$transfereddata=0;
$tab=array();
$tabrequest=array();

$logsfile = fopen("log.txt","r");
while(! feof($logsfile))
{
$logs=fgets($logsfile);
$requestnbr++;

preg_match($pattern, $logs, $output);

if ($output[3] != "-")
{
$transfereddata += $output[3];
}

if (isset($tab[$output[1]])) {
$tab[$output[1]]++;
}
else {
$tabrequest[$output[1]]=1; /*Si variable vide, on fixe arbitrairement sur un, pour le debug*/
}

if (isset($tabrequest[$output[2]]))
{
$tabrequest[$output[2]]++;
}
else {
$tabrequest[$output[2]]=1;
}

}


echo "<br>Les fichiers les plus demandés: <br>";
arsort($tabrequest);
$i=0;
foreach ($tabrequest as $key => $val) {

if($i<5) {
echo "$key = $val<br>";
$i++;
}
else break;

}

/* echo "<br>Machines ayant demandé les fichiers : <br>"; */

echo "<br><br>";
echo "Nombre de requetes = $requestnbr<br>";
echo "Quantité totale des données = $transfereddata<br>";

fclose($logsfile);
?>

</body>
</head>


La grande question étant c'est quoi exactement l'erreur "Undefined offset" et comment résoudre le problème?

PS : J'ai fais très peu de PHP, j'ai avaiy pas retouché depuis 2 ans et je hais ce langage (d'autant plus que
je suis pas développeur web à la base… mais passons ) donc pour les explications, merci de simplifier au maximum, comme quand on s'adresse à quelqu'un qui n'a jamais touché un ordinateur en fait

PHP - Notice: Undefined offset: X in /var/www/…

24 août 2019 à 22:47 ShaKen    
Salut,

"Notice: Undefined offset: X", où X est égal à un chiffre, signifie que tu essayes de récupérer une valeur associative d'un tableau qui n'existe pas. En gros, si X est égal à 3, alors l'entrée n°3 de ton tableau n'existe pas. Attention, en PHP, un tableau (array) commence à 0 et non 1.

Mais vu tes erreurs (il ne trouve ni l'entrée n°1, ni l'entrée n°2, ni l'entrée n°3), je suppute que ton expression rationnelle ($pattern) est fausse et que, en conséquence, ta fonction preg_match ne retourne aucun résultat. Essaye d'afficher $output (via print_r) en ligne 23, tu verras bien ce que tu obtiens mais je paris sur un tableau vide.

PHP - Notice: Undefined offset: X in /var/www/…

30 août 2019 à 21:39 MetalTux    
Salut,

Merci pour la réponse. C'est pas impossible qu'il y ait une coquille ou deux dans l'expression rationnelle. Bien vu.
Mais je vais pas pouvoir tester tout de suite. Il va d'abord falloir que
- Je retrouve où j'ai conservé le fichier que script doit lire, probablement au fin fond d'une archive compressée sur un de mes disques de backups (ou un autre au même format je sais plus si c'était le format de logs par défauts de httpd)
- Je prenne le temps de refaire une VM de test avec un apache httpd dessus, pour pouvoir retester l'expression rationnelle.

Celà dit, même sans tester, t'as très probablement raison sur le tableau vide. Sur le coup j'avais pas pensé à l'afficher.
Et en regardant de plus près près, j'ai que 3 groupes dans mon expression rationnelle, pas 4. Du coup soit j'ai oublié un groupe, soit c'est normal que le [3] n'existe pas (mais moins normal pour les 2 autres).