eviter les doublons en php

Eléphanteau du PHP | 29 Messages

31 janv. 2007, 11:15

Bonjour,

Je vous explique mon petit problème.
Je dois refaire un bout de code en php pour un site web. Mon boss m'a demandé d'eviter les doublons dans ma base de donnée! C'est a dire que si une personne rentre une adresse mail et bien mon code doit verifier l'adresse dans la base avant de l'enregistrer ! Si celle ci existe je dois afficher un message sinon l'enregistrer dans la base
Voici mon code !!
<?
if(isset($_POST) && strlen($_POST['mail']) > 0 )		
{
	if(isset($_POST['inscription']) == true)
	{
	if(ereg("^(.+)@(.+)\\.(.+)$", $_POST['mail']))
		{
	$requete_txt = "INSERT INTO `test` ( `email` , `site_id` ) VALUES ( '".$_POST['mail']."', '".$site_id."');";
   $bdd->query($requete_txt);  
   hydrus_utils_alert("Votre adresse a bien été enregistrée");
	//print("Votre adresse a bien été enregistrée");
		}
			else
			{
	hydrus_utils_alert("Veuillez entrer une adresse valide !");
			}
	}
else if(isset($_POST['desinscription']) == true)
	{
	if(ereg("^(.+)@(.+)\\.(.+)$", $_POST['mail']))
		{
	    $requete_txt = "DELETE FROM `test` WHERE `email` = '".$_POST['mail']."' AND `site_id` = '".$site_id."' ";
		$bdd->query($requete_txt);
		hydrus_utils_alert("Votre adresse a bien été supprimée");
		//print("Votre adresse a bien été supprimée");
		}
			else
			{
	hydrus_utils_alert("Veuillez entrer une adresse valide !");
			}
	}
}
?>
Ca c'est le code qui ne verifie pas l'adresse!
Maintenant voici ce que j'ai fais mais ca ne fonctionne pas !! Ne vous moquez pas trop de moi je debute en php !!
<?
 mysql_connect("localhost"); 
 mysql_select_db("test"); 
 
if(isset($_POST) && strlen($_POST['mail']) > 0 )		
{
	if(isset($_POST['inscription']) == true)
	{
	if(ereg("^(.+)@(.+)\\.(.+)$", $_POST['mail']))
		{
	$requete_txt = "INSERT INTO `test` ( `email` , `site_id` ) VALUES ( '".$_POST['mail']."', '".$site_id."');";
    $bdd->query($requete_txt);  
    hydrus_utils_alert("Votre adresse a bien été enregistrée");

$sql = "SELECT * FROM corolle_mailing WHERE email='".$mail."'"; 
$req = mysql_query($sql) or die('Erreur SQL !'.$sql.'<br>'.mysql_error()); 
$res = mysql_num_rows($req); 
if($res!=0)
{ 
echo '<font color="red">Désolé, mais plusieurs infos existent déjà dans notre base.</font>'; 
} 
else // Les infos n'existent pas, on insère les informations du formulaire dans la table 
{ 

// insertion des valeurs dans la base 
$query = "DELETE FROM `test` WHERE `email` = '".$_POST['mail']."' AND `site_id` = '".$site_id."' ";
$result= mysql_query($query);  
} 
mysql_close();
	//print("Votre adresse a bien été enregistrée");
		}
			else
			{
	hydrus_utils_alert("Veuillez entrer une adresse valide !");
			}
	}
else if(isset($_POST['desinscription']) == true)
	{
	if(ereg("^(.+)@(.+)\\.(.+)$", $_POST['mail']))
		{
	    $requete_txt = "DELETE FROM `test` WHERE `email` = '".$_POST['mail']."' AND `site_id` = '".$site_id."' ";
		$bdd->query($requete_txt);
		hydrus_utils_alert("Votre adresse a bien été supprimée");
		//print("Votre adresse a bien été supprimée");
		}
			else
			{
	hydrus_utils_alert("Veuillez entrer une adresse valide !");
			}
	}
}
?>
Merci d'avance ..

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

31 janv. 2007, 12:43

tu ne travailles pas sur les mêmes tables tu ne peut donc vérifier l'existance d'un mail :-k

Tout ce que tu as à faire est un SELECT avec un clause WHERE sur l'email POST et un test if() avant cette ligne :
$requete_txt = "INSERT INTO `test` ( `email` , `site_id` ) VALUES ( '".$_POST['mail']."', '".$site_id."');";
tu le fait après... forcément les données sont déjà enregistrées !

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

Eléphanteau du PHP | 29 Messages

31 janv. 2007, 13:22

Je sais mais j'ai fais du copier coller et j'ai chié dans les tables !!
Etant donné que je ne connais pas trop le code PHP bah tu me dis de mettre un if mais je ne vois pas ou ! Je debute vraiment ! Je cherche un peu partout sur les forum mais c'est pas evident !!
j'e n'ai pas été formé sur le code mais j'ai eu une formation d'Administrateur réseau !
forcément c'est pas evident ! Donc si tu pouvais m'aider un peu plus je te serai reconnaissant !!
Merci

Administrateur PHPfrance
Administrateur PHPfrance | 11457 Messages

31 janv. 2007, 13:51

j'ai chié dans les tables !!
Modération :
cy4nur3, sur PHPFrance, le forum étant public,
nous veillons particulièrement à l'expression correcte des membres.

Ainsi, nous refusons les propos contestables,
le style SMS, les fautes d'orthographe, etc.

Merci d'écrire correctement :
j'ai chié dans l'étable
:langue:

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

31 janv. 2007, 14:13

Bah moi je veux bien mais si c'est pas ton rôle... un admin réseau n'est pas [forcément] développeur (moi je suis plutot moyen en réseau => j'y touche pas :wink: )
tu me dis de mettre un if mais je ne vois pas ou !
test if() avant cette ligne :
$requete_txt = "INSERT INTO `test` ( `email` , `site_id` ) VALUES ( '".$_POST['mail']."', '".$site_id."');";
Pas assez clair :-k

C'est une question de logique, il faut tester avant d'enregistrer :

if(isset($_POST['inscription']) == true)
{
	if(ereg("^(.+)@(.+)\\.(.+)$", $_POST['mail']))
	{
		// a adapter selon ta configuration, utilisation de la méthode "query()"
		$retour = $bdd->query("SELECT email FROM test WHERE email = '".$_POST['mail']."'");
		if($retour)
		{
			hydrus_utils_alert("E-mail existant !!");
		}
		else
		{
			// On peut enregistrer 
			$requete_txt = "INSERT INTO `test` ( `email` , `site_id` ) VALUES ( '".$_POST['mail']."', '".$site_id."');";
			$bdd->query($requete_txt);  
			hydrus_utils_alert("Votre adresse a bien été enregistrée");		
		}
	}
	else
	{
		hydrus_utils_alert("Veuillez entrer une adresse valide !");
	}
} 

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

Eléphanteau du PHP | 29 Messages

31 janv. 2007, 15:18

Je suis dégouté ca ne fonctionne pas !!
il ne m'insere pas le mail ! il me ts qu'il est deja dans la base or que la base et vide.

Eléphant du PHP | 445 Messages

31 janv. 2007, 15:38

Montre nous plutôt ton code, sans, on ne peut pas faire grand chose.

Et tant qu'à faire, montre nous aussi la structure de ta table, sait-on jamais.
LLDC
Ulti

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

31 janv. 2007, 15:41

// a adapter selon ta configuration, utilisation de la méthode "query()"
		$retour = $bdd->query("SELECT email FROM test WHERE email = '".$_POST['mail']."'");
la méthode renvoie "TRUE" apparemment... as tu adapté

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

Eléphanteau du PHP | 29 Messages

31 janv. 2007, 15:44

Voici mon script en PHP !


Code : Tout sélectionner

<? if(isset($_POST) && strlen($_POST['mail']) > 0 ) { if(isset($_POST['inscription']) == true) { if(ereg("^(.+)@(.+)\\.(.+)$", $_POST['mail'])) { $retour = $bdd->query("SELECT email FROM test WHERE email = '".$_POST['mail']."'"); if($retour) { hydrus_utils_alert("E-mail existant !!"); } else { $requete_txt = "INSERT INTO test ( `email` , `site_id` ) VALUES ( '".$_POST['mail']."', '".$site_id."');"; $bdd->query($requete_txt); hydrus_utils_alert("Votre adresse a bien été enregistrée"); } } else { hydrus_utils_alert("Veuillez entrer une adresse valide !"); } } else if(isset($_POST['desinscription']) == true) { if(ereg("^(.+)@(.+)\\.(.+)$", $_POST['mail'])) { $requete_txt = "DELETE FROM `test` WHERE `email` = '".$_POST['mail']."' AND `site_id` = '".$site_id."' "; $bdd->query($requete_txt); hydrus_utils_alert("Votre adresse a bien été supprimée"); //print("Votre adresse a bien été supprimée"); } else { hydrus_utils_alert("Veuillez entrer une adresse valide !"); } } } ?>
Voili voilou

Eléphanteau du PHP | 29 Messages

31 janv. 2007, 15:47

Bah je veux bien adapté mais je ne connais pas grand chose en php !!
Je code avec les bribes de tuto qu'il y a sur le net !!

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

31 janv. 2007, 18:38

peut être mais on ne connais pas ta classe "mysql"

comment accèdes tu au données d'une requete select ? c'est tout suffit de regarder dans la classe ou un code qui y ressemble (requete SELECT)

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

Petit nouveau ! | 9 Messages

31 janv. 2007, 23:58

Salut a toi,

T’a plein de façon de faire...
Mais avant tout, et le plus propre est de modifier ta table pour éviter les doublons. (Normalement, elle devrait déjà avoir une clé primaire).
Exécute le SQL suivant pour éviter les doublons :

Code : Tout sélectionner

CREATE UNIQUE INDEX test_i1 on test (email, site_id) ou CREATE UNIQUE INDEX test_i2 on test (email) /*Un mail unique dans la table*/
Ensuite, le code...
Simple et sans message et sans contrôle!
@mysql_query("INSERT INTO test(email,site_id) VALUES('$email','$siteId')");  
Avec suppression force avant l'insertion :
mysql_query("DELETE FROM test WHERE email='$email' AND site_id='$siteId'");
mysql_query("INSERT INTO test(email,site_id) VALUES('$email','$siteId')");
Avec mise a jour (Uniquement si on veux changer le site_id d'un mail. Cas du mail unique) :
//selection d'existance
mysql_query("SELECT email, site_id FROM test WHERE email='$email'");
//test si on trouve un enregistrement
if($row = mysql_fetch_array($result, MYSQL_ASSOC)){
     //enregistrement trouvé - mise à jour
     mysql_query("UPDATE test SET site_id='$siteId' WHERE email='$email'");
}else{
     //email inconnu - ajout
     mysql_query("INSERT INTO test(email,site_id) VALUES('$email','$siteId')");
} 
Pour lire un select:
mysql_query("SELECT email, site_id FROM test");
echo "<table>
            <tr><td>Email</td><td>Site ID</td></tr>\n";
//Boucle sur les enregsitrements et place les lignes dans le tableau $row
while ($row = mysql_fetch_array($result, MYSQL_ASSOC)){
   echo "\t<tr><td>".$row["email"]."</td><td>".$row["site_id"]."</td></tr>\n";
}
echo "</table>\n";
Attention, pas de copier coller sans comprendre.
Je n'ai ni tester ni relu... donc quelle que erreur possible!

_______________________
Utile pour être compris : Convention de codage bien fait : http://www.gaidot.net/regis/publication ... le.fr.html
(La page semble être accesible que de temps en temps - domage)

Invité
Invité n'ayant pas de compte PHPfrance

01 févr. 2007, 12:12

Merci les gas !! ca marche maintenant !!