Variable a l'intérieur d'un fichier texte... est-ce possible?

cs_jzeel Messages postés 156 Date d'inscription mercredi 21 décembre 2005 Statut Membre Dernière intervention 10 mars 2011 - 27 août 2009 à 19:17
nautilus99 Messages postés 661 Date d'inscription vendredi 26 septembre 2008 Statut Membre Dernière intervention 18 septembre 2009 - 4 sept. 2009 à 23:49
Bonjour à tous!

Je sais à la base comment lire et écrire dans un fichier texte, mais j'ai une liste de membre dans ma BD et chaque membre ont un code membre et une note de 1 à 1000. j'aimerais pouvoir incrémenté une note en fonction du code de membre.

Est-ce possible d'avoir dans mon txt des lignes comme ceci :

$code=1001
$note=5
$code=1002
$note=10
$code=1003
$note=15
$code=1004
$note=5
etc..

et ensuite par un code php aller directement dans le code membre 1003 pour augmenter la note à 16.

Est-ce possible? merci de votr aide


Jzeel

22 réponses

kohntark Messages postés 3705 Date d'inscription lundi 5 juillet 2004 Statut Membre Dernière intervention 27 avril 2012 30
27 août 2009 à 23:27
Salut,

.. tout (ou presque) est possible.
Mais il faut en tout premier lieu se poser la question : "est ce une bonne idée ?"
Je pense comprendre ce que tu souhaites faire au niveau du fichier texte, par contre je ne comprends pas pourquoi tu n'utilises pas ta DB pour ça ?? C'est une DB texte ??


Tu devrais sans doute utiliser du XML pour ce fichier, mais même en simple texte avec le format que tu proposes ça ne pose pas de pb, ... reste à savoir combien pèse ce fichier (??)


Cordialement,

Kohntark -
0
cs_jzeel Messages postés 156 Date d'inscription mercredi 21 décembre 2005 Statut Membre Dernière intervention 10 mars 2011
28 août 2009 à 06:09
J'y ai pensé, mais le problème c'est que sur la page php j'affiche un une animation flash(swf) qui va lire un txt qui contient 2 variable: la note du membre et le nombre de personne qui ont participé...

et c'est la mon problème, j'ai pensé a stocké la note et le nombre de personne participant dans la BD, mais Flash a ce que je sache(a moins que je me trompe ne peut pas venir lire dans la BD). Ainsi, je voulais savoir est ce qu'il y avait un moyen que par du code php venir prendre les données de la bd(ce qui est facile) et le mettre dans txt qui contient 2 variable: note et nb_participant (ce qui est difficile)?

A moins d'avoir un autre moyen, je suis ouvert....


Jzeel
0
nautilus99 Messages postés 661 Date d'inscription vendredi 26 septembre 2008 Statut Membre Dernière intervention 18 septembre 2009 1
28 août 2009 à 09:41
Bonjour,

Pour l'import de ton texte en tableau ou base de données, le plus simple est le format CSV qui est le plus facile à importar sans avoir besoin de se créer un analyseur complet. XML correspondrait aussi.

Bien qu eflash ne puisse lire directement le sbases de données, il permet du JavaScript et du passage de paramètres. Avec un stockage en base de données et une simple requête JSON ou JQuery, tu peux via PHP interroger la base de données et renvoyer le résultat correspondant.

ça évite les usines à gaz.
0
jemil75 Messages postés 5 Date d'inscription lundi 31 août 2009 Statut Membre Dernière intervention 21 septembre 2009
31 août 2009 à 11:32
Hello,
Les expressions régulières sont tes amies, avec un petit coup de preg_replace_callback tu devrais t'en sortir facilement. Un truc du style (à la truelle):

$text = preg_replace_callback(
"#(\$code=1003(\n|\r\n)?\$note=)[0-9]{1,2}#',
create_function(
'$matches',
'return ($matches[1]."16");'),$text);

$text étant le contenu de ton fichier... Après, si tu veux automatiser la fonction, tu devras remplacer la note (ici 16) par une variable. create_fonction() ne te permettra pas d'entrer une variable extérieure. Le truc, c'est d'écrire la commande qui va bien dans une chaine et de l'évaluer ensuite avec eval(). J'ai testé dans un cas similaire, ça marche impeccable! Bon courage!
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_jzeel Messages postés 156 Date d'inscription mercredi 21 décembre 2005 Statut Membre Dernière intervention 10 mars 2011
31 août 2009 à 17:55
Pour être franc avec vous je suis un peu melanger dans le cas de nautilus99 j'ai jamais utilisé du CSV ou des requête JSON ou JQuery je vois QUOI faire mais pas COMMENT le faire... surtout avec aucun exemple cela aide pas.

Dans le cas de jemil75, je comprend qu'a moitié, mettons que chaque document porte le nom de code du membre (1003.txt) et à l'intérieur j'ai juste une variable $note= *** J'imagine qu'il faudra que j'ouvre mon fichier txt pour écrire dedans du genre ...

(

$code = 1003;
$fp = fopen("$code.txt", "r")
while (!feof($fp)) {
 $text = fgets($fp);    
 $text = preg_replace_callback "#(\$note=)[0-9]{1,2}#', create_function( 
'$matches', 'return ($matches[0]."16");'),$text); 
} fclose($fp); ?>


Est-ce que $matches[0] fait reference la la variable $note du document texte... sinon, je ne comprend pas cette ligne: 'return ($matches[1]."16"); et je ne vois vois pas en quel sens la fonction eval pourrait m'être utile.

Merci!

Jzeel
0
jemil75 Messages postés 5 Date d'inscription lundi 31 août 2009 Statut Membre Dernière intervention 21 septembre 2009
31 août 2009 à 19:34
En fait, mon exemple ne vaut que si tu as toutes tes données dans un même fichier txt, du type de celui que tu as donné dans ton message: $code=1001 $note=15...

Après, ce n'est pas, à mon avis, la meilleure manière de procéder: une petite base SQL serait beaucoup plus appropriée.

Sinon, pour en revenir à mon exemple, $matches[1] fait référence à ce qui se trouve dans la première parenthèse de l'expression régulière, soit quelquechose du type "$code=1003 $note=". Ensuite tu ajoute le chiffre 16, par exemple, pour obtenir "$code=1003 $note=16". Quant à eval, dans ce cas précis, cela peut t'être utile pour changer la note en question. Si tu essaies cette commande en remplacant le chiffre 16 par une variable $newNote, par exemple, tu t'apercevras que cela ne marche pas. Tout simplement car dans ce cas précis, tu ne peux passer aucun paramètre extérieur à create_function, en dehors de ceux de l'expression régulière.

Mais encore une fois, je pense que manipuler la DB serait beaucoup plus simple...
0
cs_jzeel Messages postés 156 Date d'inscription mercredi 21 décembre 2005 Statut Membre Dernière intervention 10 mars 2011
31 août 2009 à 21:37
Je comprend bien ton point et j'ai très envie de l'essayer mais ce qui m'arrête c'est cette phrase que tu dis " je ne peux passer aucun paramètre extérieur à create_function, en dehors de ceux de l'expression régulière."
Dans ce cas, comment veux-tu que je puisse par SQL prendre le contenu de ma variable dans la BD le stocké dans une variable $newNote (page.php) pour l'utiliser dans mon ($matches[1].$newNote);??? puisque c'est ça le but de tout le problème.

Et si dans mon expression regulière j'ai 2 parenthèse... est-ce possible de changé 2 variables en même temps ainsi:
'return ($matches[1]."16",$matches[2]."20");'
??
Merci pour ton aide!

Jzeel
0
jemil75 Messages postés 5 Date d'inscription lundi 31 août 2009 Statut Membre Dernière intervention 21 septembre 2009
31 août 2009 à 22:55
Comme ça, par exemple (en gros tu reprends ta commande en échappant les guillemets et en remplacant la variable)

$newNote=15; // Ou n'importe quelle valeur issue de ta DB
$commande="$text = preg_replace_callback("#(\$code=1003(\n|\r\n)?\$note=)[0-9]{1,2}#', 
                                         create_function('$matches', 
                                                         'return ($matches[1]."".$newNote."");'),
                                         $text);";
eval($commande); 


Evidemment, c'est de l'artillerie lourde...
0
nautilus99 Messages postés 661 Date d'inscription vendredi 26 septembre 2008 Statut Membre Dernière intervention 18 septembre 2009 1
31 août 2009 à 23:46
Bonsoir,

Pour être franc avec vous je suis un peu melanger dans le cas de nautilus99 j'ai jamais utilisé du CSV ou des requête JSON ou JQuery je vois QUOI faire mais pas COMMENT le faire... surtout avec aucun exemple cela aide pas.


Le format CSV ets un simple format d etexte délimité. Dans ton cas, tu as 2 champs, code et note. Le look d etes ligne ressemeblerait en csv à ceci:
1001;5
1002;10
ou, si tu utilises le délimiteur de chaines
"1001";"5"
"1002";"10"

etc..
En PHP tu as une fonction pour lire un fichier csv et l'importer dans un tableau..
$r = fopen( 'lecsv.csv', 'r' ) ;
$tab = fgetcsv  ( $r, 100, ';' ) ;


et pour retrouver une note par rapport à un code passé à la fonction via $code par exemple:
if ( array_key_exists( $code, $tab ) ) {
   return $tab[$code] ;
} else {
   throw new Exception( 'Code inconnu" ) ;
}

Et voilà, sans se battre avec des regexp ou autres..
0
cs_jzeel Messages postés 156 Date d'inscription mercredi 21 décembre 2005 Statut Membre Dernière intervention 10 mars 2011
1 sept. 2009 à 18:42
Je trouve cela interressant ton approche, d'ailleurs je vais me renseigner sur les tutoriel CSV.... Mais le problème pour cette situation présente c'est que ce ne sera pas accessible au flash qui va le lire le txt, pour que mon flash le lit il faut que je lui indique le nom de variable ex : var1=2222&var2=4444 - si je met 1001;5 1002;10... Mon flash ne le lira pas.

et c'est la que les expressions regulière peuvent m'être utile...


Jzeel
0
nautilus99 Messages postés 661 Date d'inscription vendredi 26 septembre 2008 Statut Membre Dernière intervention 18 septembre 2009 1
1 sept. 2009 à 19:05
Tu peux parfaitement mettre tes noms d evar dans une cellule csv..

En général, partout où tu appelle sen flash un fichier texte, tu peux à la place appeler un script et renvoyer le résultat au format attendu par flash. Le plus courant dans les grosses applis en flash étant l'utilisation de XML pour communiquer.
0
cs_jzeel Messages postés 156 Date d'inscription mercredi 21 décembre 2005 Statut Membre Dernière intervention 10 mars 2011
2 sept. 2009 à 07:05
Bon je suis complètement perdu jemil75 avec les REGEX... j'ai toujours une erreur....

$newNote=6;
$text = preg_replace_callback(#(note_q=)[0-9]{1,3}#, create_function('$matches', 'return ($matches[1]."".$newNote."");'),$text);


Normalement dans mon txt sur la meme ligne j'ai ceci: note_q=0¬e_s=0 ces deux variable doivent-être change ou incemente et je ne connais pas la methode ou syntaxe pour changer ces 2 variables avec preg_replace_callback matches[1] et matches[2].... J'ai fait des recherches et il y a aucun exemple sur le net. C'est vraiment frustrant!


Jzeel
0
jemil75 Messages postés 5 Date d'inscription lundi 31 août 2009 Statut Membre Dernière intervention 21 septembre 2009
2 sept. 2009 à 19:51
Déjà, ta regex doit etre entre guillemets. Ensuite, il faut adapter la syntaxe à ton cas. Avec la syntaxe que tu me donnes, ca devrait ressembler à ça:

"#note_q=([0-9]+)¬e_s=([0-9]+)#"

$matches[1] te renverra alors le premier chiffre (note_q) et $matches[2] le second (note_s). Après, tu peux en faire ce que tu veux dans le callback. Par exemple, si tu veux incrémenter chaque note de 1:

$text = preg_replace_callback("#note_q=([0-9]+)&note_s=([0-9]+)#",
        create_function('$matches',
                'return "note_q".$matches[1]++."&note_s=".$matches[2]++;'),$text);


Le truc avec les regex, c'est d'abord de trouver la bonne expression avec un testeur (essaie celui là: http://lumadis.be/regex/test_regex.php). Et ensuite de trouver la bonne expression de remplacement. Bon courage!
0
nautilus99 Messages postés 661 Date d'inscription vendredi 26 septembre 2008 Statut Membre Dernière intervention 18 septembre 2009 1
3 sept. 2009 à 20:27
Bonsoir,

J'ai l'impression qu'il y a un peu d econfusion là... tu parles d eflash lisant un txt et de regexp ou tableaux en PHP...
var1=2222&var2=4444

Si ta requête flash est sous cette forme, il s'agit d'un tout bête get qui en PHP trouve ses variables via $_GET (supr global).

Quel que soit le système, tu peux utiliser la méthode d'import CSV et les tableaux, ou celle via regexp et retourner ce qu'attend flash.
0
cs_jzeel Messages postés 156 Date d'inscription mercredi 21 décembre 2005 Statut Membre Dernière intervention 10 mars 2011
3 sept. 2009 à 22:22
IL faut que tu soit plus explicite nautilus 99, je vois pas ce qu tu veux dire... J'utilise $_Get pour passer des variables par url pas pour changer le contenu d'un fichier...

Pour les REGEX jemil75, ton code ne marchait presque, mais a partir d'exemple trouvé sur le web(http://www.01php.com/references/php/function.preg-replace-callback.html), j'ai réussi a faire en sorte que ça marche(quelques modif), mais mon seul problématique c'est quand il ecrit dans le fichier text.

Exemple si le Contenu initial de mon txt est note_q=1¬e_s=1 ...après le regex j'ai ceci : note_q=2¬e_s=2 je m'attendais à ce que cela soit note_q=2¬e_s=2

voici le code
<?php
$fp = fopen($id_four.".txt", "r+");
$text=fgets($fp);
$text = preg_replace_callback("#note_q=([0-9]+)&note_s=([0-9]+)#", create_function('$matches','return "note_q=".($matches[1]+1)."&note_s=".($matches[2]+1);'),$text);
fseek($fp,0);
fputs($fp,$text);
fclose($fp); 


Ou est le problématique...??? Je sens que je suis pas loin..... Merci pour votre aide!

Jzeel
0
cs_jzeel Messages postés 156 Date d'inscription mercredi 21 décembre 2005 Statut Membre Dernière intervention 10 mars 2011
4 sept. 2009 à 06:40
OK ça marche mais sur mon MAC, c'est vraiment bizarre, sur mon mac a la maison le regex ecrit correctement dans le fichier text(note_q=2¬e_s=2), mais lorsque je suis au bureau sur PC il écrit autre chose (note_q=2¬e_s=2). Bon je ne vais rien spéculer, je vais revoir que cela va donner au bureau sur PC demain...

Jzeel
0
kohntark Messages postés 3705 Date d'inscription lundi 5 juillet 2004 Statut Membre Dernière intervention 27 avril 2012 30
4 sept. 2009 à 14:13
Salut,

Je n'ai pas regardé précisemment ton code, mais ton problème doit venir du fait que le ¬ de note_q2 ¬ e_s2 est interprété comme le code ascii 172 (¬ = = ¬) ... il va falloir fouiller un peu pour trouver le pourquoi du comment.

A vrai dire je n'ai pas tout suivi de la conversation et au final je n'ai sans doute pas compris grand chose.
Est ce bien cette architecture que tu as ? :

fichier texte de la forme :
$code=1001
$note=5
$code=1002
$note=10
$code=1003
$note=15
$code=1004
$note=5
etc ...

Flash == (va lire dans)=> fichier texte < =(lit / modifie à partir de l'interrogation de la DB)= = PHP

Ta DB contient le code membre et la note associée (" j'ai une liste de membre dans ma BD et chaque membre ont un code membre et une note de 1 à 1000 ")
Hors je vois des tentatives de modification du fichier texte mais pas de la DB. Ces modifications ne doivent elles pas s'appliquer également à celle ci ?

Si ces modifs doivent apparaitre en DB pourquoi ne pas exécuter un script php qui :
- modifie les valeurs en DB (simple "UPDATE note ... WHERE `code_membre` = trucmuche)
- puis générer le fichier, qu'utilisera par la suite flash, via une seconde requête sql (SELECT ... INTO OUTFILE)
Ce fichier étant d'un format CSV, qui, comme l'a dit Nautilus, répond fort bien à ta demande (à mon sens ça reste plus léger que l'utilisation des regex, comme le souligne Jemil75)

Cela serait sans doute bien plus simple et également plus rapide.

Cordialement,


Kohntark -
0
cs_jzeel Messages postés 156 Date d'inscription mercredi 21 décembre 2005 Statut Membre Dernière intervention 10 mars 2011
4 sept. 2009 à 19:40
Tu as raison kohntark, j'avais changé dans le platforme du serveur le ascii pour ISO-8859-1, j'avais pas fait le lien que c'était pour ça que cela fonctionnait sur mon MAC... je viens de l'essayé sur PC et ça marche et j'ai tout de suite compris.

J'ai opté pour les REGEX pour 2 raisons

1) Avec les regex, je n'aurai même pas besoin d'utiliser ma DB pour stocké de nouveaux variables, en ecrivant dans le fichier text les valeurs restes.
C'est que en FLASH j'ai un tableau qui montre la qualité des services du membre de 1 à 10 et le nombre de personne ayant participé: note_q (qualité) et nb_pers(nombre de personne ayant participé). Flash lit l'info dans le fichier txt format note_q=0&nb_pers=0).

La seule interaction que j'ai avec la DB en utilisant regex, c'est que dans ma page php, je rentre le #membre pour savoir si elle se trouve dans la DB, si Oui, deux boutons devient visible sur la même page soit (Augmenter la note et Descendre la note), et dans le lien de chaque bouton, j'envoie le $id_membre(lien.php?id_membre=<? echo $id_membre ?>) que je reçoit aves un $_Get dans une autre page php dans lequel j'ai un include au fichier txt qui porte le numéro du id_membre($id_membre.txt ou 5.txt).

2) Je n'ai jamais touché au CSV mais je commence à m'y mettre pour comprendre son utilitée, bref j'aime pas me lancé dans qque chose que je ne maitrise pas, dans le cas contraire il faudrait que je vous demande du code tout cuit dans le bec, et le jour ou le ne marcherais plus je suis bloqué alors je préfère comprendre...

En passant, kohntark je remarque ta suggestion de seconde requête sql (SELECT ... INTO OUTFILE)... es-tu entrain de me dire que je peux en php utilisé SELECT pour écrire dans un fichier??? si oui, mon monde va basculé.... et j'aimerais savoir comment!

Merci pour votre aide!


Jzeel
0
nautilus99 Messages postés 661 Date d'inscription vendredi 26 septembre 2008 Statut Membre Dernière intervention 18 septembre 2009 1
4 sept. 2009 à 20:03
le SELECT ... INTO OUTFILE existe depuis des lustres sous mysql. ça permet d'exporter un résultat de requête directement dans un fichier au format CSV standard.

Très pratique pour pas mal de choses.
0
cs_jzeel Messages postés 156 Date d'inscription mercredi 21 décembre 2005 Statut Membre Dernière intervention 10 mars 2011
4 sept. 2009 à 23:45
Et c'est quoi la syntaxe pour le select... Into Outfile ou lien d'un site qui en parle??? j'ai fait des recherches et je trouve pas.

Jzeel
0
Rejoignez-nous