Bonjour,

J'ai un formulaire pour lequel je voudrai si il y a des erreurs (champs non remplis par exemple) avoir en jQuery une alerte avec les messages d'erreurs ou de succès en utilisant json

Comment puis je faire ?

Merci d'avance

Les première lignes de mon formulaire


<form method="post" id="register_form" action="index.php?p=users.register2">
                    <div id="res"></div>
                    <div class="form-group">
                        <label for="pseudo" class="champ col-sm-4 control-label text-left">Pseudo (entre 6 et 10 caractères)</label>
                        <input class="champ col-sm-5 "  type="text" autocomplete="off" name="pseudo" id="pseudo" value="" >
                        
                        </div>


Mon Controleur



$json['error']= false;

if($register_valid->isValid())
            {
            $json['message'] = "Le formulaire a été envoyé ";
}
}        
        else
            {
             $json['message']= "Données Erronées";
            }

           echo json_encode($json); 
        }  

$this->render('users.register2', compact('errors','page_required')); 



Mon javascript



$("#register_form").submit(function(e){
      e.preventDefault(); //empêcher une action par défaut
      var form_url = $(this).attr("action"); //récupérer l'URL du formulaire
      var form_method = $(this).attr("method"); //récupérer la méthode GET/POST du formulaire
      var form_data = $(this).serialize(); //Encoder les éléments du formulaire pour la soumission
      
      $.ajax({
        url : form_url,
        type: form_method,
        data : form_data
      }).done(function(response){ 
        //!!!! QUOI METTRE !!!
      });
    });
Modérateur
donc tu fais une validation dans ton controller si je comprends bien. Pas bien.... Normalement, ça se passe soit dans le model soit dans un objet form. Le controller ne fait "qu'indiquer" les directions à prendre. Charger un code (et non pas la logique) métier dans le controller, n'est pas une bonne chose en soit. Quand on est dans une petite application, c'est pas grave. Mais pour les moyennes et grosses applications, pas bien.

ça donnerait un truc du style (j'ai pas saisi le $register_valid->isValid(). Donc je te l'ai laissé):

<?php 
    class UnController extends Controller{
        public function uneAction(){
            if($register_valid->isValid()){
                if(!empty($_POST)){
                    $post = array_map('htmlentities', $x); //je te laisse faire la suite
                    $data = [];
                    foreach ($post as $k => $v) {
                        switch($k){
                            case 'pseudo':
                                if(trim(empty($v))){
                                    $data['error'][$k] = "Données Erronées";
                                }
                                break;
                        }
                    }
                    if(!isset($data['error'])){
                       // tu fais quelque chose
                       // ....
                        $data['message'] = "Le formulaire a été envoyé ";
                    }

                    header('Content-Type: application/json');
                    echo json_encode($data);
                }else{
                    header('location:'.$_SERVER['HTTP_REFERER']);
                }
            }
        }
    } 


$("#register_form").submit(function(e){
    var _self = $(this);
    e.preventDefault(); //empêcher une action par défaut
    var form_url = $(this).attr("action"); //récupérer l'URL du formulaire
    var form_method = $(this).attr("method"); //récupérer la méthode GET/POST du formulaire
    var form_data = $(this).serialize(); //Encoder les éléments du formulaire pour la soumission

    $.ajax({
        url : form_url,
        type: form_method,
        data : form_data,
        datatype : 'json'
    }).done(function(response){ 
        var data = json.PARSE(response);
        if(data['message']){
            _self.before('<p class="flash success">'+ data['message'] +'</p>')
        }
        if(data['error']){
            for(var key in data['error']){
                $('#'+key).addClass('error').after('<span class="error">'+ data['error'][k] +'</span>');
            }
        }
    });
});

*Il se peut qu'il y ait des erreurs. J'ai fait ça de tête. C'est une piste à suivre.
ps :
- je n'ai pas bien filtré les données. je te laisse le soin de le faire (mon commentaire)
- +1 pour ton event form (submit) Smiley cligne
Modifié par niuxe (21 Apr 2020 - 19:59)
Super merci, j'apprécie grandement ton aide. Smiley biggrin

Je vais regarder cela attentivement.

Le Is Valid c'est ma vérification des données en PHP (voir ma question ci-après)

J'ai une question d'ordre générale qui me taraude depuis longtemps :

JS permet sans envoyer de données au serveur de faire des vérifications mais j'ai lu que l'on pouvait facilement le shunter et faire passer n'importe quoi, mais quand on envoie les données à priori sans erreurs il faut donc quand même faire une vérification PHP avant.

Est ce correct ?

Pour valider mes données et les sécuriser est ce que cela est correct :

addslashes(htmlentities(trim($_POST['pseudo'])));

et

stripslashes(htmlentities(trim($_POST['pseudo'])));

Pour les lire

Encore merci
Modifié par dudu22 (22 Apr 2020 - 10:29)
Modérateur
dudu22 a écrit :

...
J'ai une question d'ordre générale qui me taraude depuis longtemps :
...

heu 2 questions Smiley lol
dudu22 a écrit :

...
JS permet sans envoyer de données au serveur de faire des vérifications mais j'ai lu que l'on pouvait facilement le shunter et faire passer n'importe quoi, mais quand on envoie les données à priori sans erreurs il faut donc quand même faire une vérification PHP avant.

Est ce correct ?
...

le JS ne fait pas que ça. Mais oui, c'est très important. Ne jamais faire confiance aux données entrantes (même si c'est toi qui les saisies). Limite, il faut être parano.

dudu22 a écrit :

....
Pour valider mes données et les sécuriser est ce que cela est correct :

addslashes(htmlentities(trim($_POST['pseudo'])));

et

stripslashes(htmlentities(trim($_POST['pseudo'])));
....


oui et tu verras dans mon code quelque chose à ce sujet
Modifié par niuxe (22 Apr 2020 - 10:24)
Oui désolé je n'avais pas vu les htmlentities

Pour toi cela suffit, pas la peine de mettre addslashes(htmlentities(trim($_POST['pseudo']))); ?

Peux tu préciser ce que tu entends par "dans un objet form"

Oups, je n'avais pas vu pour ton commentaire sur le rôle de controleur

je passe par une classe Valid_client pour faire mes contrôles de validité des champs (voir code ci-dessous)
Pour toi tu les mettrais à quel niveau ? Directement dans la view ?



$register_valid = new Valid_client(App::getInstance()->getDb(),$_POST, $table);
          
        $register_valid->isAlpha('pseudo', "Votre pseudo n'est pas valide (alphanumérique)");

        $register_valid->isDigitPseudo('pseudo', "Votre pseudo doit comporter en 6 et 10 caractères",6,10);

        //if($register_valid->isValid())
        if($register_valid)
            {
            $register_valid->isUniq('pseudo', 'pseudo', 'Ce pseudo est déjà pris');
            }

        $register_valid->isEmail('mail', "Votre email n'est pas valide");

        /*if($register_valid)
            {
            $register_valid->isUniq('mail','mail' ,'Cet email est déjà utilisé pour un autre compte');
            }*/

        $register_valid->isConfirmed('mail', 'Votre mail et sa confirmation ne correspondent pas');    

        $register_valid->isDigitPassword('password', "Votre password doit comporter en 8 et 12 caractères",8,12);   

        $register_valid->isConfirmed('password', 'Votre mot de passe et sa confirmation ne correspondent pas');

if($register_valid->isValid())
            {
            $json['error']= false;

            $json['message'] = "Le formulaire a été envoyé ";

           //$password = password_hash($_POST['password'], PASSWORD_BCRYPT);
            $password = sha1($_POST['password']);

            $register_token = New Math();

            $token= $register_token->str_random(60);
        
            $result = $this->User->create([
            'pseudo' => $_POST['pseudo'],
            'mail' => $_POST['mail'],
            'password' => $password,
            'confirmation_token' => $token,
            'role_id' => "2"
            ]);

            $last_id = $this->User->last_Id() ;
            $lastid= $last_id ->id;

$this->render('users.register', compact('errors'));


+ Envoi Email de Confirmation


Dans le même genre d'idée je mets aussi un envoi d'email dans mon controleur, où devrais je le placer ?
Modifié par dudu22 (22 Apr 2020 - 11:39)
Modérateur
dudu22 a écrit :
Oui désolé je n'avais pas vu les htmlentities

Pour toi cela suffit, pas la peine de mettre addslashes(htmlentities(trim($_POST['pseudo']))); ?


regarde le code ci-dessous, tu voyais pas où je voulais en venir apparemment. (code fait de tête. Il peut y avoir des erreurs.)

dudu22 a écrit :

Peux tu préciser ce que tu entends par "dans un objet form"
Oups, je n'avais pas vu pour ton commentaire sur le rôle de controleur


De mon côté, dans un environnement de travail, j'ai un objet form qui est relié au model ou pas (si c'est relié au model, c'est d'une simplicité déconcertante) qui va me permettre de construire un formulaire de toute pièce dans le moteur de template. il gère la validation aussi.

Dans l'autre environnement (à l'aide de cette librairie), je construis à la main un enfant de form et je gère dans cet objet la validation.

dudu22 a écrit :

je passe par une classe Valid_client pour faire mes contrôles de validité des champs (voir code ci-dessous)
Pour toi tu les mettrais à quel niveau ? Directement dans la view ?


lis ce code (le souci, je ne connais pas ton env de travail) :

ps : pense à indenter ton code. Parce que pour te lire.... Smiley ohwell


<?php 
    class UnController extends Controller{
        public function uneAction(){
            if(!empty($_POST)){
                $clean = [
                    'trim',
                    'htmlentities',
                    'addslashes',
                ];
                foreach ($clean as $v) {
                    $_POST = array_map($v, $_POST);
                }
                $data = [];
                $register_valid = new Valid_client(App::getInstance()->getDb(),$_POST, $table);
                foreach ($_POST as $k => $v) {
                    switch($k){
                        case 'pseudo':
                            $register_valid
                            ->isAlpha($k, "Votre pseudo n'est pas valide (alphanumérique)")
                            ->isDigitPseudo($k, "Votre pseudo doit comporter en 6 et 10 caractères",6,10);
                            ->isUniq($k, $k, 'Ce pseudo est déjà pris');
                            break;
                        case 'mail':
                            $register_valid
                            ->isEmail($k, "Votre email n'est pas valide")
                            ->isConfirmed($k, 'Votre mail et sa confirmation ne correspondent pas')                            
                            break;
                        case 'password':
                            $register_valid
                            ->isDigitPassword($k, "Votre password doit comporter en 8 et 12 caractères",8,12)
                            ->isConfirmed($k, 'Votre mot de passe et sa confirmation ne correspondent pas')
                            break;
                        
                    }
                }
                if($register_valid->isValid()){
                    $password = sha1($_POST['password']);
                    $register_token = New Math();
                    $token = $register_token->str_random(60);
                    $result = $this->User->create([
                        'pseudo' => $_POST['pseudo'],
                        'mail' => $_POST['mail'],
                        'password' => $password,
                        'confirmation_token' => $token,
                        'role_id' => "2"
                    ]);
                    $last_id = $this->User->last_Id() ;
                    $lastid = $last_id->id;
                    if(mail(....)){
                        $type = "success";
                        $txt = "Le formulaire a été envoyé ";
                    }else{
                        $type = "error";
                        $txt = "Le formulaire a été envoyé. Mais le mail de confirmation n'a pu vous être envoyé.";
                    }
                    $data['message'] = [
                        'type' => $type,
                        'txt' => $txt;
                    ];
                }else{
                    $data['error'] = "j'en sais rien comment tu récupères les erreurs ! mais c'est ici que ça se passe";
                }

                header('Content-Type: application/json');
                echo json_encode($data);
            }else{
                $this->render('users.register');
            }
        }
    } 
Super merci pour ta patience et tes corrections.

Désolé pour l'indentation mais j'ai tendance quand je connais pas le sujet à faire l'impasse et à revenir dessus uns fois le problème résolu.

Avant de le mettre en place quelques précisions pour le néophyte que je suis :

- merci pour le array_map que je ne connaissais pas, j'aurai utilisé une fonction à la place mais qui nécessite une intervention serveur donc cette solution améliore la rapidité je suppose

- Est ce utile d'appliquer htmlentities au password qui va être filtré par sha ?

- le switch améliore la lisibilité mais a t'il une autre utilité ?

- Quand tu parles de Form tu penses par exemple à ce qui existe chez Symphony ou d'autres ?

D'ailleurs qu'utilises tu comme Framework ?

Bon maintenant à l'attaque du code Smiley smile et encore merci pour ton aide

J'ai fait le code, j'arrive à avoir le json sur une page que je ne connaissais pas upload/1587646651-77837-json.jpg (voir image) mais pas la page avec les messages

Merci encore pour ton aide

Code Controleur :


public function register2() {

    if(!empty($_POST)){
                $clean = [
                    'trim',
                    'htmlentities',
                    'addslashes',
                ];

                foreach ($clean as $v) {
                    $_POST = array_map($v, $_POST);
                }

                $data = [];

                $register_valid = new Valid_client(App::getInstance()->getDb(),$_POST, $table);

                foreach ($_POST as $k => $v) {
                    switch($k){
                        case 'pseudo':
                            $register_valid
                            ->isAlpha($k, "Votre pseudo n'est pas valide" );
                            $register_valid->isDigitPseudo($k, "Votre pseudo doit comporter en 6 et 10 caractères",6,10);
                            $register_valid->isUniq($k, $k, 'Ce pseudo est déjà pris');

                            break;
                        case 'mail':
                            $register_valid
                            ->isEmail($k, "Votre email n'est pas valide");
                             $register_valid->isConfirmed($k, 'Votre mail et sa confirmation ne correspondent pas');                            
                            break;
                        case 'password':
                            $register_valid
                            ->isDigitPassword($k, "Votre password doit comporter en 8 et 12 caractères",8,12);
                             $register_valid->isConfirmed($k, 'Votre mot de passe et sa confirmation ne correspondent pas');
                            break;
                        
                    }
                }
                if($register_valid->isValid()){

                    $password = sha1($_POST['password']);
                    $register_token = New Math();
                    $token = $register_token->str_random(60);
                    $result = $this->User->create([
                        'pseudo' => $_POST['pseudo'],
                        'mail' => $_POST['mail'],
                        'password' => $password,
                        'confirmation_token' => $token,
                        'role_id' => "2"
                    ]);
                    $last_id = $this->User->last_Id() ;
                    $lastid = $last_id->id;
                    //if(mail(....)){
                        $type = "success";
                        $txt = "Le formulaire a été envoyé ";
                    /*}else{
                        $type = "error";
                        $txt = "Le formulaire a été envoyé. Mais le mail de confirmation n'a pu vous être envoyé.";
                    }*/

                    $data['message'] = [
                        'type' => $type,
                        'txt' => $txt
                    ];
                }else{
                    $data['error'] = $register_valid->getErrors();
                }

                header('Content-Type: application/json');
                
                echo json_encode($data);
                
            }else{
                $this->render('users.register2', compact(''));
            }

} 


Mon code JS



$("#register_form").submit(function(e){
    var _self = $(this);
    e.preventDefault(); //empêcher une action par défaut
    var form_url = $(this).attr("action"); //récupérer l'URL du formulaire
    var form_method = $(this).attr("method"); //récupérer la méthode GET/POST du formulaire
    var form_data = $(this).serialize(); //Encoder les éléments du formulaire pour la soumission

        $.ajax({
            url : form_url,
            type: form_method,
            data : form_data,
            datatype : 'json'
        }).done(function(response){ 
            var data = json.PARSE(response);
           
            if(data['message']){
                _self.before('<p class="flash success">'+ data['message'] +'</p>')
            }
            if(data['error']){
                for(var key in data['error']){
                    $('#'+key).addClass('error').after('<span class="error">'+ data['error'][k] +'</span>');
                   
                }

            }
        });
    });    

Modifié par dudu22 (23 Apr 2020 - 14:58)
Modérateur
dudu22 a écrit :

- merci pour le array_map que je ne connaissais pas, j'aurai utilisé une fonction à la place mais qui nécessite une intervention serveur donc cette solution améliore la rapidité je suppose


oui un petit peu mais surtout une facilité d'écriture

dudu22 a écrit :

- Est ce utile d'appliquer htmlentities au password qui va être filtré par sha ?


Ah bonne question. Il faudra que tu fasses des essais.

dudu22 a écrit :

- le switch améliore la lisibilité mais a t'il une autre utilité ?


oui :

<?php 

foreach ($_POST as $k =&gt; $v) {
    switch($k){
        case 'pseudo':
        case 'un_autre_champ':
        case 'et_encore_un_champ':
            //etc. 
            break;
        case 'mail':
            //etc. 
            break;
    }
}


dudu22 a écrit :

- Quand tu parles de Form tu penses par exemple à ce qui existe chez Symphony ou d'autres ?

D'ailleurs qu'utilises tu comme Framework ?

J'en sais rien à propos de Symfony. Je n'ai jamais aimé Symfony. Là en faisant ma veille technique, j'ai regardé un petit peu la dernière version. Je me dis que c'est vraiment une usine à gaz ce truc. Certes, on peut faire de belles choses avec. Perso, la direction que prend php et certains framework comme Symfony, peu pour moi (beurk). Pendant longtemps, j'utilisais CakePHP. C'est un bon framework. Il est simple et efficace. Sa documentation (en français si tu es anglophobe) est très bien faite. La rapidité de mise en oeuvre est vraiment pas mal. Laravel est un autre bon framework à ce que j'ai pu voir (je ne le connais pas bien). L'année dernière pour un projet, j'ai bossé sur Code Igniter. Il est simple mais bien en dessous des framework précités. Si je dois te conseiller un framework, ce serait CakePHP ou Laravel. Ce n'est qu'un avis.

Pour finir, personnellement, je ne coderai plus en php. Mon dernier dev (pour une entreprise) date de cet hiver. Ce dev, je continuerai à le maintenir. La trotinette que j'ai codé il y a maintenant un peu plus de 2-3 ans, je ne la continuerai pas. PHP est un langage qui souffre de beaucoup de choses :
- tu passes plus de temps maintenant à écrire une syntaxe pour palier aux manques qu'il a : namespace / essaie de faire un typage fort / a toujours son problème de cohérence (ex: str_replace/strtr).
- l'unicode (php 6 on t'aime....)
- php est un langage qui végète. PHP 7.x n'est pas une évolution (sauf son moteur zend)

Qu'est ce que j'utilise comme langage :
- Python 2.7 / Python 3.x

Qu'est ce que j'utilise comme framework :
- Flask (bonne notions)
- Django Smiley loveu
- pandas (pas d'équivalent php)
- tkinter (pas d'équivalent php)

Pour te donner une idée avec un formulaire et un controleur avec flask (micro framework largement supérieur à Lumen/Slim/Sylex):
class form

from flask_wtf import FlaskForm

class NameForm(FlaskForm):
    chaine = StringField('Quel est ton prénom', validators=[InputRequired(message="Ce champs doit contenir une valeur"), length(min=3, message="doit contenir 3 car")])
    submit = SubmitField('envoyer')




from flask import Flask, request, redirect, url_for, render_template, flash, session
app = Flask(__name__)
@app.route('/', methods=('GET', 'POST'))
def index():
    form = NameForm()
    ctx = {
        'form': form
    }
    if form.validate_on_submit():
        user = User.query.filter_by(username=form.chaine.data).first()
        if user is None:
            user = User(username=form.chaine.data)
            db.session.add(user)
            session['known'] = False
        else:
            session['known'] = True
            session['chaine'] = form.chaine.data
            return redirect(url_for('index'))
    ctx['name'] = session.get('chaine')
    ctx['known'] = session.get('known', False)
    return render_template('index.html', **ctx)


Je vois que le retour de php te renvoie un json. Ça va dans le bon sens. J'ai lu la fonction de retour de l'ajax. Ça devrait fonctionner. Est ce que tu as une erreur dans la console de ton navigateur ? Si oui, laquelle. Je viens de m'apercevoir d'un petite erreur de syntaxe en JS :
remplace ceci :

var data = json.PARSE(response);

par :

var data = JSON.parse(response);


Cela dit, il me semble que cette ligne ne soit pas utile. jQuery parse la réponse. (à vérifier)
Modifié par niuxe (23 Apr 2020 - 20:09)
Merci pour tes éclaircissements, très instructif.

Non je n'ai pas de message d'erreurs dans ma console.

C'est peut être un problème dans Js, on dirait que rien n'arrive au niveau du .done

Même un console.log(data) ne donne rien !
Modérateur
dudu22 a écrit :
Merci pour tes éclaircissements, très instructif.

Non je n'ai pas de message d'erreurs dans ma console.

C'est peut être un problème dans Js, on dirait que rien n'arrive au niveau du .done

Même un console.log(data) ne donne rien !


ton done, depuis le début ne me plait pas. Je t'avoue ne pas avoir vérifié ça dans la doc. Perso, je n'ai jamais utilisé $.get / $.post, mais toujours $.ajax avec success et le paramètre method.


$.ajax({
    url : form_url,
    type: form_method,
    data : form_data,
    datatype : 'json',
    method : 'post',
    sucess: function(response){ 
        var data = json.PARSE(response);       
        if(data['message']){
            _self.before('<p class="flash success">'+ data['message'] +'</p>')
        }
        if(data['error']){
            for(var key in data['error']){
                $('#'+key).addClass('error').after('<span class="error">'+ data['error'][k] +'</span>');               
            }
        }
    }
});

Modifié par niuxe (24 Apr 2020 - 01:46)
Merci mais cela ne change rien.

Il n'arrive pas à passer les informations au niveau du success ou du done !!!

Est ce la liaison entre le controleur et ajax ?

J'avoue que j'y perd mon latin !!!

J'ai vu sur un bouquin rajouter :

header('HTTP/1.0 400 Bad Request');
Modifié par dudu22 (24 Apr 2020 - 13:46)
Modérateur
test ce fichier :

<?php
if(!empty($_POST)){
    $post = array_map('htmlentities', $_POST); //je te laisse faire la suite
    $data = [];
    foreach ($post as $k => $v) {
        switch($k){
            case 'pseudo':
                if(trim(empty($v))){
                    $data['error'][$k] = "Données Erronées";
                }
                break;
        }
    }
    if(!isset($data['error'])){
       // tu fais quelque chose
       // ....
        $data['message'] = "Le formulaire a été envoyé ";
    }else{
        $data['message'] = "Le formulaire n'a pu être envoyé ";
    }

    header('Content-Type: application/json');
    echo json_encode($data);
    die;
}

?>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
    <form method="post" id="register_form" action="controller.php?p=users.register2">
        <div id="res"></div>
        <div class="form-group">
            <label for="pseudo" class="champ col-sm-4 control-label text-left">Pseudo (entre 6 et 10 caractères)</label>
            <input class="champ col-sm-5 "  type="text" autocomplete="off" name="pseudo" id="pseudo" value="" >
        </div>
        <button type="submit" name="button">vas y</button>
    </form>
    <script src="https://code.jquery.com/jquery-2.2.4.min.js" integrity="sha256-BbhdlvQf/xTY9gja0Dq3HiwQF8LaCRTXxZKRutelT44=" crossorigin="anonymous"></script>
    <script>
        $(function(){
            $("#register_form").submit(function(e){
                var speed = 400;
                var _self = $(this);
                var form_url = $(this).attr("action"); //récupérer l'URL du formulaire
                var form_method = $(this).attr("method"); //récupérer la méthode GET/POST du formulaire
                var form_data = $(this).serialize(); //Encoder les éléments du formulaire pour la soumission

                $('span.error, .flash').slideUp(speed, function(){
                    $(this).remove();
                    $('.error').removeClass('.error');
                });

                $.ajax({
                    url : form_url,
                    data : form_data,
                    datatype : 'json',
                    method : 'post',
                    success: function(response){
                        if(response['message']){
                            _self.before('<p class="flash success">'+ response['message'] +'</p>').prev().hide().delay(speed).slideDown(speed);
                        }
                        if(response['error']){
                            for(var key in response['error']){
                                $('#'+key).addClass('error').after('<span class="error">'+ response['error'][key] +'</span>').next().hide().delay(speed).slideDown(speed);
                            }
                        }
                    }
                });
                e.preventDefault(); //empêcher une action par défaut
            });
        })
    </script>
</body>
</html>


Modifié par niuxe (24 Apr 2020 - 15:23)
Merci, merci Smiley biggrin

Cela a l'air de marcher, bravo

Qu'est ce qui ne fonctionnait pas :

Ma validation dans une classe, l'utilisation de controler, le die ou d'autre choses ?

Peut être aussi de ne pas avoir rajouté :

 $(function(){ 


J'ai vu que tu mettais en js à la fin e.preventdefault , moi je le mets au début c'est pas bon ?

Sinon j'aimerai ton avis (oui je sais j'abuse :

Quand tout est correctement rempli j'envoie un email de confirmation sur lequel l'utilisateur clique ce qui le renvoie vers une page "intermédiaire" pour confirmer qui ne me sert pas beaucoup
Comment pourrais je m'en passer , peut être revenir sur la page register et avoir une alerte ce qui m'évite d'avoir deux pages d'ouvertes ou est ce que en js il y a un moyen