[RESOLU] [Qst] - Lecture/Ecriture via un form dans un fichier TXT

Eléphant du PHP | 103 Messages

29 déc. 2014, 21:25

Salutations,

J'ai un dilemme que je ne résous pas :

Je fais un formulaire html/PHP pour m'éviter de modifier à la main un fichier TXT sur un serveur FTP distant.

Formulaire de saisie :

Code : Tout sélectionner

<?php include 'ls-data.php'; ?> </head> <body> <?php // Ouverture du fichier pour écriture $handle = fopen("$lectdons","r") or die("Connexion impossible au serveur !"); // Récupération du listing // $contents = fread($handle,filesize($fpdons)); $contents = stream_get_contents($handle,filesize($lectdons)); ?> <form action="ls-envoi.php" method="Post" target="_blank"> <br /> <b>Votre message en texte brut :</b> <br /><br /><br /> <strong>Taper, remplacer ou v&eacute;rifier le contenu du listing (et sauter une ligne en fin) :</strong><br /><br /> <table border="0px"> <tr> <td width="550" align="left"> <textarea rows="30" name="listing" cols="100"><?php echo $contents; ?></textarea> </td> </tr> </table> <br /> <input type="submit" value="MaJ du listing !"> </form> <?php // Fermeture du pointeur de fichier fclose($handle); ?>
Routine d'envoi formulaire :

Code : Tout sélectionner

<?php include 'ls-data.php'; // Date actuelle : $date = date('d-m-Y'); // Debug echo $date; // Définition des accents : $accents = array("é", "è", "ê", "à", "ô"); $correct = array("e", "e", "e", "a", "o"); // Contenu du message du formulaire : $ls = $_POST["listing"]; // on remplace les accents $ls = str_replace($accents, $correct, $ls); ?> </head> <body> <?php // Ouverture du fichier pour écriture $handle = (fopen('$wridons','w+') or die("Connexion en &eacute;criture impossible au serveur !")); // Envoi du nouveau listing... fwrite($handle,$ls); echo "Mis &agrave; jour du dernier listing ("; ?>"<a href="<?php echo $lectdons; ?>" target="_blank"><?php echo $fichier; ?></a>"<?php echo ") ... "; // Rembobinage du fichier et fermeture du pointeur de fichier rewind($handle); fclose($handle); ?>
Le contenu du fichier TXT s'affiche bien dans le textarea du formulaire, et SEMBLE se sauver, mais aucune modification n'est apportée au fichier TXT.

Auriez-vous une idée ?

P.S: Le fichier contient plus de 1000 lignes...

Mammouth du PHP | 2278 Messages

29 déc. 2014, 22:07

Naïf:
$contents = stream_get_contents($handle,filesize($lectdons));
Pourquoi pas: (http://php.net/manual/fr/function.strea ... ntents.php)
$contents = stream_get_contents($handle, -1);
Il y a bien d'autres accents à éliminer : tous les circonflexes et trémas (a, e,i,o,u, ), u accent grave et éventuellmeet les mêmes en majuscules
$accents = array("é", "è", "ê", "à", "ô");
$correct = array("e", "e", "e", "a", "o");

Pour l'écriture voir http://php.net/manual/fr/function.fwrite.php
sans quoi il faudrait vérifier
print "$ls"; // histoire d'être sûr
fwrite($handle,$ls);
Vanitas vanitatum et omnia vanitas
Mes derniers livres :
Sauvez les Mots chez BoD,
Tous les chemins mènent à ROM chez BoD

Eléphant du PHP | 103 Messages

29 déc. 2014, 22:28

Merci de ce retour rapide.

Pour :

Code : Tout sélectionner

$contents = stream_get_contents($handle, -1);
Cela fonctionne au même, merci. Je ne connaissais pas la syntaxe.

Pour les accents, je sais qu'il existe beaucoup d'autres bizarreries qui merdouillent dans ce cas, mais étant le seul à utiliser ce script, je ne pense pas avoir besoin pour l'instant d'autre chose. Je m'adapterais progressivement.

Pour le :

Code : Tout sélectionner

print "$ls";
J'avais testé en debugg avant de venir vous enquiquiner, mais avec un echo. Le rendu semble être le même.
Par contre, cela me sort le listing AVEC les modifs appliquées, MAIS sans saut de ligne...
Et le fichier TXT n'est pas modifié.

Mammouth du PHP | 2278 Messages

30 déc. 2014, 12:05

Le problème est lié à fwrite2 Dans la doc de fwrite, il y a ca:
<?php
function fwrite_stream($fp, $string) {
    for ($written = 0; $written < strlen($string); $written += $fwrite) {
        $fwrite = fwrite($fp, substr($string, $written));
        if ($fwrite === false) {
            return $fwrite;
        }
    }
    return $written;
}
?>
1 Tu pourrais commencer par
$res = fwrite(comme tufais);
var-_dump($res);
1 b
$handle = (fopen('$wridons','w'); // sans le +
3 Il y a assi ftp_put
Vanitas vanitatum et omnia vanitas
Mes derniers livres :
Sauvez les Mots chez BoD,
Tous les chemins mènent à ROM chez BoD

Eléphant du PHP | 103 Messages

30 déc. 2014, 12:41

J'ai donc modifié ainsi :

Code : Tout sélectionner

(...) // Ouverture du fichier pour écriture $handle = (fopen('$wridons','w') or die("Connexion en &eacute;criture impossible au serveur !")); // Envoi du nouveau listing... print "$ls"; $res=fwrite($handle,$ls); var_dump($res); echo "Mis &agrave; jour du dernier listing ("; ?>"<a href="<?php echo $lectdons; ?>" target="_blank"><?php echo $fichier; ?></a>"<?php echo ") ... "; (...)
Mais, toujours pareil; Aucune modification du fichier TXT.
Pourtant cela s'affiche bien dans le print.
#-o

Mammouth du PHP | 2278 Messages

30 déc. 2014, 13:10

Et que dit le var_dump ?
Vanitas vanitatum et omnia vanitas
Mes derniers livres :
Sauvez les Mots chez BoD,
Tous les chemins mènent à ROM chez BoD

Eléphant du PHP | 103 Messages

30 déc. 2014, 13:29

Et que dit le var_dump ?
bool(false)

Mammouth du PHP | 2278 Messages

30 déc. 2014, 14:14

Cohérent avec ce que tu constatais.
si tu mettais
error_reporting(E_ALL); avant le fopen ?
et un
var_dump($handle); //après...
Quels sont tes droits sur ce fichier au niveau du serveur ?
Ca ne résoudrait rien, mais on ne s'étonnerait plus.
Il y a bien is_writable
Vanitas vanitatum et omnia vanitas
Mes derniers livres :
Sauvez les Mots chez BoD,
Tous les chemins mènent à ROM chez BoD

ViPHP
ViPHP | 2577 Messages

30 déc. 2014, 14:39

Pour éliminer une partie des sources d'erreurs, tu pourrais utiliser un fichier local avant de tester via ftp. Ca assure une vérification de la logique du traitement.
Ensuite, tu pourrais afficher le contenu initial du fichier distant pour être sur que le chemin est bon et que tu n'écris pas dans un autre répertoire (peu probable avec un fwrite qui retourne false).

As tu mis un user et un mot de passe :
$handle = fopen("ftp://user:[email protected]/somefile.txt", "w");

Eléphant du PHP | 103 Messages

30 déc. 2014, 14:45

(...)
si tu mettais
error_reporting(E_ALL); avant le fopen ?
et un
var_dump($handle); //après...
(...)
bool(true)
Warning: fwrite() expects parameter 1 to be resource, boolean given in /Destock/Dons/ls-envoi.php on line 34
bool(false) Mis à jour du dernier listing ("dons.txt") ...
Warning: rewind() expects parameter 1 to be resource, boolean given in /Destock/Dons/ls-envoi.php on line 39

Warning: fclose() expects parameter 1 to be resource, boolean given in /Destock/Dons/ls-envoi.php on line 40
(...)
Quels sont tes droits sur ce fichier au niveau du serveur ?
Ca ne résoudrait rien, mais on ne s'étonnerait plus.
Il y a bien is_writable
Actuellement, j'édite, à travers ce même compte, le fichier TXT directement depuis un client FTP, et ce depuis plus d'un an.
Pour éliminer une partie des sources d'erreurs, tu pourrais utiliser un fichier local avant de tester via ftp. Ca assure une vérification de la logique du traitement.
Ensuite, tu pourrais afficher le contenu initial du fichier distant pour être sur que le chemin est bon et que tu n'écris pas dans un autre répertoire (peu probable avec un fwrite qui retourne false).

As tu mis un user et un mot de passe :
(...)
La première partie du code, donnée plus haut, fait la même manip, mais en lecture uniquement, et sur le même fichier.
Celui s'affiche correctement, je ne pense donc pas à un pb de chemin, a moins que fwrite et ses copains réagissent de façon différente ?

Voici le contenu du fichier ls-data.php :

Code : Tout sélectionner

<?php // Variables // Addresse du serveur distant $ftpip = "AdresseDynDNSduServeur"; // Compte(s) du serveur distant $userls = "log"; $passls = "pass"; $supuserls = "log2"; $supassls = "pass2"; // Arborescence du serveur distant $compte = "web"; // Port du serveur distant $port = "21"; // Nom du fichier distant $fichier = 'dons.txt'; // Chemin vers le fichier distant $lectdons = 'ftp://'.$userls.':'.$passls.'@'.$ftpip.'/'.$compte.'/'.$fichier; $wridons = 'ftp://'.$supuserls.':'.$supassls.'@'.$ftpip.'/'.$compte.'/'.$fichier; //////////////// Fin des parametres ////////////////// ?>

Mammouth du PHP | 2278 Messages

30 déc. 2014, 15:00

(fopen('$wridons','w+') pourquoi des simples quotes alors que tu mets des doubles dans la lecture?
Vanitas vanitatum et omnia vanitas
Mes derniers livres :
Sauvez les Mots chez BoD,
Tous les chemins mènent à ROM chez BoD

Mammouth du PHP | 688 Messages

30 déc. 2014, 15:03

Actuellement, j'édite, à travers ce même compte, le fichier TXT directement depuis un client FTP, et ce depuis plus d'un an.
ce n'est pas les mêmes droits, par ftp et par un script php.

Eléphant du PHP | 103 Messages

30 déc. 2014, 15:18

(fopen('$wridons','w+') pourquoi des simples quotes alors que tu mets des doubles dans la lecture?
Alors, justement, j'ai essayé de normaliser l'ensemble, mais si je mets des "" au lieu des '', et/ou reciproquement selon le script (lecture/ecriture), cela me mets l'erreur qu'il n'arrive pas à établir la cnx.
(...)
ce n'est pas les mêmes droits, par ftp et par un script php.
Du coups, on touche peut-être la solution... :
Capture d'écran 2014-12-30 14.17.57.png
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.

Mammouth du PHP | 2278 Messages

30 déc. 2014, 18:05

regarde :
http://php.net/manual/fr/wrappers.ftp.php
User Contributed Notes
2
et pourquoi ne pas mettre sans quotes du tout?
Vanitas vanitatum et omnia vanitas
Mes derniers livres :
Sauvez les Mots chez BoD,
Tous les chemins mènent à ROM chez BoD

Eléphant du PHP | 103 Messages

30 déc. 2014, 18:10

regarde :
http://php.net/manual/fr/wrappers.ftp.php
User Contributed Notes
2
(...)

Code : Tout sélectionner

<? $str ="replace all contenents"; $filew="ftp://gufo:[email protected]:21/jj.php"; $opts = array('ftp' => array('overwrite' => true)); $context = stream_context_create($opts); $strwri = file_put_contents($filew,$str,LOCK_EX,$context); ?>
?