Précédent   Forum des professionnels en informatique > PHP > Langage
Langage Forum sur le langage PHP, la POO, les conventions, la sécurité, etc. Avant de poster : FAQ Langage, toutes les FAQ PHP, cours langage et sources PHP
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 04/04/2011, 13h13   #1
Membre expérimenté
 
Avatar de ArKam
 
Inscription : mars 2007
Messages : 505
Détails du profil
Informations personnelles :
Âge : 25

Informations forums :
Inscription : mars 2007
Messages : 505
Points : 511
Points : 511
Par défaut Parsing de fichier et split de résultat.

Bien le bonjour à tous, voila, je reviens vers vous, car je patauge avec un de mes scripts.

Le script est tout con, il ne fait pas grand-chose:

1°/-Vérifier la présence d'un fichier.
2°/-Ouvrir le fichier.
3°/-Lire chaque ligne.
4°/-eclater chaque ligne grâce à preg_split (le pattern etant un espace).
5°/-Prendre chaque ligne et l'envoyer en BDD en faisant en sorte que chaque partie éclatée correspondent à un champs dans la table donnée.

Voici ce que je fais pour l'instant:

Code :
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
 
<?php
 
function logsparsing(){
 
	// Déclaration du pattern preg_split //
 
$pattern = "/\s/"; //On recherche les espaces dans la chaine soumise.//
 
	// Ouverture du fichier de log	//
 
$access_log = "/srv/www/squid/content/access.log"; //fichier à lire //
 
if (is_readable($access_log)) { //test du fichier, possible à ouvrir ou pas.//
echo "File is readable!";
$readlog = fopen($access_log,"r+"); //On ouvre le fichier.//
 
	while (!feof($readlog)) //Boucle jusqu'à l'arrivé en fin de fichier.//
	{
		$linesreadlog = fgets($readlog);// On lit le fichier en déplaceant le pointeur ligne par ligne tout en mettant la valeur du pointeur en variable.//
		foreach($linesreadlog as $linereaded) {
			$keywords = preg_split($pattern,$linereaded);
			print_r($keywords);	
		}
	}
 
fclose($access_log);
 
} 
 
else {
	echo "Error - The file can't be read.";	
}
 
}
 
logsparsing();
 
?>
Mon souci ici, c'est le foreach, je n'arrive pas à faire en sorte qu'il me sorte un tableau de la forme:

array ( [0] = 1320.516, [1] = GET, [2] = http://url.com etc);

j'ai donc tenté d'afficher le resultat de keywords mais j'ai une erreur sur l'utilisation de foreache, je sais que celui-ci n'accepte en entrée que des tableau apparement, mais fgets ne sort pas de tableau, et l'utilisation de file(); ne fonctionne pas plus.

Merci de votre aide par avance
ArKam est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/04/2011, 15h28   #2
Membre expérimenté
 
Avatar de ArKam
 
Inscription : mars 2007
Messages : 505
Détails du profil
Informations personnelles :
Âge : 25

Informations forums :
Inscription : mars 2007
Messages : 505
Points : 511
Points : 511
Bien, pour infos j'ai contourné mon problème de façon plutôt barbare

mais j'ai encore un souci, à savoir que le fichier que je parse, contient des espaces et des retours à la lignes.

Le hic c'est que juste après, je fais un preg_split qui viens donc me splitter toutes les string contenues entre ces espaces (grâce à \s+) et donc, je me retrouve avec un tableau de ce type là:

Code :
1
2
3
4
5
6
7
8
 
Array(
[0]=>1300809100.513
[1]=>TCP_MISS/200
...
[9]=>application/x-jav
[10]=>ascript
)
au lieu de:
Code :
1
2
3
4
5
6
7
 
Array(
[0]=>1300809100.513
[1]=>TCP_MISS/200
...
[9]=>application/x-javascript
)
Sachant que ce n'est pas moi qui génère le fichier de log mais un logiciel tierce, je ne peux pas modifier la façon dont le fichier est crée.

Je ne sais pas trop comment éviter ce genre de soucis

PS: Pour ceux que ça interessent, voici comment j'ai fais pour le foreach:

Code :
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
 
<?php
 
function logsparsing(){
 
	// Déclaration du pattern preg_split //
 
$pattern = "/\s+/"; //On recherche les espaces dans la chaine soumise.//
 
	// Ouverture du fichier de log	//
 
$access_log = "/srv/www/lisquid/content/access.log"; //fichier à lire //
 
if (is_readable($access_log)) { //test du fichier, possible à ouvrir ou pas.//
echo "File is readable!"."<br>";
$readlog = fopen($access_log,"r+"); //On ouvre le fichier et on met le pointeur de fichier dans une variable.//
 
	while (!feof($readlog)) //Boucle jusqu'à l'arrivé en fin de fichier.//
	{
		$linesreadlog = array(fgets($readlog));// On lit le fichier en déplaceant le pointeur ligne par ligne tout en mettant la valeur du pointeur en tableau.//
		foreach($linesreadlog as $linereaded) {
			$keywords = preg_split($pattern,$linereaded,0,PREG_SPLIT_NO_EMPTY);
			print_r($keywords);
			echo "<p></p>";
		}
	}
 
} 
 
else {
	echo "Error - The file can't be read.";	
}
 
}
 
logsparsing();
 
?>
ArKam est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/04/2011, 15h34   #3
Modérateur
 
Avatar de Benjamin Delespierre
 
Benjamin Delespierre
Développeur Web
Inscription : février 2010
Messages : 2 984
Détails du profil
Informations personnelles :
Nom : Benjamin Delespierre
Âge : 24
Localisation : France

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : février 2010
Messages : 2 984
Points : 5 016
Points : 5 016
Voici une solution plus simple:

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 
<?php
 
$stmt = $pdo->prepare('INSERT INTO table (a,b,c) VALUES (:a,:b,:c)');
$res = array();
 
$file = new SplFileObject("mon_fichier.txt","r");
$file->setFlags(SplFileObject::READ_CSV);
$file->setCsvControl(' ');
foreach ($file as $line) {
	list($a,$b,$c) = $line;
	$res[] = $stmt->execute(':a' => $a, ':b' => $b, ':c' => $c);
}
 
echo "Success : " . count(array_keys($res, true, true));
echo "Failures : " . count(array_keys($res, false, true));
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom
Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même).

Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...".
Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug.

Les boutons et existent, servez-vous en
Benjamin Delespierre est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/04/2011, 16h17   #4
Membre expérimenté
 
Avatar de ArKam
 
Inscription : mars 2007
Messages : 505
Détails du profil
Informations personnelles :
Âge : 25

Informations forums :
Inscription : mars 2007
Messages : 505
Points : 511
Points : 511
Merci de ton aide,

Donc si je comprend bien ton exemple, je créer un nouvel objet de gestion de fichier que tu nomme $file et auquel tu défini des propriétés:

Lire le fichier en tant que CSVFile.
Le caractère de séparation étant l'espace.

Ensuite, je ne comprend pas pourquoi tu utilise liste au lieu de array?

Pareil, pourquoi je ne trouve pas les fonctions suivantes chez php.net?

Execute(); et Prepare();

Merci de ton aide en tous cas.

EDIT: OK donc de ce que j'ai trouvé exec() et prepare() sont des méthodes de la classe PDOStatement? c'est bien ça?

Dans ce cas, n'aurais-tu pas oublié un $kekchose = new pdo($dsn,$username...);?
ArKam est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/04/2011, 16h52   #5
Modérateur
 
Avatar de Benjamin Delespierre
 
Benjamin Delespierre
Développeur Web
Inscription : février 2010
Messages : 2 984
Détails du profil
Informations personnelles :
Nom : Benjamin Delespierre
Âge : 24
Localisation : France

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : février 2010
Messages : 2 984
Points : 5 016
Points : 5 016
L'instruction "list" permet de setter plusieurs variables à la fois en utilisant un tableau, chaque offset du tableau est mis dans la variable de même position dans la liste.
Voir: http://php.net/manual/en/function.list.php

execute et prepare font ici référence aux méthodes PDOStatement::execute et PDO::prepare de PDO. Cela permet de créer une requête préparée au niveau de mysql afin de dissocier les traitements des données (sécurité) et d'accélérer les transferts en n'envoyant au travers d'execute uniquement les données utiles et non pas la requête entière.
Voir: http://julp.developpez.com/php/pdo/#sommaire
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom
Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même).

Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...".
Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug.

Les boutons et existent, servez-vous en
Benjamin Delespierre est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/04/2011, 17h26   #6
Membre expérimenté
 
Avatar de ArKam
 
Inscription : mars 2007
Messages : 505
Détails du profil
Informations personnelles :
Âge : 25

Informations forums :
Inscription : mars 2007
Messages : 505
Points : 511
Points : 511
Merci à toi pour les infos, je vais bûcher ça

En fait, je ne savais pas que comme pour les fonctions, php fournissait des classes internes au language.

Je vais regarder un peu plus, c'est dommage que comme pour la function_list ils ne fournissent pas une Classes_list pour la recherche.

Sinon, concernant ma question de création de ton objet PDO?
Pour rappel:
Citation:
exec() et prepare() sont des méthodes de la classe PDOStatement? c'est bien ça?

Dans ce cas, n'aurais-tu pas oublié un $kekchose = new pdo($dsn,$username...);?
Bref, beaucoup d'infos aujourd'hui, je vais voir pour assimiler ça, tester sur mon script et revenir vers toi dans la semaine si je bloque
ArKam est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/04/2011, 17h41   #7
Modérateur
 
Avatar de Benjamin Delespierre
 
Benjamin Delespierre
Développeur Web
Inscription : février 2010
Messages : 2 984
Détails du profil
Informations personnelles :
Nom : Benjamin Delespierre
Âge : 24
Localisation : France

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : février 2010
Messages : 2 984
Points : 5 016
Points : 5 016
Si, tu as la documentation des classes du langages:
- SPL: http://www.php.net/manual/en/book.spl.php (FileObject en fait partie)
- PDO: http://www.php.net/manual/en/book.pdo.php

Citation:
Dans ce cas, n'aurais-tu pas oublié un $kekchose = new pdo($dsn,$username...);?
Mon exemple n'est certes pas complet.

Voici comment instancier un PDO:
Code :
1
2
3
4
5
6
7
8
 
$db = "backoffice";
$db_type = "mysql";
$db_user = "root";
$db_password = "";
$db_host = "localhost";
 
$pdo = new PDO("$db_type:dbname=$db;host=$db_host", $db_user, $db_password);
Par exemple. On mets généralement l'instance unique de PDO dans un Singleton, une recherche sur le forum te donnera nombre de tutos sur la question.
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom
Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même).

Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...".
Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug.

Les boutons et existent, servez-vous en
Benjamin Delespierre est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/04/2011, 12h36   #8
Membre expérimenté
 
Avatar de ArKam
 
Inscription : mars 2007
Messages : 505
Détails du profil
Informations personnelles :
Âge : 25

Informations forums :
Inscription : mars 2007
Messages : 505
Points : 511
Points : 511
Donc, j'ai travaillé sur ce que tu m'as donné, mais j'ai encore un petit souci.

Voici mon code:
Code :
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
 
<?php
	// - LOG PROCESSING AND DATABASE PROVISIONING - //
 
function logparse() {
 
	// - LOGFILE PARSING AND PROCESSING - //
$squidlogfile = "/srv/www/squid/content/access.log";
 
switch (is_readable($squidlogfile)) {
 
	case true:
			$parsedfile = new SplFileObject("$squidlogfile","r");
			$parsedfile->setFlags(SplFileObject::READ_CSV);
			$parsedfile->setFlags(SplFileObject::SKIP_EMPTY);
			$parsedfile->setCsvControl(' ');
				while(!$parsedfile->eof()){
					print_r ($parsedfile->fgetcsv());
				}
			break;
 
	case false:
			echo "the file $squidlogfile is not readable:"."<br>";
			break;
}
 
}
 
logparse();
 
?>
En gros, l'objet fait bien ce que je lui demande, à une exception prés:

Je veux que SplFileObject m’enlève tous les espaces afin de ne récupérer que les strings qui m’intéresses.

Hors la, il fait bien le job pour le premier espace, mais pas pour les suivants.
C'est à dire que lorsqu'il trouve une tabulation horizontale ou plusieurs espaces l'un après l'autres, il me met ces espaces dans le tableau résultant, ce qui n'est pas correct.

Voici ce que j'obtiens:
Code :
1
2
3
4
5
6
7
8
9
 
Array ( 
[0] => 1300809100.513 
[1] => 
[2] => 
[3] => 1057 
[4] =>
...
[n] => espace ou string
et Voici ce que je veux obtenir:
Code :
1
2
3
4
5
6
 
Array (
[0] => 1300809100.513 
[3] => 1057 
...
[n]=>String uniquement.
Je me demande si on peux passer des regex à la méthode setCsvControl de l'objet créer?

A savoir qu'avec la fonction preg_split quand je lui passe l'argument PREG_SPLIT_NO_EMPTY il vire les espaces et tout autres valeurs vide.

C'est possible de faire pareil?
ArKam est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/04/2011, 16h17   #9
Modérateur
 
Avatar de Benjamin Delespierre
 
Benjamin Delespierre
Développeur Web
Inscription : février 2010
Messages : 2 984
Détails du profil
Informations personnelles :
Nom : Benjamin Delespierre
Âge : 24
Localisation : France

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : février 2010
Messages : 2 984
Points : 5 016
Points : 5 016
Tu vas devoir extraire les données à la main.

Tu peux faire comme ça je pense:
Code :
1
2
3
4
5
6
 
$parsedfile = new SplFileObject((string)$squidlogfile,"r");
$parsedfile->setFlags(SplFileObject::SKIP_EMPTY);
while(!$parsedfile->eof()){
  var_dump(preg_split('#[[:space:]]+#', trim($parsedfile->fgets()));
}
Dommage que tu n'aies pas pu utiliser le contrôle CSV.
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom
Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même).

Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...".
Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug.

Les boutons et existent, servez-vous en
Benjamin Delespierre est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/04/2011, 16h34   #10
Membre expérimenté
 
Avatar de ArKam
 
Inscription : mars 2007
Messages : 505
Détails du profil
Informations personnelles :
Âge : 25

Informations forums :
Inscription : mars 2007
Messages : 505
Points : 511
Points : 511
Benjamin, merci de ton aide sur ce problème.

Entre temps, j'ai un peu avancé, mais je bloque maintenant avec la fonction list() qui me sort des données assez invraisemblables.

Code :
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
 
<?php
	// - LOG PROCESSING AND DATABASE PROVISIONING - //
 
function logparse() {
 
	// - DATABASE CONNECTION AND PROVISIONING - //
$squiddbconf="/srv/www/squid/config/squidconf.ini";
$db_conf = parse_ini_file($squiddbconf);
$db_driver = $db_conf['db_driver'];
$db_host = $db_conf['db_host'];
$db_port = $db_conf['db_port'];
$db_name = $db_conf['db_name'];
$db_user = $db_conf['db_user'];
$db_password = $db_conf['db_password'];
$db_source = "$db_driver".":"."$db_host".";"."$db_name";
$db_table = 'access_log';
$db_insert = "INSERT INTO $db_table (timestamp,elapsed,client,action,size,method,url,ident,hierarchy,content) VALUES ($timestamp,$duration,$client,$result_code,$size,$request_method,$url,$ident_lookup,$hierarchy_code,$type)";
 
$db_object = new PDO($db_source, $db_user, $db_password);
 
switch (is_readable($squiddbconf)) {
 
	case true:
			echo "This file is readable"."<br>";
			echo "$db_source";
			break;
 
	case false:
			echo "this file is not readable:"."<br>";
			break;
}
 
	// - LOGFILE PARSING AND PROCESSING - //
$squidlogfile = "/srv/www/squid/content/access.log";
$pattern = "/\s+/";
 
switch (is_readable($squidlogfile)) {
 
	case true:
			$parsedfile = new SplFileObject("$squidlogfile","r");
				while(!$parsedfile->eof()){
					$lineread = $parsedfile->fgets();
					$linesplit = preg_split($pattern,$lineread,10,PREG_SPLIT_NO_EMPTY);
						foreach ($linesplit as $index){
							list($timestamp,$duration,$client,$result_code,$size,$request_method,$url,$ident_lookup,$hierarchy_code,$type) = $index;
							print_r($timestamp);
						}
				}
			break;
 
	case false:
			echo "the file $squidlogfile is not readable:"."<br>";
			break;
}
 
}
 
logparse();
 
?>
Normalement ma fonction print_r($timestamp);
devrait me sortir quelque chose comme:

Citation:
1300809100.513
1300809106.445
sans les retours à la ligne of course.
Par contre moi là j'ai un bon gros charabia de ce style:

Citation:
111T1Gh-Hi121T1Gh-Hi101T2Gh-Ht111T3Gh-Ht131T3Gh-Ht131T3Gh-Ht151T2Gh-Hi151T5Gh-Ht101T7Gh-Ha111T1Gh-Hi121T6Gh-Ht141T9Gh-Ht191T7Gh-Ht181T2Gh-Ht101T2Gh-Ha141T3Gh-Hi101T7Gh-Hi101T2Gh-Ha
sur une seul ligne bien entendu

Donc, je ne comprend pas ce qu'il se passe avec la fonction list.
J'ai beau regarder la doc php et faire des test sur du code simple, je n'obtient pas le résultat attendu.

ArKam est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/04/2011, 16h46   #11
Modérateur
 
Avatar de Benjamin Delespierre
 
Benjamin Delespierre
Développeur Web
Inscription : février 2010
Messages : 2 984
Détails du profil
Informations personnelles :
Nom : Benjamin Delespierre
Âge : 24
Localisation : France

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : février 2010
Messages : 2 984
Points : 5 016
Points : 5 016
Encore une fois list n'est pas une fonction mais un mot clé comme array par exemple, c'est d'ailleurs son pendant

Pour pouvoir répondre à ta question j'aurais besoin que tu me mettes un var_dump de la variable $index dans ton foreach.

Ce qui m'étonne c'est que tu mettes ce foreach dans la bouche while, je peux voir un extrait du log squid stp ?
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom
Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même).

Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...".
Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug.

Les boutons et existent, servez-vous en
Benjamin Delespierre est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/04/2011, 17h23   #12
Membre expérimenté
 
Avatar de ArKam
 
Inscription : mars 2007
Messages : 505
Détails du profil
Informations personnelles :
Âge : 25

Informations forums :
Inscription : mars 2007
Messages : 505
Points : 511
Points : 511
Bon, je crois que je vais devenir dingue, lorsque je sort un var_dump de $index, dans la boucle foreach, que ce soit avant ou bien après le mot clé list(), j'ai bien un resultat cohérent avec ce que j'attend, à savoir:
Code :
1
2
 
string(14) "1300809100.513" string(4) "1057" string(14) "192.168.221.63" string(12) "TCP_MISS/200" string(5) "14454" string(3) "GET" string(66) "http://www2.mediadirect.ro/widgets/thumb-realitatea/thumbnail.jpg?" string(1) "-" string(25) "HIER_DIRECT/178.21.120.30" string(11) "image/jpeg " string(14) "1300809106.445" string(3) "243" string(14) "192.168.221.63" string(12) "TCP_MISS/200" string(5) "14454" string(3) "GET" string(66) "http://www2.mediadirect.ro/widgets/thumb-realitatea/thumbnail.jpg?" string(1) "-" string(25) "HIER_DIRECT/178.21.120.30" string(11) "image/jpeg " string(14) "1300809420.089" string(1) "0" string(14) "192.168.221.63" string(15) "TCP_MEM_HIT/200" string(3) "289" string(3) "GET" string(38) "http://stats.hvsdigital.com/stats.htm?" string(1) "-" string(11) "HIER_NONE/-" string(10) "text/html " string(14) "1300890256.825" string(3) "101" string(14) "192.168.221.66" string(12) "TCP_MISS/503" string(4) "3118" string(3) "GET" string(17) "http://10.30.2.3/" string(1) "-" string(21) "HIER_DIRECT/10.30.2.3" string(10) "text/html " string(14) "1300896123.297" string(2) "34" string(14) "192.168.221.66" string(12) "TCP_MISS/204" string(3) "307" string(3) "GET" string(25) "http://www.google.fr/csi?" string(1) "-" string(25) "HIER_DIRECT/74.125.230.82" string(10) "text/html " string(14) "1300896512.713" string(2) "34" string(14) "192.168.221.66" string(26) "TCP_REFRESH_UNMODIFIED/304" string(3) "384" string(3) "GET" string(39) "http://www.lemonde.fr/expedia/proxy.xml" string(1) "-" string(24) "HIER_DIRECT/77.67.20.145" string(9) "text/xml " string(14) "1300896513.232" string(3) "500" string(14) "192.168.221.66" string(24) "TCP_REFRESH_MODIFIED/200" string(5) "26048" string(3) "GET" string(44) "http://www.sytadin.fr/raster/segment_IDF.gif" string(1) "-" string(25) "HIER_DIRECT/83.206.157.61" string(10) "image/gif " string(14) "1300899468.217" string(3) "542" string(14) "192.168.221.66" string(12) "TCP_MISS/301" string(3) "579" string(3) "GET" string(45) "http://whatismyip.com/images/changeyourip.gif" string(1) "-" string(25) "HIER_DIRECT/72.233.89.198" string(10) "text/html " string(14) "1300955283.478" string(1) "0" string(14) "192.168.221.66" string(15) "TCP_MEM_HIT/200" string(3) "715" string(3) "GET" string(43) "http://wwwstatic.megavideo.com/ad_image.swf" string(1) "-" string(11) "HIER_NONE/-" string(30) "application/x-shockwave-flash " string(14) "1300955319.774" string(4) "1922" string(14) "192.168.221.66" string(12) "TCP_MISS/206" string(6) "114821" string(3) "GET" string(60) "http://www.kazeo.com/sites/fr/photos/185/photo-1857394-L.jpg" string(1) "-" string(25) "HIER_DIRECT/195.60.188.31" string(11) "image/jpeg " string(14) "1300955659.648" string(2) "28" string(14) "192.168.221.66" string(12) "TCP_MISS/404" string(3) "624" string(3) "GET" string(66) "http://www.unixgarden.com/wp-content/themes/unixgarden_v2/lexus.js" string(1) "-" string(24) "HIER_DIRECT/94.23.37.165" string(10) "text/html " string(14) "1300957746.461" string(2) "41" string(14) "192.168.221.66" string(27) "TCP_CLIENT_REFRESH_MISS/200" string(3) "914" string(3) "GET" string(53) "http://novavision.studio.free.fr/unicore/css/body.css" string(1) "-" string(25) "HIER_DIRECT/212.27.63.149" string(9) "text/css " string(14) "1300960389.783" string(2) "93" string(14) "192.168.221.83" string(12) "TCP_MISS/301" string(3) "701" string(3) "GET" string(20) "http://www.yahoo.fr/" string(1) "-" string(26) "HIER_DIRECT/77.238.178.122" string(10) "text/html " string(14) "1300960390.625" string(1) "8" string(14) "192.168.221.83" string(15) "TCP_MEM_HIT/200" string(5) "27623" string(3) "GET" string(26) "http://l.yimg.com/a/combo?" string(1) "-" string(11) "HIER_NONE/-" string(9) "text/css " string(14) "1300960601.607" string(1) "0" string(14) "192.168.221.77" string(15) "TCP_IMS_HIT/304" string(3) "251" string(3) "GET" string(77) "http://mobile.orange.fr/content/ge/high/v2_javascript/nav_boutiques_orange.js" string(1) "-" string(11) "HIER_NONE/-" string(25) "application/x-javascript " string(14) "1300961990.279" string(2) "43" string(14) "192.168.221.63" string(12) "TCP_MISS/200" string(4) "3058" string(3) "GET" string(78) "http://s1.lemde.fr/medias/www/1.2.416/img/partenaires/lepost/le_post_71x17.png" string(1) "-" string(24) "HIER_DIRECT/94.127.72.80" string(10) "image/png " string(14) "1300961990.951" string(1) "0" string(14) "192.168.221.63" string(11) "TCP_HIT/200" string(3) "732" string(3) "GET" string(131) "http://a1692.g.akamai.net/n/1692/2042/1077898746/pubs.lemonde.fr/RealMedia/ads/Creatives/OasDefault/publicite/titleBar_pub330_4.gif" string(1) "-" string(11) "HIER_NONE/-" string(10) "image/gif " string(14) "1300962680.554" string(1) "0" string(14) "192.168.221.63" string(15) "TCP_IMS_HIT/304" string(3) "253" string(3) "GET" string(50) "http://www.lemonde.fr/services/services_abonnes.js" string(1) "-" string(11) "HIER_NONE/-" string(25) "application/x-javascript "
Pour ce qui est des logs squid:

Code :
1
2
3
4
5
6
7
8
9
10
11
 
1300809100.513   1057 192.168.221.63 TCP_MISS/200 14454 GET http://www2.mediadirect.ro/widgets/thumb-realitatea/thumbnail.jpg? - HIER_DIRECT/178.21.120.30 image/jpeg
1300809106.445    243 192.168.221.63 TCP_MISS/200 14454 GET http://www2.mediadirect.ro/widgets/thumb-realitatea/thumbnail.jpg? - HIER_DIRECT/178.21.120.30 image/jpeg
1300809420.089      0 192.168.221.63 TCP_MEM_HIT/200 289 GET http://stats.hvsdigital.com/stats.htm? - HIER_NONE/- text/html
1300890256.825    101 192.168.221.66 TCP_MISS/503 3118 GET http://10.30.2.3/ - HIER_DIRECT/10.30.2.3 text/html
1300896123.297     34 192.168.221.66 TCP_MISS/204 307 GET http://www.google.fr/csi? - HIER_DIRECT/74.125.230.82 text/html
1300896512.713     34 192.168.221.66 TCP_REFRESH_UNMODIFIED/304 384 GET http://www.lemonde.fr/expedia/proxy.xml - HIER_DIRECT/77.67.20.145 text/xml
1300896513.232    500 192.168.221.66 TCP_REFRESH_MODIFIED/200 26048 GET http://www.sytadin.fr/raster/segment_IDF.gif - HIER_DIRECT/83.206.157.61 image/gif
1300899468.217    542 192.168.221.66 TCP_MISS/301 579 GET http://whatismyip.com/images/changeyourip.gif - HIER_DIRECT/72.233.89.198 text/html
1300955283.478      0 192.168.221.66 TCP_MEM_HIT/200 715 GET http://wwwstatic.megavideo.com/ad_image.swf - HIER_NONE/- application/x-shockwave-flash
1300955319.774   1922 192.168.221.66 TCP_MISS/206 114821 GET http://www.kazeo.com/sites/fr/photos/185/photo-1857394-L.jpg - HIER_DIRECT/195.60.188.31 image/jpeg
voici ce qui se répète dans le fichier, sur 280Mo
ArKam est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/04/2011, 09h38   #13
Modérateur
 
Avatar de Benjamin Delespierre
 
Benjamin Delespierre
Développeur Web
Inscription : février 2010
Messages : 2 984
Détails du profil
Informations personnelles :
Nom : Benjamin Delespierre
Âge : 24
Localisation : France

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : février 2010
Messages : 2 984
Points : 5 016
Points : 5 016
Là y'a quelque chose qui m'échape. Essaie un bon vieux var_dump($index[0]); histoire de rire.
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom
Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même).

Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...".
Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug.

Les boutons et existent, servez-vous en
Benjamin Delespierre est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/04/2011, 09h48   #14
Membre expérimenté
 
Avatar de ArKam
 
Inscription : mars 2007
Messages : 505
Détails du profil
Informations personnelles :
Âge : 25

Informations forums :
Inscription : mars 2007
Messages : 505
Points : 511
Points : 511
Je viens de faire le var_dump et voici le résultat:

Code :
1
2
 
string(1) "1" string(1) "1" string(1) "1" string(1) "T" string(1) "1" string(1) "G" string(1) "h" string(1) "-" string(1) "H" string(1) "i" string(1) "1" string(1) "2" string(1) "1" string(1) "T" string(1) "1" string(1) "G" string(1) "h" string(1) "-" string(1) "H" string(1) "i" string(1) "1" string(1) "0" string(1) "1" string(1) "T" string(1) "2" string(1) "G" string(1) "h" string(1) "-" string(1) "H" string(1) "t" string(1) "1" string(1) "1" string(1) "1" string(1) "T" string(1) "3" string(1) "G" string(1) "h" string(1) "-" string(1) "H" string(1) "t" string(1) "1" string(1) "3" string(1) "1" string(1) "T" string(1) "3" string(1) "G" string(1) "h" string(1) "-" string(1) "H" string(1) "t" string(1) "1" string(1) "3" string(1) "1" string(1) "T" string(1) "3" string(1) "G" string(1) "h" string(1) "-" string(1) "H" string(1) "t" string(1) "1" string(1) "5" string(1) "1" string(1) "T" string(1) "2" string(1) "G" string(1) "h" string(1) "-" string(1) "H" string(1) "i" string(1) "1" string(1) "5" string(1) "1" string(1) "T" string(1) "5" string(1) "G" string(1) "h" string(1) "-" string(1) "H" string(1) "t" string(1) "1" string(1) "0" string(1) "1" string(1) "T" string(1) "7" string(1) "G" string(1) "h" string(1) "-" string(1) "H" string(1) "a" string(1) "1" string(1) "1" string(1) "1" string(1) "T" string(1) "1" string(1) "G" string(1) "h" string(1) "-" string(1) "H" string(1) "i" string(1) "1" string(1) "2" string(1) "1" string(1) "T" string(1) "6" string(1) "G" string(1) "h" string(1) "-" string(1) "H" string(1) "t" string(1) "1" string(1) "4" string(1) "1" string(1) "T" string(1) "9" string(1) "G" string(1) "h" string(1) "-" string(1) "H" string(1) "t" string(1) "1" string(1) "9" string(1) "1" string(1) "T" string(1) "7" string(1) "G" string(1) "h" string(1) "-" string(1) "H" string(1) "t" string(1) "1" string(1) "8" string(1) "1" string(1) "T" string(1) "2" string(1) "G" string(1) "h" string(1) "-" string(1) "H" string(1) "t" string(1) "1" string(1) "0" string(1) "1" string(1) "T" string(1) "2" string(1) "G" string(1) "h" string(1) "-" string(1) "H" string(1) "a" string(1) "1" string(1) "4" string(1) "1" string(1) "T" string(1) "3" string(1) "G" string(1) "h" string(1) "-" string(1) "H" string(1) "i" string(1) "1" string(1) "0" string(1) "1" string(1) "T" string(1) "7" string(1) "G" string(1) "h" string(1) "-" string(1) "H" string(1) "i" string(1) "1" string(1) "0" string(1) "1" string(1) "T" string(1) "2" string(1) "G" string(1) "h" string(1) "-" string(1) "H" string(1) "a"
C'est drôle parce que ce sont exactement les valeurs de $timestamp, mais par contre, je ne sais absolument pas d'ou il prend ces valeurs Oo.

Enfin si, ce sont des morceaux de la string splité, mais l'indexage est étrange, il ne prend en index 0 que le premier octet de chaque string.

Genre pour les deux premieres entrées:

Code :
1
2
3
4
5
6
 
string(1)300809100.513   string(1)057 192.168.221.63 string(T)CP_MISS/200 string(1)4454 string(G)ET string(h)ttp://www2.mediadirect.ro/widgets/thumb-realitatea/thumbnail.jpg? string(-) string(H)IER_DIRECT/178.21.120.30 string(i)mage/jpeg
 
&
 
string(1)300809106.445    string(2)43 string(1)92.168.221.63 string(T)CP_MISS/200 string(1)4454 string(G)ET string(h)ttp://www2.mediadirect.ro/widgets/thumb-realitatea/thumbnail.jpg? string(-) string(H)IER_DIRECT/178.21.120.30 string(i)mage/jpeg
C'est ... étrange, il me semble qu'il y'a trop de tableau de sortie en fait.
ArKam est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/04/2011, 10h21   #15
Membre expérimenté
 
Avatar de ArKam
 
Inscription : mars 2007
Messages : 505
Détails du profil
Informations personnelles :
Âge : 25

Informations forums :
Inscription : mars 2007
Messages : 505
Points : 511
Points : 511
OK ALLELUIA, j'ai trouvé

En fait, le foreach est de trop, en effet, le while traite déjà ligne par ligne et genere un tableau de type:

C'est donc sur ce tableau que je doit traiter les index, et comme je suis déjà dans une boucle, le foreach est inutile car sinon il index l'index du premier tableau d'ou les sortie uniquement sur les premières string de chaque partie.

Je sais pas si je suis trés clair sur l'explication XD

Donc maintenant j'ai un code bien plus propre:

Code :
1
2
3
4
5
6
7
 
			$parsedfile = new SplFileObject("$squidlogfile","r");
				while(!$parsedfile->eof()){
					$lineread = $parsedfile->fgets();
					$linesplit = preg_split($pattern,$lineread,10,PREG_SPLIT_NO_EMPTY); //Est-un tableau contenant le fichier parsé ex [0]=>1353315988.513 & [1]=>1057 etc.
					list($timestamp,$duration,$client_address,$result_codes,$size,$request_method,$url,$ident_lookup,$hierarchy_code,$type) = $linesplit;
				}
Et là, j'ai bien les valeurs attendue correct dans chaque variables de List().

Maintenant, je m'attaque à la partie, envoie en BDD, je ne clôt donc pas tout de suite le sujet.

Je clôturerais dés que j'aurais fini complètement, ça donnera un exemple de parsing et envoie des données.

Un GRAND merci pour ton aide Benjamin.
ArKam est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/04/2011, 12h52   #16
Membre expérimenté
 
Avatar de ArKam
 
Inscription : mars 2007
Messages : 505
Détails du profil
Informations personnelles :
Âge : 25

Informations forums :
Inscription : mars 2007
Messages : 505
Points : 511
Points : 511
Bon bah comme fallait bien finir par une petite erreur.

Tous mon script semble fonctionner, MAIS rien n'arrive en BDD.
Si je test les exceptions renvoyées WALOU, j'ai pas une seul erreur retourné.

J'ai comme l'impression que j'ai manqué quelque chose.

Voici le contenu d'un var_dump de mon objet:

Code :
1
2
 
object(PDOStatement)#2 (1) { ["queryString"]=> string(218) "INSERT INTO access_log (timestamp,elapsed,client,action,size,method,url,ident,hierarchy,content) VALUES (:timestamp,:duration,:client_address,:result_code,:size,:request_method,:url,:ident_lookup,:hierarchy_code,:type)" }
Voici mon code:

Code :
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
 
function logparse() {
 
	// - DATABASE INFOTMATIONS - //
$squiddbconf="/srv/www/squid/config/squidconf.ini";
switch (is_readable($squiddbconf)) {
 
	case true:
			$db_conf = parse_ini_file($squiddbconf);
			$db_driver = $db_conf['db_driver'];
			$db_host = $db_conf['db_host'];
			$db_port = $db_conf['db_port'];
			$db_name = $db_conf['db_name'];
			$db_user = $db_conf['db_user'];
			$db_password = $db_conf['db_password'];
			$db_source = "$db_driver".":"."$db_host".";"."$db_name";
			$db_table = 'access_log';
			$db_insert = "INSERT INTO $db_table (timestamp,elapsed,client,action,size,method,url,ident,hierarchy,content) VALUES (:timestamp,:duration,:client_address,:result_code,:size,:request_method,:url,:ident_lookup,:hierarchy_code,:type)";
			break;
 
	case false:
			echo "this file is not readable:"."<br>";
			break;
}
 
	// - LOGFILE PARSING AND PROCESSING - //
$squidlogfile = "/srv/www/lisquid/content/access.log";
$pattern = "/\s+/";
 
switch (is_readable($squidlogfile)) {
 
	case true:
		try{
    		$db_object = new PDO($db_source, $db_user, $db_password);
			$db_request = $db_object->prepare($db_insert);
		}catch(PDOException $error){
			echo 'Exception PDO Reçue: ', $error->getMessage(), "\n";
		}
			$parsedfile = new SplFileObject("$squidlogfile","r");
 
				while(!$parsedfile->eof()){
					$lineread = $parsedfile->fgets();
					$linesplit = preg_split($pattern,$lineread,10,PREG_SPLIT_NO_EMPTY); //Est-un tableau contenant le fichier parsé ex [0]=>1353315988.513 & [1]=>1057 etc.
 
					list($timestamp,$duration,$client_address,$result_codes,$size,$request_method,$url,$ident_lookup,$hierarchy_code,$type) = $linesplit;
 
					$db_request->bindParam(':timestamp',$timestamp);
					$db_request->bindParam(':duration',$duration);
					$db_request->bindParam(':client_address',$client_address);
					$db_request->bindParam(':result_code',$result_code);				
					$db_request->bindParam(':size',$size);				
					$db_request->bindParam(':request_method',$request_method);
					$db_request->bindParam(':url',$url);
					$db_request->bindParam(':ident_lookup',$ident_lookup);
					$db_request->bindParam(':hierarchy_code',$hierarchy_code);
					$db_request->bindParam(':type',$type);
					$db_request->execute();
					var_dump($db_request);
				}
			break;
 
	case false:
			echo "the file $squidlogfile is not readable:"."<br>";
			break;
}
}
J'ai pourtant l'impression que le code est clair et précis non?

Merci de ton aide par avance.
ArKam est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/04/2011, 13h15   #17
Modérateur
 
Avatar de Benjamin Delespierre
 
Benjamin Delespierre
Développeur Web
Inscription : février 2010
Messages : 2 984
Détails du profil
Informations personnelles :
Nom : Benjamin Delespierre
Âge : 24
Localisation : France

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : février 2010
Messages : 2 984
Points : 5 016
Points : 5 016
Citation:
Envoyé par Benjamin Delespierre Voir le message
Ce qui m'étonne c'est que tu mettes ce foreach dans la bouche while...
Je l'avais même pas mentionné

Pour ton erreur d'insertion, sache que PDOStatement ne lève pas d'exception lors de l'execution, il renvoie un status booléen. Je te recommande de procéder comme suit:
Code :
1
2
3
4
5
6
7
8
 
if ($db_request->execute()) {
  echo "Line inserted<br />"; // ton message ici
}
else {
  $err = $db_object->errorInfo();
  die("-- Erreur SQL: {$err[2]} with code {$err[1]} on query [{$db_request->query_string}]");
}
Tu auras des messages d'erreur plus parlants
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom
Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même).

Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...".
Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug.

Les boutons et existent, servez-vous en
Benjamin Delespierre est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/04/2011, 14h21   #18
Membre expérimenté
 
Avatar de ArKam
 
Inscription : mars 2007
Messages : 505
Détails du profil
Informations personnelles :
Âge : 25

Informations forums :
Inscription : mars 2007
Messages : 505
Points : 511
Points : 511
Mea culpa.
Oui en effet tu l'avais dit mais je sais pas pourquoi, je voulais à tout prix retraiter les données alors qu'elles étaient déjà traitées.

Pour ce qui est des retours d'erreurs j'utilise errorInfo et errorCode parce que errorInfo me fournis un code de retour qui signifie SQLState error, qui ici correspond à:

3D000 = NO_DB_ERROR = Je suis un boulet, j'ai pas sélectionné la base à inscrire :s

Je reviens vers toi une fois que j'ai résolu mon souci

Par contre, les Objets PHP sont ... étranges pour moi.
J'ai pas l'habitude des objets, même en C++ je fais beaucoup de procédurale et très peu d'objet.

Par contre, je dois reconnaître que c'est super efficace, et la syntaxe est plus jolie (Je sais, c'est pas la considération la plus importante, mais quand même XD).
ArKam est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/04/2011, 14h58   #19
Modérateur
 
Avatar de Benjamin Delespierre
 
Benjamin Delespierre
Développeur Web
Inscription : février 2010
Messages : 2 984
Détails du profil
Informations personnelles :
Nom : Benjamin Delespierre
Âge : 24
Localisation : France

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : février 2010
Messages : 2 984
Points : 5 016
Points : 5 016
Le paradigme objet apporte bien plus que la beauté du code ça apporte surtout la généricité, le polymorphisme, l'encapsulation et l'héritage.
A mon sens, seule la version 5.3 de PHP propose un support de l'objet digne de ce nom.

Je te recommande vivement de lire quelques articles sur la question (il y en a un paquet sur developper.com). Mais avant tout, assure-toi de bien connaitre le principe de base. Si tu as des soucis, tu peux toujours poser tes questions sur le forum

Si ça peux t'aider, tu as un cas d'héritage / composition dans ces classes (et puis ce package pourra peut être te servir): http://www.developpez.net/forums/d10...s/#post5894017
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom
Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même).

Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...".
Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug.

Les boutons et existent, servez-vous en
Benjamin Delespierre est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 07/04/2011, 12h30   #20
Membre expérimenté
 
Avatar de ArKam
 
Inscription : mars 2007
Messages : 505
Détails du profil
Informations personnelles :
Âge : 25

Informations forums :
Inscription : mars 2007
Messages : 505
Points : 511
Points : 511
Merci pour tes conseils et exemples.

Pour l'instant j'améliore mon script, à savoir que j'essaye de récupérer la valeur de ma dernière ligne (son numéro).

Ca OK j'y arrive avec :

Code :
1
2
3
4
5
6
7
8
9
10
11
 
<?php
$parsedfile = new SplFileObject("$squidlogfile","r");
			$parsedfile->setFlags(SplFileObject::SKIP_EMPTY);
				while(!$parsedfile->eof()){
					$parsedfile->next();
					$nblineRaw = $parsedfile->key();
				}
			$lastLine = $nblineRaw - 1;
			echo ("The last line of the file is: $lastLine"."<br>");
?>
Le -1 viens du fait que meme avec le flag SKIP_EMPTY ma derniere ligne est vide, alors que dans le fichier j'ai bien que des lignes pleine et la derniere ligne n'a pas de retour chariot ou autres retour à la ligne.

Par contre, une question me trotte dans la tête, est-ce que mon objet est détruit à la fin de la boucle while?

Parce que si je fait la chose suivante:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
 
$parsedfile = new SplFileObject("$squidlogfile","r");
$parsedfile->setFlags(SplFileObject::SKIP_EMPTY);
 
      while(!$parsedfile->eof()){
	    $parsedfile->next();
	    $nblineRaw = $parsedfile->key();
	}
 
$lastLine = $nblineRaw - 1;
echo ("The last line of the file is: $lastLine"."<br>");
 
      try{
	$parsedfile->rewind();
	}catch(RuntimeException $error){
	    echo 'Exception RuntimeExecution Reçue: ', $error->getMessage(), "\n";
	}
 
$parsedfile->seek($lastLine);
$currentLineContent = $parsedfile->fgets();
echo $currentLineContent;
J'ai un beau message m'avertissant que le script ne parviens pas à accéder au fichier, hors, en théorie il est déjà dedans non?

Maintenant j'ai comme l'intuition que mon objet est détruit à la fin du while, vue que celui-ci à lu tout le fichier jusqu'à la fin.
ArKam est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 05h10.


 
 
 
 
Partenaires

Hébergement Web