[RESOLU] [AL - DB] vérification adresse Mail et le pseudo.

Pour les scripts écrits en C#
Règles du forum
Merci de respecter la NOMENCLATURE suivante pour vos TITRES de messages :

Commencez par le niveau de vos scripts
DB = Débutant
MY = Moyen
CF = Confirmé

Puis le domaine d'application
-RS = Réseau
-AL = Algorithmie

Exemple :

[DB-RS] Mouvement perso multijoueur
maliimaloo
Messages : 45
Inscription : 28 Sep 2017 19:06

[RESOLU] [AL - DB] vérification adresse Mail et le pseudo.

Message par maliimaloo » 24 Avr 2018 00:54

Bonjour, je viens vous voir car j'ai un problème avec mon script d'enregistrement d'utilisateur dans une base de données et cela fait 3 jours que je cherche ainsi j'ai essayé plusieurs solutions, modification sans aucun succès donc je me tourne vers vous.

Mon problème survient quand je veux vérifier dans ma base de données si l'adresse Mail et le pseudo que le joueur à rentrée lors de son inscription existe déjà ou pas dans la base de données, mais quand je faisait le test et que je clique sur le bouton Enregistrer, cela ne m'exécute pas ma boucle while(lire. Read()) et rien ne se passe, donc est ce que ma requête pose problème, ou ma vérification des if/else, j'espère que vous pourriez m'aider à résoudre mon problème.

Script d'enregistrement :

Code : Tout sélectionner

using UnityEngine;
using UnityEngine.UI;
using System.Text.RegularExpressions;
using MySql.Data.MySqlClient;

public class Register : MonoBehaviour 
{
	[SerializeField]
	private InputField adresseMail;
	[SerializeField]
	private InputField pseudo;
	[SerializeField]
	private InputField password;
	[SerializeField]
	private InputField confirmPassword;

	[SerializeField]
	private Text erreurText;

	[SerializeField]
	private GameObject connexionPanel;

	private bool verificationOK = false;

	public void Update()
	{
		Debug.Log("Test !");
		string msg = ValidMail(adresseMail.text) ? "Adresse valide" : "Adresse invalide";

		if(pseudo.text == "")
			erreurText.text = "Veuillez mettre un Pseudo !"; 
		else if(adresseMail.text == "")
			erreurText.text = "Veuillez mettre une AddreseMail !"; 
		else if(msg == "Adresse invalide")
				erreurText.text = "Veuillez mettre une AdresseMail valide !";
		else if(password.text == "")
			erreurText.text = "Veuillez mettre un Password !"; 
		else if(confirmPassword.text == "")
			erreurText.text = "Veuillez mettre une confirmation Password !"; 
		else if(password.text != confirmPassword.text)
			erreurText.text = "La confirmation de Password n'est pas correct !";
		else if(pseudo.text.Length <= 4)
			erreurText.text = "Votre pseudo doit contenir 5 caractère minimum !";
		else if(password.text.Length <= 4)
			erreurText.text = "Votre Password doit contenir 5 caractère minimum !";
		else
		{
			verificationOK = true;
			erreurText.text = "";
		}
	}

	public void enregistrement()
	{
		if(verificationOK)
		{
			string verification = "SELECT * FROM compteutilisateur";
			MySqlCommand cmdVerifiation = new MySqlCommand(verification, ConnectorBDD.con);
			using(MySqlDataReader lire = cmdVerifiation.ExecuteReader())
			{
				while(lire.Read())
				{
					string Mail = lire[name: "AdresseMail"].ToString();
					string Pseudo = lire[name: "Pseudo"].ToString();

					if(Mail != adresseMail.text && Pseudo != pseudo.text)
					{
						lire.Close();
						Debug.Log("N'éxiste pas !");

						string ajoutUtilisateur = "INSERT INTO compteutilisateur(AdresseMail,Pseudo,Password) VALUE (@adresseMail,@pseudo,@password)";
						MySqlCommand cmd = new MySqlCommand(ajoutUtilisateur, ConnectorBDD.con);
						cmd.Parameters.AddWithValue("@adresseMail", adresseMail.text);
						cmd.Parameters.AddWithValue("@pseudo", pseudo.text);
						cmd.Parameters.AddWithValue("@password", password.text);
						cmd.ExecuteNonQuery();
						cmd.Parameters.Clear();

						Debug.Log("Ajouté !");

						connexionPanel.SetActive(true);
						gameObject.SetActive(false);
					}
					else if(Mail == adresseMail.text)
					{
						Debug.Log("AdresseMail Existe déja !");
						erreurText.text = "Cette AdresseMail est déjà utiliser !";
					}
					else if(Pseudo == pseudo.text)
					{
						Debug.Log("pseudo Existe déja !");
						erreurText.text = "Ce pseudo est déjà utiliser !";
					}
				}
			}
		}
	}

	private bool ValidMail(string mail_address)
	{
     	Regex myRegex = new Regex(@"^([a-zA-Z0-9_\-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$", RegexOptions.IgnoreCase);
     	return myRegex.IsMatch(mail_address);
	}
}

Dernière édition par maliimaloo le 24 Avr 2018 13:33, édité 1 fois.

Moi 1971
Messages : 727
Inscription : 29 Sep 2015 13:38

Re: [AL - DB] vérification adresse Mail et le pseudo.

Message par Moi 1971 » 24 Avr 2018 09:08

Bonjour,
il y a plein de chose qui ne vont pas.
1/ Pourquoi mettre toute ta série de if-else dans l'Update? N'y a t'il pas plein de "Test" qui s'écrivent dans la console Debug? Ne faut-il pas faire une seule fois le test? 25 fois pas seconde ça fait peut-être beaucoup non?

2/ A quel moment dans ton code la fonction "enregistrement()" est-elle appelée? Si elle n'est jamais appelée alors elle ne sera jamais exécutée.

3/ La boucle "while(lire.Read())" ne va pas fonctionner selon moi.
Imaginons que dans ta base de donnée Il y ait :
l'adresse "A" associé au speudo "a"
l'adresse "B" associé au speudo "b"
l'adresse "C" associé au speudo "c"

et que l'utilisateur rentre l'adresse "C" associé au speudo "c".
La première boucle while-read va trouver "A" et "a" différent de "C" et "c" donc ton code va valider le if
"if(Mail != adresseMail.text && Pseudo != pseudo.text)" et donc "C" et "c" sera INSERT dans ta base de donnée.

4/ fautes d’orthographe.
"AdresseMail Existe déja !" => "AdresseMail Existe déjà!"
"Cette AdresseMail est déjà utilisée!"
"Ce pseudo est déjà utilisé!"
(Il n'y a pas d'espace entre le dernière lettre et le signe de ponctuation, ici le "!")

maliimaloo
Messages : 45
Inscription : 28 Sep 2017 19:06

Re: [AL - DB] vérification adresse Mail et le pseudo.

Message par maliimaloo » 24 Avr 2018 09:38

Pour le 1: C'est temporaire que ce soit dans update, c'était pour faire les tests, après même si cela se trouve dans update, j'ai fait en sorte que le script ne se lance qu'au moment où il clique sur le bouton pour aller au Canvas d'enregistrement, donc le script n'est pas activé en permanence, donc cela n'est pas très gros.

Pour le 2: La fonction enregistrement() s'appelle au moment où il clique sur le bouton enregistrement, que j'ai créé dans Unity.

Pour le 3: Que me conseille tu as la place de ma boucle wile(lire. Read()) ?

Pour le 4: Je vais corriger cela :p

j'ai fait un second test

Code : Tout sélectionner

			string verification = "SELECT AdresseMail FROM compteutilisateur WHERE AdresseMail = '"+adresseMail.text+"'";
			MySqlCommand cmdVerifiation = new MySqlCommand(verification, ConnectorBDD.con);
			cmdVerifiation.ExecuteNonQuery();

			if(cmdVerifiation == null)
			{
				Debug.Log("Existe pas !");
			}
			else if(cmdVerifiation != null)
			{
				Debug.Log("Existe!");
			}
			else
			{
				Debug.Log("Erreur!");
			}
Mais cela me marque toujours Debug. Log("Existe!"), alors que normalement si ça le trouve par cela devrait être nul ?

Moi 1971
Messages : 727
Inscription : 29 Sep 2015 13:38

Re: [AL - DB] vérification adresse Mail et le pseudo.

Message par Moi 1971 » 24 Avr 2018 11:17

Alors pour le
1/ => Tu ne devrais pas mettre en "concurrence" du code séquentiel et et du code événementiel. C'est toujours très chaud de faire ce genre de truc et s'il y a moyen de faire simple alors fais simple. Je mettrais tout le code qui se trouve dans l'Update() tel quel au début de la fonction enregistrement(). Y a pas plus simple et y a pas besoin d'autre chose.

2 / Ok.

3/ Je ferais une requête SQL du genre SELECT Mail , Speudo WHERE Mail = LeMailEcrit OR Speudo = LeSpeudoEcrit;
Si un enregistrement est trouvé => Doublon dans la base de donnée Sinon INSERT.

Un autre conseil sur l'utilisation du Debug.Log(). Tu pourrais ajouter un :
Debug.Log("=>"+cmdVerifiation+"<==");
juste avant ton premier if() dans ton nouveau code. Cette information sera beaucoup plus importante pour toi que l'affichage d'un "Existe".

maliimaloo
Messages : 45
Inscription : 28 Sep 2017 19:06

Re: [AL - DB] vérification adresse Mail et le pseudo.

Message par maliimaloo » 24 Avr 2018 11:40

J'ai changé ma fonction Enregistrement(), comme vous m'avez conseillé

Code : Tout sélectionner

	public void enregistrement()
	{
		string msg = ValidMail(adresseMail.text) ? "Adresse valide" : "Adresse invalide";

		if(pseudo.text == "")
			erreurText.text = "Veuillez mettre un Pseudo!"; 
		else if(adresseMail.text == "")
			erreurText.text = "Veuillez mettre une AddreseMail!"; 
		else if(msg == "Adresse invalide")
				erreurText.text = "Veuillez mettre une AdresseMail valide!";
		else if(password.text == "")
			erreurText.text = "Veuillez mettre un Password!"; 
		else if(confirmPassword.text == "")
			erreurText.text = "Veuillez mettre une confirmation de Password!"; 
		else if(password.text != confirmPassword.text)
			erreurText.text = "La confirmation de Password n'est pas correct!";
		else if(pseudo.text.Length <= 4)
			erreurText.text = "Votre pseudo doit contenir 5 caractère minimum!";
		else if(password.text.Length <= 4)
			erreurText.text = "Votre Password doit contenir 5 caractère minimum!";
		else
		{
			verificationOK = true;
			erreurText.text = "";
		}

		if(verificationOK)
		{
			string verification = "SELECT AdresseMail, Pseudo FROM compteutilisateur WHERE AdresseMail = '"+adresseMail.text+"' OR Pseudo = '"+pseudo.text+"'";
			MySqlCommand cmdVerifiation = new MySqlCommand(verification, ConnectorBDD.con);
			cmdVerifiation.ExecuteNonQuery();

			Debug.Log("=>"+cmdVerifiation+"<==");
			
			if(cmdVerifiation.Equals(null))
			{
				Debug.Log("Existe pas !");

				string ajoutUtilisateur = "INSERT INTO compteutilisateur(AdresseMail,Pseudo,Password) VALUE (@adresseMail,@pseudo,@password)";
				MySqlCommand cmd = new MySqlCommand(ajoutUtilisateur, ConnectorBDD.con);
				cmd.Parameters.AddWithValue("@adresseMail", adresseMail.text);
				cmd.Parameters.AddWithValue("@pseudo", pseudo.text);
				cmd.Parameters.AddWithValue("@password", password.text);
				cmd.ExecuteNonQuery();
				cmd.Parameters.Clear();

				Debug.Log("Ajouté !");
			}
			else
			{
				Debug.Log("Existe!");
			}
		}
Mais ma base de données est vide donc cela devrait être nul le résultat, pourtant me marque le Debug. Log("Existe!").

Avec le Debug. Log("=>"+cmd Verifiation+"=="); ajouter avant l'if, j'obtiens ceci dans ma console :
=>MySql.Data.MySqlClient.MySqlCommand<==
UnityEngine.Debug:Log(Object)
Register:enregistrement() (at Assets/Resources/Script/Base De Données/SystemLoginRegister/Register.cs:57)
UnityEngine.EventSystems.EventSystem:Update()
Alors que j'ai écrit ma requête correctement et tous, donc je vois pas d'où peut venir le problème : p

Avatar de l’utilisateur
Wamoga
Messages : 110
Inscription : 16 Jan 2018 14:56

Re: [AL - DB] vérification adresse Mail et le pseudo.

Message par Wamoga » 24 Avr 2018 12:11

je te conseil de mixer le script avec de l'event system, ca divise la complexité de la problématique sur 2 choses distincte ,
le script qui va recevoir les info et les gérer, et 'event system avec l'ui qui va gérer l'envoi des commandes.

par exemple tu a un champ a remplir mais dont le contenu n'est envoyé que quand le joueur clic sur validate etc, c'est de l'event c'est tres simple à utilise

c'est d'autant plus simple que meme quelqu'un qui ne code pas peut modifier et gérer les evenements
si ton code est propre y'auras plus besoin de revenir dessus

maliimaloo
Messages : 45
Inscription : 28 Sep 2017 19:06

Re: [AL - DB] vérification adresse Mail et le pseudo.

Message par maliimaloo » 24 Avr 2018 12:21

Oui c'est sûr, mais cela ne résout pas mon problème hihi :p

Moi 1971
Messages : 727
Inscription : 29 Sep 2015 13:38

Re: [AL - DB] vérification adresse Mail et le pseudo.

Message par Moi 1971 » 24 Avr 2018 12:31

Ok, donc si tu as "=>MySql.Data.MySqlClient.MySqlCommand<==" c'est qu'il y a quelque chose dans "cmdVerifiation" et que donc cela ne peut être vide ni Null
Et ce quelque chose, c'est "MySql.Data.MySqlClient.MySqlCommand" et la log te dit que c'est un Objet! Donc si tu veux tester le résultat de ta requête il te faut accéder à une propriété de ton objet et non à ton objet lui-même. C'est ce que tu faisais dans ton premier code à cet endroit using(MySqlDataReader lire = cmdVerifiation.ExecuteReader()) . pour lire dans ta requête le résultat.

maliimaloo
Messages : 45
Inscription : 28 Sep 2017 19:06

Re: [AL - DB] vérification adresse Mail et le pseudo.

Message par maliimaloo » 24 Avr 2018 13:14

Alors, je vous dis un grand merci à tous ceux qui mon aider j'ai enfin réussie à régler le problème.

Wamoga j'ai suivi ton conseil et diviser mes scripts en deux, et je l'admets que c'est beaucoup plus propre.

Moi1971, grâce à ton dernier commentaire j'ai enfin compris le problème et pus le résoudre.

voici mes scripts finaux :

Script Register.cs

Code : Tout sélectionner

using UnityEngine;
using UnityEngine.UI;
using System.Text.RegularExpressions;
using MySql.Data.MySqlClient;

public class Register : MonoBehaviour 
{
	#region Déclaration
	[SerializeField]
	private InputField adresseMail;
	[SerializeField]
	private InputField pseudo;
	[SerializeField]
	private InputField password;
	[SerializeField]
	private InputField confirmPassword;
	[SerializeField]
	private Text erreurText;
	[SerializeField]
	private GameObject connexionPanel;
	private bool verificationOK = false;
	#endregion

	#region Fonction_D'enregistrement
	public void enregistrement()
	{
		verificationAll();

		if(verificationOK)
		{
			RegisterCommands.VerificationMailPseudo(adresseMail.text, pseudo.text, adresseMail.text, pseudo.text, password.text);
		}
	}
	#endregion

	#region Fonction_Verification_Enregistrement
	private void verificationAll()
	{
		string msg = ValidMail(adresseMail.text) ? "Adresse valide" : "Adresse invalide";

		if(pseudo.text == "")
			erreurText.text = "Veuillez mettre un Pseudo!"; 
		else if(adresseMail.text == "")
			erreurText.text = "Veuillez mettre une AddreseMail!"; 
		else if(msg == "Adresse invalide")
				erreurText.text = "Veuillez mettre une AdresseMail valide!";
		else if(password.text == "")
			erreurText.text = "Veuillez mettre un Password!"; 
		else if(confirmPassword.text == "")
			erreurText.text = "Veuillez mettre une confirmation de Password!"; 
		else if(password.text != confirmPassword.text)
			erreurText.text = "La confirmation de Password n'est pas correct!";
		else if(pseudo.text.Length <= 4)
			erreurText.text = "Votre pseudo doit contenir 5 caractère minimum!";
		else if(password.text.Length <= 4)
			erreurText.text = "Votre Password doit contenir 5 caractère minimum!";
		else
		{
			verificationOK = true;
			erreurText.text = "";
		}
	}
	#endregion

	#region Fonction_Verification_AdresseMail
	private bool ValidMail(string mail_address)
	{
     	Regex myRegex = new Regex(@"^([a-zA-Z0-9_\-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$", RegexOptions.IgnoreCase);
     	return myRegex.IsMatch(mail_address);
	}
	#endregion
}
Script RegisterCommands.cs

Code : Tout sélectionner

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using MySql.Data.MySqlClient;

public class RegisterCommands : MonoBehaviour
{
	public static void AjoutUtilisateur(string AdresseMail, string Pseudo, string Password)
	{
		string ajoutUtilisateur = "INSERT INTO compteutilisateur(AdresseMail,Pseudo,Password) VALUE (@adresseMail,@pseudo,@password)";
		MySqlCommand cmd = new MySqlCommand(ajoutUtilisateur, ConnectorBDD.con);
		cmd.Parameters.AddWithValue("@adresseMail", AdresseMail);
		cmd.Parameters.AddWithValue("@pseudo", Pseudo);
		cmd.Parameters.AddWithValue("@password", Password);
		cmd.ExecuteNonQuery();
		cmd.Parameters.Clear();
	}

	public static void VerificationMailPseudo(string VerifAdresseMail, string VerifPseudo, string adresseMail, string pseudo, string password)
	{
		string verification = "SELECT AdresseMail, Pseudo FROM compteutilisateur WHERE AdresseMail = '"+VerifAdresseMail+"' OR Pseudo = '"+VerifPseudo+"'";
		MySqlCommand cmdVerifiation = new MySqlCommand(verification, ConnectorBDD.con);
		using(MySqlDataReader lire = cmdVerifiation.ExecuteReader())
		{
			if(lire.Read())
			{
				lire.Close();
				Debug.Log("Données déjà éxistente!!");
			}
			else
			{
				lire.Close();
				AjoutUtilisateur(adresseMail, pseudo, password);
			}
		}
	}
}

Répondre

Revenir vers « (C#) CSharp »