Bonjour,

Je fais les exercices d'apprentissage PHP sur ce site (merci pour ces cours ;-) )...

Ce que je fais

<form action = "newsletter.php" method = "POST">
    <div class = "form-group">
        <input type = "email" class = "form-control" name = "email" value = "" required> 
        <br>
        <button type = "submit" class = "btn btn-primary">Envoyer</button>
    </div>
</form>
<?php
if(empty($_POST['email'])) :
    $value = NULL;
else : 
    $value = $_POST['email'];
    echo "Adresse mail envoyée.";
endif;
?>
<?php
$fichier = __DIR__ . DIRECTORY_SEPARATOR .'mail'. DIRECTORY_SEPARATOR .'mails.txt';

$txt = fopen("$fichier", 'a+');

fputs ($txt, "$value", FILE_APPEND);

fclose($txt);
?>

Ce que je veux

J'écrit dans un fichier (mails.txt), le(s) mail(s) envoyé(s) via mon formulaire.

Ce que j'obtiens

Quelque soit la méthode utilisée (GET ou POST), mon fichier ne reçoit ou alors n'écrit que les 8 premiers caractères de l'adresse mail envoyé (avec la méthode GET, l'adresse mail apparait bien en entier dans l'URL).
Le problème reste identique quelque soit le serveur utilisé (wamp ou cmd powershell (php -S localhost:8000) ).

Je suis un peu perdu, car il me semble avoir fais d'autres exercices utilisant un formulaire et je n'ai jamais eu de soucis tel que celui là.

Merci d'avance pour votre aide :-)

10 réponses


hars
Auteur

Y a t-il quelqu'un qui pourrait m'aiguiller ?
Merci d'avance...

Bonjour,

Si vous tester de faire un "echo $_POST['email']" juste avant l'affichage de "Adresse mail envoyé" ça donne quoi? Que les 8 premiers caractères aussi ou bien là vous avez tout?

Peux-tu mettre tout le code qui provoque cette erreur STP?
(En gros le même qu'au départ mais avec la ligne en plus)

hars
Auteur

Pardon, j'ai dit une bétise.
A force d'essayer des codes ...
L'adresse complète s'affiche, mais sur le fichier il n'y a que les 8 premiers caractères

hars
Auteur
<?php
require 'header.php';
?>

<div class = col-md-4 style="font-size:30px; text-align:left;">
Veuillez saisir votre email...
</div>
<br>
<div class="col-md-4">
<form action = "newsletter.php" method = "POST">
<div class = "form-group">
    <input type = "email" class = "form-control" name = "email" value = "" required>
    <br>
    <button type = "submit" class = "btn btn-primary">Envoyer</button>
</form>
</div>

<?php
if(empty($_POST['email'])) :
    $val = NULL;
else  :
    $value = $_POST['email'];
    if (filter_var($value, FILTER_VALIDATE_EMAIL)){ //on teste la validité de la syntaxe d'un mail
        $val = $value;
        echo $_POST['email'];
        echo "Votre email a bien été envoyé.";
    }
    else {
        $val = NULL;
        echo "Votre email n'est pas valide";
    }
endif;

//on crée une variable de la date
$date = date('Y_M_d');
//on assigne une variable pour le chemin du fichier à remplir
$fichier = __DIR__ . DIRECTORY_SEPARATOR .'mail'. DIRECTORY_SEPARATOR ."$date".'.txt';

// 1 : on ouvre le fichier
$txt = fopen("$fichier", 'a+');

// 2 : on écrit dans le fichier la première adresse mail
fputs ($txt, "$val"."\r\n", FILE_APPEND);

// 3 : quand on a fini de l'utiliser, on ferme le fichier
fclose($txt);

?>

Salut,

Ceci est du à une mauvaise utilisation de la fonction fputs et de la constante FILE_APPEND, si tu regardes bien la doc de fwite (fputs est un alias) le 3ème paramètre sert à préciser combien d'octets tu veux garder pour ta chaine, la constante FILE_APPEND est un entier et je te laisse deviner sa valeur !

Du coup si tu veux résoudre ton problème tu as deux solutions, soit tu utilises la fonction file_put_content et en effet tu peux utiliser la constante FILE_APPEND en 3ème paramètre pour préciser que tu veux ajouter des données, ou alors tu reste comme ça et tu enlèves le FILE_APPEND pour enlever la limitation de charactère, tu précises déjà que tu veux ajouter du contenu quand tu ouvres ton fichier grâce au a+.

J'espère que j'ai été à être assez clair dans mes explications sinon hésites pas à demander !

hars
Auteur

Salut et merci beaucoup pour ces infos.

 file_put_contents ( string $filename , mixed $data [, int $flags = 0 [, resource $context ]] ) : int

Revient à appeler les fonctions fopen(), fwrite() et fclose() successivement.

Si le fichier filename n'existe pas, il sera créé. Sinon, le fichier existant sera écrasé, si l'option FILE_APPEND n'est pas définie. 

FILE_APPEND     Si le fichier filename existe déjà, cette option permet d'ajouter les données au fichier au lieu de l'écraser. 

C'est bien ce que je souhaitais, ne pas écraser les donnée déjà écrite...

Même si je me suis mélangé les crayons entre file_put_content et fputs, dommage qu'il ne soit pas indiqué que ce 3ème paramètre, bloque l'écriture sur 8 caractères seulement.

J'arrive à un stade ou retenir tous ces cours PHP devient difficile pour moi avec ma tite tête MDR.
Effectivement, maintenant, le résultat est OK :-)
Je vais donc reprendre les explications sur ces 2 fonctions.

Encore merciiiiiiiiiiii

C'est indiqué normalement

Le 3ème paramètre est le paramètre optionnel length et comme indiqué sur la doc, length:"Si la longueur length est fournie, l'écriture s'arrêtera après length octets, ou à la fin de la chaîne (le premier des deux). " et vu que FILE_APPEND a comme valeur 8, ça arrête l'écriture au 8ème octet donc au 8ème charactère.

Pense à bien lire la doc quand tu as des doutes en général il y a souvent la solution dedans, surtout quand tu utilises des fonctions que t'as pas souvent / jamais utilisé !

De rien et bonne journée ;)

hars
Auteur

Merci encore pour tes renseignements, mais je regarde le fonctionnement des différentes fonctions PHP sur le site php.net et en loccurence https://www.php.net/manual/fr/function.file-put-contents.php pour mon cas.
Je ne trouve rien (sur les 8 octets) de FILE_APPEND hormis ce qui a déjà été indiqué plus haut.

Y a t-il une autres adresse sur laquelle je devrais vérifier mes sources ?

Non non, php.net est très bien, mais je parlais de la fonction fputs vu que c'était celle que tu utilisais et qui te posait problème