8710 sujets

Développement web côté serveur, CMS

Bonjour à tous !

Je possède un formulaire d’inscription basique notamment avec adresse e-mail et référence à 6 chiffres.
La validation de l'inscription se fait manuellement par l'admin.
Je possède pour cela 2 tables :
On va dire une table validation et utilisateurs.
Validation permet de mettre tous les champs d'un utilisateur en "attente" de validation de la part de l'administrateur qui via une ligne de commande basique permet d’insérer l'ensemble des champs de validation dans utilisateurs et de supprimer les champs validation une fois fait via l'ID correspondant.

Le soucis c'est que j'aimerai vérifier si l'e-mail et la référence est déjà connu dans les 2 tables afin d'éviter qu'un utilisateur s'enregistre plusieurs fois même si ce dernier n'a pas son compte validé. Pour l'instant le code suivant vérifie juste la présence de ces données seulement dans la table utilisateurs. Comment faire pour vérifier cela également dans la table validation.

UNION semble tout trouvé mais je ne vois pas comment le placer de manière simple...
Genre comme cela mais qui ne fonctionne pas...

('SELECT id FROM utilisateurs WHERE email = ? UNION SELECT id FROM validation WHERE email = ?');


<?php
session_start();
require_once 'db.php';
require_once 'functions.php';

if(!empty($_POST))
{

	$errors = array();

	if(empty($_POST['nom']) || !preg_match('/^[a-zA-ZàâäéèêëîïôöùûüçÀÂÄÉÈÊËÎÏÔÖÙÛÜÇ \'-]+$/', $_POST['nom']))
	{
		$errors['nom'] = "Nom invalide !";
	}

	if (empty($_POST['prenom']) || !preg_match('/^[a-zA-ZàâäéèêëîïôöùûüçÀÂÄÉÈÊËÎÏÔÖÙÛÜÇ \'-]+$/', $_POST['prenom']))
	{
		$errors['prenom'] = "Prénom invalide !";
	}

	if (empty($_POST['reference']) || !preg_match('/^[0-9]{6}+$/', $_POST['reference']))
	{
		$errors['reference'] = "Numéro de référence invalide !";
	} else 
    {

      $req = $pdo->prepare('SELECT id FROM utilisateurs WHERE reference = ?');
      $req->execute([$_POST['reference']]);
      $user = $req->fetch();
      if($user)
      {
        $errors['reference'] = 'Numéro de référence déjà utilisé !';
      }

    }

	if (empty($_POST['email']) || filter_var($_POST['email'], FILTER_VALIDATE_EMAIL) != $_POST['email2'])
	{
		$errors['email'] = "Les e-mails saisis ne correspondent pas ou sont invalides !";
	} else 
		{

			$req = $pdo->prepare('SELECT id FROM utilisateurs WHERE email = ?');
			$req->execute([$_POST['email']]);
			$user = $req->fetch();
			if($user)
			{
				$errors['email'] = 'Email déjà utilisé !';
			}

		}

	if (empty($_POST['pass']) || $_POST['pass'] != $_POST['pass2'])
	{
		$errors['pass'] = "Les mots de passe saisis ne correspondent pas ou sont invalides !";
	}

		if(empty($errors))
	{

$req = $pdo->prepare("INSERT INTO validation SET nom = ?, prenom = ?, reference = ?, email = ?, pass = ?, confirmation_token = ?");
$password = password_hash($_POST['pass'], PASSWORD_BCRYPT);
$token = str_random(60);
$req->execute([$_POST['nom'], $_POST['prenom'], $_POST['reference'], $_POST['email'], $password, $token]);
$user_id = $pdo->lastInsertId();
header('Location: success.php');
exit();
	}
}
?>

Modifié par Gianni54 (17 Apr 2018 - 18:48)
Bonsoir.

C'est peut-être moi qui ai mal compris... mais pourquoi une table pour "mettre des éléments en attente" ?

A priori, l'e-mail seul peut être utilisé comme clé primaire. (Cela dit, il faut peut-être vérifier que l'email n'a pas été mal tapé.)

Peut-être quelqu'un comprendra mieux que moi...

Smiley confus
C'est vrai qu'on se demande pourquoi 2 tables ?
Il suffit de rajouter dans la table finale une colonne valide avec valeur nulle ou 1 et de modifier la valeur pour valider.

Ce n'est pas forcément une bonne idée la clé primaire pour l'email.
Souvent elle existe déjà et c'est un champ numérique qui s'auto-incrémente à chaque insert.

Par contre, on peut mettre une contrainte d'unicité sur la colonne, voire les 2 colonnes :
https://www.w3schools.com/sqL/sql_unique.asp

Je pense que la référence sur 6 chiffres est une clé étrangère mais c'est pure hypothèse
Modifié par bazooka07 (17 Apr 2018 - 20:00)
Meilleure solution
C'est vrai qu'après réflexion, 2 tables semble injustifiées
Mais débutant en PHP, j'ai suivi un cours en ligne et cette solution m'avait été proposée concernant la validation d'un compte en 2 temps par l'admin avec 2 tables ainsi pour éviter que le combo identifiant et pass se retrouve dans la table qui sert justement à se connecter.
Mais effectivement il aurai été judicieux d'ajouter un champs validation avec valeur nulle ou 1 pour autoriser la connexion.

En plus, pour le coup, ça allègerai le code en le rendant plus simple.

En attendant de pouvoir modifier tout cela, je repose la question pour ma culture perso, est-il possible de vérifier ce que je souhaite sur 2 tables en une requête ?

Du style :

("SELECT id FROM utilisateurs WHERE email = ? UNION SELECT id FROM validation WHERE email = ?")


En sachant que cela ne fonctionne pas...
Modifié par Gianni54 (18 Apr 2018 - 10:38)
salut,

alors plutôt avec une sous requête:

SELECT id FROM utilisateurs WHERE email = (SELECT email FROM validation WHERE email = ?)


ce qui devrait te renvoyer soit False soit l'Id de l'utilisateur
Modifié par biduletruck (18 Apr 2018 - 11:22)