Eviter les doublons dans la bdd
jobouille
Messages postés
356
Statut
Membre
-
jobouille Messages postés 356 Statut Membre -
jobouille Messages postés 356 Statut Membre -
Bonjour à tous !
Je viens de créer un système d'amis entre membres
Je peux ajouter quelqu'un comme ami quand je veux, pas besoin que cet ami confirme.
J'ai créer une table amis dans la bdd qui comporte 3 colonnes :
id : ben c'est l'id tout simplement ^^
pseudo : le pseudo du membre qui clique sur "Ajouter comme ami"
pseudoAmi : le pseudo de l'ami que l'on vient d'ajouter
Cependant, si la personne rajoute le même ami, cela créé une nouvelle ligne dans la bdd.
Je ne sais pas comment faire pour éviter cela.
Il aurait été sympa qu'on message apparaisse pour signaler que la personne est déjà ami avec ce membre.
Voici le code qui permet d'ajouter un ami (et qui fonctionne) :
Comment faire ?
Merci et bonne soirée :)
Je viens de créer un système d'amis entre membres
Je peux ajouter quelqu'un comme ami quand je veux, pas besoin que cet ami confirme.
J'ai créer une table amis dans la bdd qui comporte 3 colonnes :
id : ben c'est l'id tout simplement ^^
pseudo : le pseudo du membre qui clique sur "Ajouter comme ami"
pseudoAmi : le pseudo de l'ami que l'on vient d'ajouter
Cependant, si la personne rajoute le même ami, cela créé une nouvelle ligne dans la bdd.
Je ne sais pas comment faire pour éviter cela.
Il aurait été sympa qu'on message apparaisse pour signaler que la personne est déjà ami avec ce membre.
Voici le code qui permet d'ajouter un ami (et qui fonctionne) :
if(isset($_GET['pseudo']))
{
$pseudoAmi = htmlspecialchars($_GET['pseudo']);
$reqpseudo = $bdd->prepare("SELECT * FROM membres WHERE pseudo = ?");
$reqpseudo->execute(array($pseudo));
$pseudoexist = $reqpseudo->fetch();
if($pseudoexist == false)
{
$insertAmi = $bdd->prepare("INSERT INTO amis(pseudo, pseudoAmi) VALUES(?, ?)");
$insertAmi->execute(array($user['pseudo'], $pseudoAmi));
$_SESSION['error'] = "".$pseudoAmi." a été ajouté dans votre liste d'amis !";
header('Location: amis.php');
}
else
{
header('Location:amis.php');
$_SESSION['error'] = "Le pseudo n'existe pas";
exit;
}
}
Comment faire ?
Merci et bonne soirée :)
2 réponses
-
Bonsoir,
A la place d'un INSERT tu peux utiliser un REPLACE.
Penses également à définir le couple "pseudo, pseudoAmi" comme clé unique.
ALTER TABLE amis ADD UNIQUE `unique_index`(pseudo, pseudoAmi);
Au passage... voici ton code corrigé et quelque peu amélioré.// Récupéaration Propre des variables AVANT de les utiliser $pseudo = !empty($_GET['pseudo'])?$_GET['pseudo'] : NULL; if($pseudo) { $pseudoAmi = htmlspecialchars($pseudo); $sql = "SELECT * FROM membres WHERE pseudo = :pseudo" ; $params = array(":pseudo"=>$pseudo); try{ $reqpseudo = $bdd->prepare($sql); $reqpseudo->execute($params); $resultat = $reqpseudo->fetchall(); }catch(Exception $e) { echo "<pre><br>".$e->getMessage()."<br>"; echo "</pre>"; exit; } if(count($resultat)>0){ //Ce pseudo existe dans la BDD $sql = "REPLACE INTO amis(pseudo, pseudoAmi) VALUES(:userPseudo, :pseudoAmi)"; $params = array(":userPseudo"=>$user['pseudo'], ":pseudoAmi"=>$pseudoAmi); try{ $insertAmi = $bdd->prepare($sql); $insertAmi->execute($params); }catch(Exception $e) { echo "<pre><br>".$e->getMessage()."<br>"; echo "</pre>"; exit; } $_SESSION['error'] = $pseudoAmi." a été ajouté dans votre liste d'amis !"; header('Location: amis.php'); exit; }else{ //Le pseudo n'existe pas $_SESSION['error'] = "Le pseudo n'existe pas"; header('Location:amis.php'); exit; } } // Fin if($pseudo)
-
-
Oui.
Il te suffit de faire un SELECT sur ta table avant l'ajout .... et si la requête retourne un résultat.. afficher qq chose.
// Récupéaration Propre des variables AVANT de les utiliser $pseudo = !empty($_GET['pseudo'])?$_GET['pseudo'] : NULL; if($pseudo) { $pseudoAmi = htmlspecialchars($pseudo); $sql = "SELECT * FROM membres WHERE pseudo = :pseudo" ; $params = array(":pseudo"=>$pseudo); try{ $reqpseudo = $bdd->prepare($sql); $reqpseudo->execute($params); $resultat = $reqpseudo->fetchall(); }catch(Exception $e) { echo "<pre><br>".$e->getMessage()."<br>"; echo "</pre>"; exit; } if(count($resultat)>0){ // Le pseudo du user existe en BDD ... // on regarde si ils sont déjà amis : $sql = "SELECT * FROM amis WHERE pseudo = userPseudo AND pseudoAmi = :pseudoAmi"; $params = array(":userPseudo"=>$user['pseudo'], ":pseudoAmi"=>$pseudoAmi); try{ $reqpseudo = $bdd->prepare($sql); $reqpseudo->execute($params); $resultat2 = $reqpseudo->fetchall(); }catch(Exception $e) { echo "<pre><br>".$e->getMessage()."<br>"; echo "</pre>"; exit; } if(count($resultat2)>0){ // Il y a déjà une entrée existante dans la BDD $_SESSION['error'] = "Vous êtes déjà amis...."; header('Location:amis.php'); }else{ // ici tu mets le code d'insertion en BDD $sql = "REPLACE INTO amis(pseudo, pseudoAmi) VALUES(:userPseudo, :pseudoAmi)"; $params = array(":userPseudo"=>$user['pseudo'], ":pseudoAmi"=>$pseudoAmi); try{ $insertAmi = $bdd->prepare($sql); $insertAmi->execute($params); }catch(Exception $e) { echo "<pre><br>".$e->getMessage()."<br>"; echo "</pre>"; exit; } $_SESSION['error'] = $pseudoAmi." a été ajouté dans votre liste d'amis !"; header('Location: amis.php'); exit; } }else{ //Le pseudo n'existe pas $_SESSION['error'] = "Le pseudo n'existe pas"; header('Location:amis.php'); exit; } } // Fin if($pseudo) -
-
-
-
-
Au nivaeu de ta base de données, elle deviendra rapidement ingérable (quid du changement de pseudo par exemple).
Je te conseille de créer au minimum deux tables:- la première membres(id, pseudo, e-mail...)
- la seconde amis (id_membre, id_ami...) contiendra les relations d'amitié
Lors de l'ajout d'un lien d'amitié, c'est cette seconde table qui contiendra un nouveau t-uple. La première table ne contiendra que les informations personnelles des membres