Aller au contenu
  • Pas encore inscrit ?

    Pourquoi ne pas vous inscrire ? C'est simple, rapide et gratuit.
    Pour en savoir plus, lisez Les avantages de l'inscription... et la Charte de Zébulon.
    De plus, les messages que vous postez en tant qu'invité restent invisibles tant qu'un modérateur ne les a pas validés. Inscrivez-vous, ce sera un gain de temps pour tout le monde, vous, les helpeurs et les modérateurs ! :wink:

Je galère sur un script php


Messages recommandés

Invité grenouille
Posté(e)

Hello,

 

J'ai besoin d'un coup de main !

 

Voilà sur quoi je bute :

 

$open=fopen("toto.txt","r");  //ouverture du fichier
while (!feof ($open))   // lecture jusqu'à la fin	  
{

$read = fgets($open, 4096); //stockage dans $read
$donne=explode("*",$read);  //parsing sur "*"

if (ereg("bla-bla",$donne))  //si bla-bla est inscrit dans le fichier, on ferme tout
fclose($open);
else {   //sinon on inscrit *bla-bla* dedans
$open2=fopen("toto.txt","a");
fwrite($open2,"*bla-bla*");

}
}

fclose($open);}   //fermeture


 

Le problème c'est si bla-bla est déjà inscrit dans le fichier, ça ne ferme pas et les bla-bla s'enfilent les uns derrière les autres :P

 

Comment fait-on pour que le fichier ferme si bla-bla est déjà inscrit dans le fichier et s'il n'y est pas, ben qu'il s'inscrive ?

 

THANKS

Posté(e)

<?
$trouve=false;

$open=fopen("toto.txt","r");  //ouverture du fichier
while ((!feof ($open))&&($trouve==false))   // lecture jusqu'à la fin	  
{

 $read = fgets($open, 4096); //stockage dans $read
 $donne=explode("*",$read);  //parsing sur "*"

 if (ereg("bla-bla",$donne[1]))  //si bla-bla est inscrit dans le fichier, on ferme tout
  $trouve=true;
 else {   //sinon on inscrit *bla-bla* dedans
$open2=fopen("toto.txt","a");
fwrite($open2,"*bla-bla*");
 }

}
fclose($open);
?>

 

et voili :P

 

Alors les erreurs:

$donne=explode("*",$read);

explode retourne un tableau de chaînes. Dans ton cas:

$donne[0]=*;

$donne[1]=bla-bla;

$donne[2]=*;

 

Deuxième erreur: ta boucle

tu parcours tant que le fichier n'est pas terminé. Hors, si tu trouves bla-bla, tu fermes le fichier, et ta boucle va continuer (vu que tu n'as tjrs pas trouvé la fin de ton fichier). D'où l'ajout d'un parametre $trouve dans ta boucle...

 

et la ca fonctionne :P

Posté(e)

Salut tout d'abord, il y a une erreur de syntaxe dans ton code : la } sur la dernière ligne, ensuite, le problème c'est que tu lis dans ton fichier en même temps que tu y écris et sans le refermer, ça peut poser des problèmes,

ensuite, pour la ligne :

 

$read = fgets($open, 4096); //stockage dans $read

 

la fonction fgets ne lit qu'une ligne du fichier, c'est à dire que si elle rencontre une fin de ligne ( \n ) avant la fin du fichier, ou bien avant le 4096ème octet, elle ne lit que cette ligne, je ne suis pas certains que ce soit ce que tu souhaites

 

autre chose, lorsque tu ouvres ton fichier pour y écrire, tu est en mode append ( "a" ) donc tout ce que tu écris se met à la fin du fichier, est-ce bien ce que tu souhaites ?

 

et enfin pour les lignes :

$donne=explode("*",$read); //parsing sur "*"

if (ereg("bla-bla",$donne))

 

la fonction explode() retourne un tableau ( array ) et la fonction ereg, attend une chaine ( string ) comme deuxième paramètre, si on lui fournit un tableau, elle ne recherche que sur la première ligne du tableau...

 

Je serais toi, je chargerais le fichier à modifier plutôt avec :

 

$fichier = file_get_contents("toto.txt");

pour lire me fichier entier vers une chaine

 

si tu n'utilise pas d'expression règulière dans ta recherche, il vaut mieux utiliser strpos()

 

Mais pour plus d'infos, tu devrais nous expliquer exactement ce que tu veux faire, et peut-être nous fournir un modèle fichier toto.txt avant traitement et un tel que tu souhaites qu'il soit après traitement :P

Invité grenouille
Posté(e)

Salut Tangui, mediaforest,

 

 

Wesh, pas facile le php quand même ! Surtout pour un codeur avec 5 jours d'expérience :P

 

J'ai rectifié les erreurs avec ton code Tangui et malheureusement il n'y a aucun changement : les données continuent de s'empiler :-(

 

Le mieux peut-être c'est que je vous livre le fichier en entier au cas où l'erreur viendrait d'ailleurs. ça ne me dérange pas puisque le code sera open-source de toute façon :P

 

En fait, c'est pour effectuer des statistiques sur un site...

 

Le voici :

 

<?php
$i = getenv("QUERY_STRING"); 
$fp = fopen("toto.txt","r"); 
while(!feof($fp)){ 
$ligne = fgets($fp,4096); 
$liste = explode(";",$ligne); 
} 
fclose($fp); 

$dr1= "Location:http://iportable.tuxfamily.org/dl/ClamWinPortable.exe";
$dr2= "Location:http://iportable.tuxfamily.org/dl/ScanWithSetup.exe";


$fp = fopen("toto.txt","w"); 
$cp1=$liste[0];
$cp2=$liste[1];
$cp3=$liste[2];
$cp4=$liste[3];

if ($i == 0) {
$cp1++; 
header($dr1);
}

if ($i == 1) {
$cp2++; 
header($dr2);
}

if ($i == 2) {
$cp3++; }

if ($i == 3) {
$cp4++; }

$variable=$cp1.";".$cp2.";".$cp3.";".$cp4;
fputs($fp,"$variable");

fclose($fp);


if ($i == 0) {

$trouve=false;

$ouvre=fopen("tata.txt","r");  
while ((!feof ($ouvre))&&($trouve==false))	   
{

 $lecture = fgets($ouvre, 4096); 
 $donnee=explode("*",$lecture);  

 if (ereg("$dr1",$donnee[1]))  
  $trouve=true;
 else {   
$open1=fopen("tata.txt","a");
fwrite($open1,"*$dr1*");
 }

}
fclose($ouvre);}


if ($i == 1) {

$trouve=false;

$ouvre=fopen("tata.txt","r");  
while ((!feof ($ouvre))&&($trouve==false))	   
{

 $lecture = fgets($ouvre, 4096); 
 $donnee=explode("*",$lecture);  

 if (ereg("$dr2",$donnee[2]))  
  $trouve=true;
 else {   
$open2=fopen("tata.txt","a");
fwrite($open2,"*$dr2*");
 }

}
fclose($ouvre);}


?>

 

Tout fonctionne excepté ce que je cherche à faire sur le fichier tata.txt.

 

En fait ce fichier php nécessite pour l'instant 2 fichiers : toto.txt et tata.txt

 

toto.txt comptabilise les clics ou téléchargements et tata.txt est censé répertorier les liens actionnés.

 

Vous pouvez voir ce que ça donne ici :

D'abord liquez sur le téléchargement du programme "DSL-Qemu Portable v2.0.0.603" (sans aller jusqu'au bout du téléchargement, pas besoin) ici : http://iportable.tuxfamily.org/dslqop.php (page test)

et sur ClamWin Portable v2.0.0.604 ici :

http://iportable.tuxfamily.org/cp.php (page test)

 

et regardez le résultat dans :

http://iportable.tuxfamily.org/toto.txt

http://iportable.tuxfamily.org/tata.txt

 

Vous verrez que toto s'incrémente normalement tandis qu'avec tata.txt pas moyen d'arriver au résultat escompté.

 

Pour l'instant, j'en suis là avec mon script :

http://iportable.tuxfamily.org/stat.php

 

Il ne gère pour l'instant que les pages ouvertes et pas encore les liens...

 

Bon, si j'ai oublié de préciser quelque chose, allez-si, dites le :-P

Posté(e)

Enlève les " de "$dr2", met juste $dr2 déjà pour voir :P

Invité grenouille
Posté(e)

Enlève les " de "$dr2", met juste $dr2 déjà pour voir :P

 

Arff, toujours le même résulat ! :P

Posté(e)

J'ai pas encore fait le tour de ton code, mais il y a un truc qui me chiffone, c'est le :

 

$i = getenv("QUERY_STRING");

 

et l'utilisation des :

if ( i== ....

 

déjà pour récupérer le contenu d'une requête, je trouve plus simple d'utiliser la variable (tableau) globale $_REQUEST

et puis, QUERY_STRING étant un chaine contenant la requête qui suit l'url du script, elle ne peut pas avoir une valeur de de 0,1,2 ou 3.

 

Par exemple dans mon débogueur, QUERY_STRING contient : DBGSESSID=389105892885500003;d=1,p=0

les valeurs que je pourrais récupérer (selon ma config de php.ini)

$DBGSESSID ou $_REQUEST["DBGSESSID"] avec une valeur de 389105892885500003

$d ou $_REQUEST["d"] avec une valeur de 1

$p ou $_REQUEST["p"] avec une valeur de 0

 

donc si tu transmet l'identifiant du prog téléchargé dans ta requête, il faudrait que ton script, disons blabla.php soit appelé par : blabla.php?id_telechargement=0 (ou 1 ou 2 ou 3 )

 

et tu pourrais alors récupérer ta valeur de $i avec :

$i = $_REQUEST["id_telechargement"] ou $i = $id_telechargement

Posté(e)

En appliquant ce que je t'ai dis et en "factorisant" un peu le code on obtient ça :

<?php
// récupère l'id du programme téléchargé
if (!isset($_REQUEST["id_telechargement"]))
die("pas d'id_telechargement");

$programme_id = $_REQUEST["id_telechargement"];

// Récupère les infos de toto.txt nombre de chargements
$toto = file_get_contents("toto.txt");
$liste = explode(";",$toto);

// Header pour téléchargement
$dr[0] = "Location:http://iportable.tuxfamily.org/dl/ClamWinPortable.exe";
$dr[1] = "Location:http://iportable.tuxfamily.org/dl/ScanWithSetup.exe";

// on vérifie les téléchargements possibles
for ($i = 0; $i < count($liste); $i++) {
if($programme_id == $i)  // si l'id du programme est $i
	$liste[$i]++; // on incrémente le nombre de chargement de $programme_id	
}

$variable = join(";",$liste); // nouvelles valeurs des nb de téléch 

// modification de toto.txt
$fp = fopen("toto.txt","w");
fputs($fp,"$variable");
fclose($fp); 

// modification de tata.txt
$tata = file_get_contents("tata.txt");

if(strstr($tata,$dr[$programme_id]) === false) {  //  si on ne trouve pas la chaine de header dans tata.txt
$open1 = fopen("tata.txt","a");
fwrite($open1,$dr[$programme_id]."\n"); // on l'ajoute à la fin
fclose($open1);
} 



?>

Invité grenouille
Posté(e)

En appliquant ce que je t'ai dis et en "factorisant" un peu le code on obtient ça :

<?php
// récupère l'id du programme téléchargé
if (!isset($_REQUEST["id_telechargement"]))
die("pas d'id_telechargement");

$programme_id = $_REQUEST["id_telechargement"];

// Récupère les infos de toto.txt nombre de chargements
$toto = file_get_contents("toto.txt");
$liste = explode(";",$toto);

// Header pour téléchargement
$dr[0] = "Location:http://iportable.tuxfamily.org/dl/ClamWinPortable.exe";
$dr[1] = "Location:http://iportable.tuxfamily.org/dl/ScanWithSetup.exe";

// on vérifie les téléchargements possibles
for ($i = 0; $i < count($liste); $i++) {
if($programme_id == $i)  // si l'id du programme est $i
	$liste[$i]++; // on incrémente le nombre de chargement de $programme_id	
}

$variable = join(";",$liste); // nouvelles valeurs des nb de téléch 

// modification de toto.txt
$fp = fopen("toto.txt","w");
fputs($fp,"$variable");
fclose($fp); 

// modification de tata.txt
$tata = file_get_contents("tata.txt");

if(strstr($tata,$dr[$programme_id]) === false) {  //  si on ne trouve pas la chaine de header dans tata.txt
$open1 = fopen("tata.txt","a");
fwrite($open1,$dr[$programme_id]."\n"); // on l'ajoute à la fin
fclose($open1);
} 
?>

 

 

Ah oui, c'est complétement différent de ce que j'ai fait :P

 

Je vais me prendre une bonne boisson énergétique, j'essaie de comprendre toutes les commandes, j'applique le code et je te tiens au courant :P

 

En tout cas, merci mediaforest !

Invité grenouille
Posté(e)

Re,

 

Vous êtes des champions les gars !

 

En effet, ça marche très bien comme ça :

 

<?php
$i = getenv("QUERY_STRING"); 
$fp = fopen("toto.txt","r"); 
while(!feof($fp)){ 
$ligne = fgets($fp,4096); 
$liste = explode(";",$ligne); 
} 
fclose($fp); 

$dr[0]= "Location:http://iportable.tuxfamily.org/dl/ClamWinPortable.exe";
$dr[1]= "Location:http://iportable.tuxfamily.org/dl/ScanWithSetup.exe";


$fp = fopen("toto.txt","w"); 
$cp1=$liste[0];
$cp2=$liste[1];
$cp3=$liste[2];
$cp4=$liste[3];

if ($i == 0) {
$cp1++; 
header($dr[0]);
$ouvre = file_get_contents("tata.txt"); 
 if(strstr($ouvre,$dr[0]) === false) {  
$open1 = fopen("tata.txt","a");
fwrite($open1,$dr[0]."\n"); 
fclose($open1);
} 
}

if ($i == 1) {
$cp2++; 
header($dr[1]);
$ouvre = file_get_contents("tata.txt"); 
 if(strstr($ouvre,$dr[1]) === false) {  
$open1 = fopen("tata.txt","a");
fwrite($open1,$dr[1]."\n"); 
fclose($open1);
} 
}

if ($i == 2) {
$cp3++; }

if ($i == 3) {
$cp4++; }

$variable=$cp1.";".$cp2.";".$cp3.";".$cp4;
fputs($fp,"$variable");

fclose($fp);


?>

 

Je vais continuer à m'inspirer de ton code mediaforest pour essayer de proposer quelque chose d'acceptable...

 

Encore merci à vous !

 

Bonne journée !

Rejoindre la conversation

Vous pouvez publier maintenant et vous inscrire plus tard. Si vous avez un compte, connectez-vous maintenant pour publier avec votre compte.
Remarque : votre message nécessitera l’approbation d’un modérateur avant de pouvoir être visible.

Invité
Répondre à ce sujet…

×   Collé en tant que texte enrichi.   Coller en tant que texte brut à la place

  Seulement 75 émoticônes maximum sont autorisées.

×   Votre lien a été automatiquement intégré.   Afficher plutôt comme un lien

×   Votre contenu précédent a été rétabli.   Vider l’éditeur

×   Vous ne pouvez pas directement coller des images. Envoyez-les depuis votre ordinateur ou insérez-les depuis une URL.

  • En ligne récemment   0 membre est en ligne

    • Aucun utilisateur enregistré regarde cette page.
×
×
  • Créer...