Eviter les doublons dans la bdd

Fermé
jobouille Messages postés 286 Date d'inscription jeudi 11 juin 2009 Statut Membre Dernière intervention 27 septembre 2017 - 31 juil. 2015 à 00:19
jobouille Messages postés 286 Date d'inscription jeudi 11 juin 2009 Statut Membre Dernière intervention 27 septembre 2017 - 2 août 2015 à 12:59
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) :

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 :)
A voir également:

2 réponses

jordane45 Messages postés 38346 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 16 décembre 2024 4 718
31 juil. 2015 à 01:08
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)


0
jobouille Messages postés 286 Date d'inscription jeudi 11 juin 2009 Statut Membre Dernière intervention 27 septembre 2017 10
31 juil. 2015 à 14:40
Merci beaucoup, tout fonctionne !

Je tenais juste à vous féliciter car la plupart du temps, c'est vous qui répondez aux problèmes php et de manière brillante :)

Enfin, serait-il possible de rajouter un peu de code qui signale si on a déjà cette personne comme ami ?

Encore merci :)
0
jordane45 Messages postés 38346 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 16 décembre 2024 4 718
Modifié par jordane45 le 31/07/2015 à 16:52
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)

0
jobouille Messages postés 286 Date d'inscription jeudi 11 juin 2009 Statut Membre Dernière intervention 27 septembre 2017 10
1 août 2015 à 23:41
ça ne fonctionne pas :/

C'est toujours écrit "$pseudoAmi a été ajouté dans votre liste d'amis !"
0
jordane45 Messages postés 38346 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 16 décembre 2024 4 718
2 août 2015 à 00:20
Il manque un ":" dans la requête SELECT devant la variable userPseudo
0
jobouille Messages postés 286 Date d'inscription jeudi 11 juin 2009 Statut Membre Dernière intervention 27 septembre 2017 10
2 août 2015 à 12:59
Parfait ça fonctionne !

Merci beaucoup ! :D
0
jisisv Messages postés 3645 Date d'inscription dimanche 18 mars 2001 Statut Modérateur Dernière intervention 15 janvier 2017 934
31 juil. 2015 à 01:16
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
0
jobouille Messages postés 286 Date d'inscription jeudi 11 juin 2009 Statut Membre Dernière intervention 27 septembre 2017 10
31 juil. 2015 à 14:38
Il est effectivement plus logique de faire ainsi. Cependant il est impossible aux membres du site de changer leur pseudo.
Pour le moment je laisse comme ça, mais je garde en tête votre solution, merci :)
0