Bonjour,

Voila je rencontre un petit problème avec mon code.

Ce que je fais

J'ai un formulaire d'inscription qui fonctionne parfaitement tout va bien dans la bdd...mais!
[code]
<?php require 'inc/function.php';

if(!empty($_POST)){
$errors=array();
require 'inc/db.php';

if(empty($_POST['username']) || !preg_match('/^[a-zA-z0-9_]+$/', $_POST['username'])){
    $errors['username'] = 'Le pseudo est requis';
}else{
    $req = $pdo->prepare('SELECT id FROM users WHERE username = ?');
    $req->execute([$_post['username']]);
    $user = $req->fetch();
    if($user){
        $errors['username'] = 'Ce pseudo est déjà utilisé pour un autre compte';
    }
}

if(empty($_POST['email']) || !filter_var($_POST['email'], FILTER_VALIDATE_EMAIL)){
    $errors['email'] = "Cet email n\'est pas valide";
}else{
    $req = $pdo->prepare('SELECT id FROM users WHERE email = ?');
    $req->execute([$_POST['email']]);
    $user = $req->fetch();
    if($user){
        $errors['email'] = 'Cet email est déjà utilisé pour un autre compte';
    }
}

if(empty($_POST['password']) || $_POST['password'] != $_POST['password_confirm']){
    $errors['password'] = "Vous devez saisir un mot de passe valide";
}

if(empty($errors)){

$req = $pdo->prepare ("INSERT INTO users set username = ?, email = ?, password = ?, confirmation_token = ?");
$password = password_hash($_POST['password'], PASSWORD_ARGON2ID);
$token = str_random(60);
$req->execute([$_POST['username'], $_POST['email'], $password, $token]);

mail($_POST['email'], 'Confirmation de compte', "Afin de valider votre compte, veuillez cliquer sur le lien\n\nhttp://localhost:8888/register.php?id=$user_id&token=$token");
$user_id = $pdo->lastInsertId();
exit('Un mail vous a été envoyé');
} 

}
?>

<!DOCTYPE html>
<html>
<head>
<title>Inscription</title>
<meta charset="utf-8"/>
<meta name="viewport" content="width=device-width, initial-scale=1">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous">
<script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js" integrity="sha384-UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIHNDz0W1" crossorigin="anonymous"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous"></script>
<link href='http://fonts.googleapis.com/css?family=Lato' rel='stylesheet' type='text/css'>
<link rel="stylesheet" href="css/inscription.css">
<script src="js/script.js"></script>
<link href="https://fonts.googleapis.com/css?family=Indie+Flower&display=swap" rel="stylesheet">
<script src="https://kit.fontawesome.com/5c489d9098.js" crossorigin="anonymous"></script>
</head>
<body>
<!--FORMULAIRE-->

     <div class="wrapper">
        <div class="inner">
            <img src="images/image-1.png" alt="" class="image-1">
            <form action="" method="POST">

                <h3>Nouveau compte?</h3>

                <?php if(!empty($errors)): ?>
                <div class="alert alert-danger">
                    <p>Vous n'avez pas rempli le formulaire correctement</p>
                    <ul>
                    <?php foreach($errors as $error): ?>
                        <li><?= $error; ?></li>
                    <?php endforeach; ?>
                    </ul>

                </div>
                    <?php endif; ?>

                <div class="form-holder">
                    <span class="lnr lnr-user"></span>
                    <input type="text" name="username" class="form-control" placeholder="Pseudo">
                </div>
                <div class="form-holder">
                    <span class="lnr lnr-envelope"></span>
                    <input type="email" name="email"  class="form-control" placeholder="Email">
                </div>
                <div class="form-holder">
                    <span class="lnr lnr-lock"></span>
                    <input type="password" name="password"  class="form-control" placeholder="Mot de passe">
                </div>
                <div class="form-holder">
                    <span class="lnr lnr-lock"></span>
                    <input type="password" name="password_confirm"  class="form-control" placeholder="Confirmer le mot de passe">
                </div>
                <button type="submit    ">
                    <span>S'inscrire</span>
                </button>
                <button type="button" onclick="window.location.href = 'index.html';"> 
                    <span>Accueil</span>
                </button>
            </form>
            <img src="images/image-2.png" alt="" class="image-2">
        </div>

    </div>

</body>
<footer>
</footer>
</html>
[code]
[code]

<?php
function debug($variable){
echo '<pre>' . print_r($variable, true) . '</pre>';
}

function str_random($length){
$alphabet = "0123456789AZERTYUIOPQSDFGHJKLMWXCVBNazertyuiopqsdfghjklmwxcvbn";
return substr(str_shuffle(str_repeat($alphabet, $length)), 0, $length);
}
[code]
[code]
<?php
$pdo = new PDO('mysql:dbname=members;host=localhost', 'root', 'root');
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_OBJ);
[code]

Ce que j'obtiens

Je ne reçois aucun mail sur mes boites! Même dans les spams....je pense à un problème de configuration de MAMP si quelqu'un pourrait me filer un tuyau...HELP!
Merci :)

25 réponses


Bonjour,
Tu ne tests pas le retour de la fonction mail pour savoir si le mail est bien parti
Ensuite il te manque le headers de la fonction mail (certes optionnels mais beaucoup de boîte maintenant le demande) (cf la doc php.net)

je la test avec le exit("Un email vous à été envoyé") non? Et j'ai essayé avec le header de la fonction mais cela ne change rien...après je suis le tuto de grafikart...lui ca fonctionne pas moi...

le tuto n'est pas d'aujourd'hu non plus, ça évolue.
Non exit ne test rien du tout, il arrête le script avec un formulaire

ok!!! je pensais que ca testait l´envoi...je vais me renseigner alors...merci en tout cas!

Bonjour,
J'ai toujours le même problème même avec le "headers" etc...
[code]
if(empty($errors)){

    $req = $pdo->prepare ("INSERT INTO users SET username = ?, email = ?, password = ?, confirmation_token = ?");
    $password = password_hash($_POST['password'], PASSWORD_BCRYPT);
    $token = str_random(60);
    $req->execute([$_POST['username'], $_POST['email'], $password, $token]);

    $user_id = $pdo->lastInsertId();
    $message = "Confirmez vôtre compte en cliquant sur le lien ci dessous:\n\nhttp://127.0.0.1/confirm.html?id=$user_id&token=$token";
    $headers =  array(
        'From' => "monmail@gmail.com",
        'Reply-To' => 'monmail@gmail.com', 
        'X-Mailer' => 'PHP/' . phpversion(7.3)
                    );
    mail($_POST['email'], $headers);

    header('Location: index.html');
    exit();
                }
            }

?>
[code]

Bonjour,
Toujours pas de test sur le retour de la fonction mail,

<?php
if (mail(....))
    echo "envoyé";
else
    echo "pas envoyé";

Et tu ne mets ni objet, ni message dans ton mail ?

M**de! Je veux faire trop vite je crois que mon cerveau surchauffe en cette période de confinement...Je teste ça tout à l'heure...merci Carouge! PS:Tu es de suisse(rapport à ton pseudo)?

Non du tout.
Belle ville en tout cas.

:) bon le message n'est pas envoyé il me dit d'upgrade mysql...
[Warning] InnoDB: Table mysql/innodb_index_stats has length mismatch in the column name table_name. Please run mysql_upgrade

Bonjour,
J'ai beau chercher je ne comprends pas! Il m'affiche envoyé mais rien sur l'adresse mail...
[code]

if(empty($errors)){

    $req = $pdo->prepare ("INSERT INTO users SET username = ?, email = ?, password = ?, confirmation_token = ?");
            $password = password_hash($_POST['password'], PASSWORD_BCRYPT);
            $token = str_random(60);
            $req->execute([$_POST['username'], $_POST['email'], $password, $token]);

            $user_id = $pdo->lastInsertId();
            $sujet = "Confirmation de votre inscription";
            $message = "Confirmez vôtre compte en cliquant sur le lien ci dessous:\n\nhttp://localhost/confirm.php?id=$user_id&token=$token";
            $headers = "From: monmail@gmail.com";
                    if (mail($user_id, $sujet, $message, $headers))
                        echo "envoyé";
                    else
                        echo "pas envoyé";
                            exit();
                }
            }

[code]

J'ai regardé si ça pouvait venir de MAMP, modifié le php.ini mais rien ne change...à part qu'il me dit bien que le mail a été envoyé...:(

Je crois que tu as besoin de repos.
Qu'elle est le 1er paramètre de la fonction mail ?

Je crois aussi oui mais quand j'ai quelquechose en tête...je l'ai pas ailleurs...
L1er paramètre est le dernier email envoyé à la bdd

Alors un var_dump($user_id) juste avant le if, le confirmera....
Je me demande d'ailleurs pourquoi il y a "id" dans cette variable....

string(1) "4" envoyé -> voilà ce que retourne var_dump
et j'ai changé $user_id par $user, c'est mieux?

Donc "4" n'est pas un email....
Je ne sais pas ce que contient $user. Pourquoi ne pas utiliser $_POST['email'] ? ça ne serai l'email de la personne qui vient de s'inscrire ?

J'ai essayé de simplifier mon code sans envoyé de "token"...juste envoyer un mail de confirmation de création de compte...rien à faire je ne reçois rien...

Code ?
Tu as consulté les spams ?
Tu as consulté les logs de Mamp ?

une erreur dans le mysql_error_log.err-> InnoDB: Table mysql/innodb_index_stats has length mismatch in the column name table_name. Please run mysql_upgrade
Voila voila...et rien dans les spams...

Alors je reçois le mail mais uniquement sur ma boîte mail free! La freebox doit etre en cause je vais checker à ce niveau là...

Et sur quel autre adresse tu ne reçois pas ?

gmail, hotmail...

gmail, je galère aussi

ca me rassure! enfin c´est bizarre...mais ca marche si je ne mets pas le token dans l´envoi si je mets le token je be recois rien...a la limite je m´en passerai pas grave...

Tourne toi sur "phpmailer", qui t'aidera à mettre en forme et aura plus de chanse de passer

okay merci m´sieur j´ai vu ca mais n´ai pas pris le temps de regarder...merci pour tout en tout cas