Pourquoi pas, encore que là c'est un peu radical.Citation:
Je mets mes champs joueur1 et joeuur2 en clé primaire et dans le or die de la requete j'explique que si l'insertion marche pas c'est que le match a déjà eu lieu !
Mais ceci n'empêchera pas de créer le match retour, chose où tu dis qu'il ne devrait pas être possible.
Exemple : (table rounds)
joueur1 | joueur2
123 | 789
789 | 123
123 | 123
789 | 789
Ici, les 2 joueurs auront fait 2 parties d'échec entre eux (aller/retour), et même les faire jouer contre eux même. La base de donnée ne l'empêchera pas, il n'y aura pas de retour d'erreur.
Si 1 match a déjà eu lieu entre ces 2 joueurs :
joueur1 | joueur2
123 | 789
Et qu'on tente de les faire à nouveau jouer entre eux, comme 789 contre 123, le seul moyen de l'éviter c'est de faire une requête pour vérifier si une ligne existe :
Cette requête retourne qu'1 seule ligne, et la valeur de "total" retournera 0 ou 1Code:
1
2
3
4
5
6 SELECT COUNT(*) AS total FROM rounds WHERE (joueur1 = 123 AND joueur2 = 789) OR (joueur1 = 789 AND joueur2 = 123) OR (joueur1 = 123 AND joueur2 = 123) OR (joueur1 = 789 AND joueur2 = 789)
Si c'est 1 -> Erreur, la rencontre a déjà eu lieu ou non autorisée : Pas d'insertion
Si c'est 0 -> Ok, on effectue l'insertion
Ici, on évite 4 choses potentiellement possible en 1 opération.
Les valeurs de joueurs1 et joueur2 tu les as, c'est le tableau $joueurs.
De plus, si on raisonne un peu, faire la requête avec le rand() (table joueur_licencie) n'est géantissime, car obtenir un duo au tout début d'un tournoi, ça va être facile, mais après, par la suite, et pour les derniers joueurs très particulièrement, ça risque d'être compliqué d'obtenir des joueurs qui ne se seront pas encore rencontrés.
Faudrait trouver un autre moyen à mon avis.