[RESOLU] editer fichier texte en php via html

Eléphanteau du PHP | 11 Messages

18 janv. 2024, 22:04

bonjour,
J'ai ancien script php que j'utilise pour editer une playlist , j'essaye de l'adapter pour crée une liste sur un fichier texte:
Sur mon fichier txt de l'ancien script (que j'ai déja pas mal modifier), cela ressemble à:
<loc><file desc="test1"/></loc>
je voudrais réussir a ceci:
<loc><file>test1</file></loc>
je voudrais ajouter au fur et mesure plusieurs lignes similaire via le fichier add.php
Le tout via une page html.
fichier add.php

Code : Tout sélectionner

<?php if(isset($_POST['submitSave'])){ require 'simplexml.class.php'; $loc = simplexml_load_file('Message.txt'); $file = $loc->addChild('file'); $file->addAttribute('desc',$_POST["desc"]); file_put_contents('Message.txt', $loc->asxml()); header('location: message.php'); } ?> <form method="post"> <center><br><br><table cellpadding="2" cellspacing="2"> <tr> <td>Titre</td> <td><input type="text" name="desc"></td> </tr> <tr> <td>&nbsp;</td> <td><input type="submit" name="submitSave" value="Save"></td> </tr> </table> </form> <head> <style> body { background-color: #A4A4A4; } </style> </head> <body> </body>
le problème je ne sais pas top comment supprimer

Code : Tout sélectionner

desc=" "
et ajouter <loc><file> ici le texte </loc></file> a chaque ligne
Certes mes connaissance sont assez basique mais un peu d'aide serait le bienvenue :)

Mammouth du PHP | 1967 Messages

19 janv. 2024, 01:42

Hello,

Le desc=".." vient de l'instruction $file->addAttribute('desc',$_POST["desc"]);
supprime là et tu supprimera l'ajout de l'attribut

pour ajouter ton texte dans ta balise, utilise le 2eme argument de la fonction addChild
$loc->addChild('file',$_POST["desc"]);
Et du coup tu n'a plus besoin de stocker l'instruction dans une variable.

Pense malgré tout à protéger ton script, imagine que quelqu'un utiliseton script on y mettant un code javascript à la place d'une valeur, il pourrait peut être hacké ton site.
Spols
pour les fan de rubik's cube ou pour les curieux ==> le portail francophone du rubik's cube

Eléphanteau du PHP | 11 Messages

19 janv. 2024, 23:24

Merci Spols pour votre aide,
J'ai retravailler le script modifier comme votre exemple , j'ai également adapte mon autre page "Message.php" qui me donne un tableau avec une liste , a chaque fois que j'ajoute un nom à la page "add.php" cela ajoute une ligne au tableau.
Le fichier texte (message.txt) doit avoir le bon format pour être reconnue par un autre logiciel:
Comme ceci:
  • <item><url>test1</url></item>
    <item><url>test1</url></item>
J'ai pratiquement réussi après quelque heures #-o , mais cela coince au niveau du format:
Si la liste est vide dans le fichier texte il y a :
  • <item></item>
Mais au moment que je rajoute une première ligne j'obtiens cela:
  • <item><item/><item/><url>test1</url></item>
Je supprime "test1"
  • <item><item/><item/></item>
Beaucoup trop d'erreur de mon script je suppose :roll:
Ci-dessous les 2 fichiers , j’espère que vous pouvez m'aider :oops:
le fichier add.php

Code : Tout sélectionner

<?php if(isset($_POST['submitSave'])){ require 'simplexml.class.php'; $value = simplexml_load_file('Message.txt'); $url = $value->addChild('item'); $value->addChild('url',$_POST["value"]); file_put_contents('Message.txt', $value->asXML()); header('location: message.php'); } ?> <form method="post"> <center><br><br><table cellpadding="2" cellspacing="2"> <tr> <td>Adresse</td> <td><input type="text" name="value"></td> </tr> <tr> <td>&nbsp;</td> <td><input type="submit" name="submitSave" value="Save"></td> </tr> </table> </form> <head> <style> body { background-color: #A4A4A4; } </style> </head> <body> </body>
le fichier message.php:

Code : Tout sélectionner

<?php if(isset($_GET['action'])){ $item = simplexml_load_file('Message.txt'); $value = $_GET['value']; $index = 0; $i = 0; foreach ($item->url as $url){ if($url['value']==$value){ $index = $i; break; } $i++; } unset($item->url[$index]); file_put_contents('Message.txt', $item->asXML()); } $item = simplexml_load_file('Message.txt'); echo 'Liste nombre: '.count($item); echo '<br>Listing Information'; ?> <br> <center><a href="add.php">Add new Channel</a> <br> <br> <center><table cellpadding="3" cellspacing="3" border="2"> <tr> <th>Adresse</th> <th>Option</th> </tr> <?php foreach ($item->url as $url){ ?> <tr> <td><?php echo $url; ?></td> <td align="center"> <a href="edit.php?value=<?php echo $url; ?>">Edit</a> <a href="message.php?action=delete&value=<?php echo $url; ?>" onclick="return confirm('vous etes sur?')">Delete</td> </tr> <?php } ?> </table> <head> <style> body { background-color: #A4A4A4; } </style> </head> <body> </body>
Le tableau par contre fonctionne bien :D

Mammouth du PHP | 1967 Messages

20 janv. 2024, 00:40

Lorsque la liste est vide il ne faut pas qu'il y ai un <item> par d'un fichier vide

Pour la suppression, il faut parcourir tes balise item et voir celle qui à l'url correspondante et supprimer au niveau de ta balise item. sinon tu garde des balise item vide
Spols
pour les fan de rubik's cube ou pour les curieux ==> le portail francophone du rubik's cube

Eléphanteau du PHP | 11 Messages

20 janv. 2024, 09:50

oui ,pas du tout simple mon affaire , j'ai lu pas mal ses dernier temps sur le PHP j'avance doucement :D
Maintenant j'optiens :
  • <item>
    <url>test1</url>
    <url>test2</url>
    </item>
J'ai supprimer la ligne:

Code : Tout sélectionner

$url = $value->addChild('item');
est-ce possible sans trop de changement de mon code d’inséré le tout entre les 2 balises <list>?
pour avoir:
  • <list>
    <item>
    <url>test1</url>
    <url>test2</url>
    </item>
    </list>

Eléphanteau du PHP | 11 Messages

27 janv. 2024, 18:47

bon j'ai pas mal appris sur PHP , j'ai tout fais fonctionner à part la suppression des balises et la value crée par mon fichier add.php
La fonction delete fonctionne mais me supprime pas la ligne sélectionner , elle supprime la liste de haut en bas #-o
la je sèche :roll:
J'ai modifier les balises et valeur par = <playlist><map><file>ici le texte</playlist></map></file>

Code : Tout sélectionner

<?php if(isset($_GET['action'])){ $playlist = simplexml_load_file('tracklist.txt'); $value = $_GET['value']; $index = 0; $i = 0; foreach($playlist->xpath("//file") as $file){ if($file['value']==$value){ $index = $i; break; } $i++; } unset($playlist->map[$index]); file_put_contents('tracklist.txt', $playlist->asXML()); } $playlist = simplexml_load_file('tracklist.txt'); echo 'Liste nombre: '.count($playlist->map); echo '<br>Listing Information'; ?> <br> <center><a href="add.php">Add new adresse</a> <br> <br> <center><table cellpadding="3" cellspacing="3" border="2"> <tr> <th>Adresse</th> <th>Option</th> </tr> <?php foreach($playlist->xpath("//file") as $file){ ?> <tr> <td><?php echo $file->__toString(); ?></td> <td align="center"> <a href="edit.php?value=<?php echo $file->__toString(); ?>">Edit</a> <a href="message.php?action=delete&value=<?php echo $file->__toString(); ?>" onclick="return confirm('vous etes sur?')">Delete</td> </tr> <?php }
le code source de la page m'affiche pourtant la bonne valeur?

Code : Tout sélectionner

</tr> <tr> <td>test1</td> <td align="center"> <a href="edit.php?value=test1">Edit</a> <a href="message.php?action=delete&value=test1" onclick="return confirm('vous etes sur?')">Delete</td> </tr>

Mammouth du PHP | 1967 Messages

27 janv. 2024, 20:13

Pourquoi utilise tu une fois $file['value'] et ailleur $file->__toString() ?
Est ce que cela donne la même chose ?
Spols
pour les fan de rubik's cube ou pour les curieux ==> le portail francophone du rubik's cube

Eléphanteau du PHP | 11 Messages

03 févr. 2024, 18:16

Pourquoi utilise tu une fois $file['value'] et ailleur $file->__toString() ?
Est ce que cela donne la même chose ?
non pas du tout , si je remplace :

Code : Tout sélectionner

<a href="message.php?action=delete&value=<?php echo $file->__toString(); ?>" onclick="return confirm('vous etes sur?')">Delete</td>
par

Code : Tout sélectionner

<a href="message.php?action=delete&value=<?php echo $file['value']; ?>" onclick="return confirm('vous etes sur?')">Delete</td>
la colonne <td> reste vide , mais si je mets "$file->__toString()" la colonne <td> affiche la valeur <file>test2</file>
malheureusement je ne trouve pas de solution :oops:

Mammouth du PHP | 1967 Messages

05 févr. 2024, 11:51

Donc tu arrive comme conclusion que $file->__toString() marche et $file['value'] ne marche pas alors pourquoi l'utilise tu dans ton code php ?
Spols
pour les fan de rubik's cube ou pour les curieux ==> le portail francophone du rubik's cube

Eléphanteau du PHP | 11 Messages

06 févr. 2024, 22:10

Donc tu arrive comme conclusion que $file->__toString() marche et $file['value'] ne marche pas alors pourquoi l'utilise tu dans ton code php ?
Alors la :D merci beaucoup !!! a première lecture ce matin , cela m'a fait sérieusement réfléchir , je me suis déja demander le pourquoi du comment, j'en es passer du temps sur ce script , et lue pratiquement tout les tutoriels php , pour apprendre d'avantage..
Bref j'ai donc réflechis comment $file->__toString() fonctionne,
donc la ligne:

Code : Tout sélectionner

$value = $_GET['value'];
est juste $_GET récupère la valeur de 'value' -> dans URL -> ?action=delete&value=test1
donc fallait mettre

Code : Tout sélectionner

if($file->__toString()==$value)
pour que $file->__toString() qui est dans mon fichier texte ...<url>test1</url>...
et comparer à la 'value' dans URL ->test1
Cela supprime bien la bonne ligne :D
Merci beaucoup Spols =D> , me reste a faire fonctionner la page "edit.php"

Mammouth du PHP | 1967 Messages

06 févr. 2024, 23:40

Maintenant que tu as compris. Je peux te dire que la methode __toString() est une methode "magique " qui est appelée quand tu fais reference a ton objet avec un transtypage. Donc
if($file==$value) marche aussi
Spols
pour les fan de rubik's cube ou pour les curieux ==> le portail francophone du rubik's cube

Eléphanteau du PHP | 11 Messages

10 févr. 2024, 19:01

Maintenant que tu as compris.
:D lol pas si sûr encore :non:
je suis sur le casse tête de ma page edit.php j'ai un problème a trouver l'erreur , ou plutôt ce qui ne va pas:

Code : Tout sélectionner

<?php require 'simplexml.class.php'; $playlist = simplexml_load_file('tracklist.txt'); if(isset($_POST['submitSave'])){ foreach($playlist->xpath("//map/file") as $file){ if($file->__toString()==$_POST["value"]){ break; } } foreach($playlist->xpath("//map/file") as $file){ if($file =$_POST["value"]){ break; } } file_put_contents('tracklist.txt', $playlist->asXML()); header('location: message.php'); } foreach($playlist->xpath("//map/file") as $file) { if($file->__toString()==$_GET["value"]){ $value = $file->__toString(); break; } } ?> <form method="post"> <center> <table cellpadding="2" cellspacing="2"> <tr> <td>Adresse</td> <td><input type="text" name="value" value="<?php echo $file->__toString(); ?>"></td> </tr> <tr> <td>&nbsp;</td> <td> <input type="submit" name="submitSave" value="Save" /> </tr> </table> </form>
le problème est ici:

Code : Tout sélectionner

foreach($playlist->xpath("//map/file") as $file){ if($file =$_POST["value"]){ break; } }
ce ci ne fonctionne pas ma valeur si je change if($file =$_POST["value"]) par if($file->__toString()==$_POST["value"]) ceci bug le script #-o

Mammouth du PHP | 1967 Messages

10 févr. 2024, 20:23

Quelle est la différence entre = et == ?
$file est équivalent à $file->__toString(), son utilisation est plus explicit et donc plus simple à comprendre
Spols
pour les fan de rubik's cube ou pour les curieux ==> le portail francophone du rubik's cube

Eléphanteau du PHP | 11 Messages

10 févr. 2024, 23:21

Quelle est la différence entre = et == ?
voila ce que j'avais trouver:
$a == $b TRUE si $a est égal à $b après le transtypage.
et
$a = $b que $a est égale à $b
j'avoue que je m'y perd un peu :oops:
$file est équivalent à $file->__toString(), son utilisation est plus explicit et donc plus simple à comprendre
j'avais bien compris cela mais comme mon code ne fonctionnait pas j'ai tester ce qui fonctionnait au départ dans l'autre page php #-o
donc si je corrige ça donne cela :

Code : Tout sélectionner

<?php require 'simplexml.class.php'; $playlist = simplexml_load_file('tracklist.txt'); if(isset($_POST['submitSave'])){ foreach($playlist->xpath("//map/file") as $file){ if($file == $_POST["value"]){ break; } } foreach($playlist->xpath("//map/file") as $file){ if($file = $_POST["value"]){ break; } } file_put_contents('tracklist.txt', $playlist->asXML()); header('location: message.php'); } foreach($playlist->xpath("//map/file") as $file) { if($file==$_GET["value"]){ break; } } ?>
mais ce la fonctionne pas , mais si je sélectionne la ligne test2 dans mon message.php ,j'ai bien test2 dans la case input dans mon edit.php donc ceci est ok:

Code : Tout sélectionner

foreach($playlist->xpath("//map/file") as $file) { if($file==$_GET["value"]){ break; } }

La problématique je pense que $file n'est pas bien définit , et entre quel balises modifier le texte?
avec un $file->addAttribute s'est plus simple cela donnerait :

Code : Tout sélectionner

<?php require 'simplexml.class.php'; $playlist = simplexml_load_file('ListMP3.xml'); if(isset($_POST['submitSave'])){ foreach ($playlist->file as $file){ if($file['desc']==$_POST['desc']){ break; } } foreach ($playlist->file as $file){ if($file['desc'] =$_POST['desc']){ break; } } file_put_contents('ListMP3.xml', $playlist->asXML()); header('location: playlist.php'); } foreach ($playlist->file as $file) { if($file['desc']==$_GET['desc']){ $desc = $file['desc']; break; } } ?
cela fonctionne #-o

si je lui mets une valeur null : if($file[0]=$_POST['value']) cela change la valeur entre la 1er balise <file> n'importe quel ligne je séléctionne.
Quel casse tête #-o

Mammouth du PHP | 1967 Messages

12 févr. 2024, 11:06

La majeure diffèrence entre = et == :
= est une assignation, $a = $b assigne la valeur de $b à $a
== est une comparaison $a == $b retourne true ou false selon la comparaison (après transtypage).

donc avoir un simple égal dans un if est toujours une erreur, car l'assignation va se faire et retournera true ce qui n'est jamais le comportement voulu.

Dans le code que tu nous montre, tu parcours les balises file et tu t'arrête lorsque tu tombe sur la "bonne" mais tu ne fais rien d'autre.
C'est comme si tu lisais un livre juqu'à tomber sur le mot "comme" et puis tu ferme ton livre, tu n'a pas modifié le livre, ton break ne suffit pas.
Spols
pour les fan de rubik's cube ou pour les curieux ==> le portail francophone du rubik's cube