Insérer une valeur unique dans une table

Fermé
jacobmax - Modifié le 11 oct. 2018 à 18:19
 jacobmax - 11 oct. 2018 à 22:03
Bonjour à tous, mon script ci-dessous permet l'insertion en Mysql-PDO dans une base de données mysql, le script fonctionne très bien lors des insertions mais le soucis est le faite qu'elle enregistre également des valeurs dupliqué. Dans mon cas, l'index "A" devra être une valeur unique dans toute la table.
Comment faire pour permettre à mon script de détecter
- si la valeur "A" existe déjà = Redirection vers une page "cette_valeur_existe_deja.php"
- si la valeur "A" n'existe pas = Insertion dans la base de données et redirection "enregistrement_reussit.php"
Note: code simplifié.

require_once('../connexion_a_la_base_de_donnes.php');

$ps = $pdo->prepare("INSERT INTO pricelist (
 A, 
 B, 
 C, 
 D, 
 E) VALUES (?,?,?,?,?)");

$params = array(
 $A, 
 $B, 
 $C, 
 $D, 
 $E);

$ps->execute($params);

header("location:../app/mypage.php");
A voir également:

1 réponse

Salut,
par définition chaque valeur insérée dans une table de donnée d'une base est unique. Sinon il serais impossible de garder l'intégrité de la base.
Ex: 2 personnes s'appellent Dupont, chacun à une colonne d'article achetés sur un site marchand. Si il n'y a pas moyen de savoir lequel est l'un ou l'autre autant jeter la base et tout le reste du programme...
C'est cela qu'on appelle unique en général en Base de données, il ne peut y avoir qu'un seul Pierre Dupont né à sa date de naissance. Les 3 champs (prénom, nom de famille, date de naissance) sont considérés comme identifiants(naturels) car les seuls à permettre l'unicité des données.

Bon je m'éloigne, revenons à votre question sur le cas d'éviter les doublons. Vous mettez du PHP mais la réponse n'est pas là.
Tout se joue du côté de SQL, il ne faut pas confondre les 2. PHP est un langage serveur dont le seul but est de faire la liaison entre la page HTML et la Base de données. D'un côté il permet d'ouvrir une connexion et d'envoyer des requêtes SQL, de l'autre il permet d'écrire le résultat de ces requêtes(fonction echo("mon HTML littéral...".$unevariablesionaenvie); ).

SQL est simple et fonctionnel, adapté à tout ce qu'on peut vouloir faire avec une base de données.
La possibilité de faire des sous-requêtes permet une imbrication des structures du langage(langage de bas niveau contenant peu d'instructions et assez éloigné des abstractions humaines, en clair il ne gère que les données et ne sert qu'à ça).


La logique pour trouver si un doublon existe passe donc par une requête(ou plusieurs si on prends en compte les sous requêtes):

I: écrire la requête qui permet d'obtenir la/les valeurs déjà enregistrée (commande SELECT avec WHERE https://sql.sh/cours/where )
II:comparer la valeur à insérée avec les résultats obtenus (encore SELECT WHERE)

Schématisons la requête à obtenir, les '[' et ']' indiquent la sous-requête

SELECTionne * WHERE [SELECTionne dans la table 'pricelist' WHERE clause éventuelle (facultative)] === 'valeur à tester'

(le symbole étoile et l'équivalent de tout(ici sélect tout ce qui correspond à ma clause where) et le '===' signifiant strictement égal évidemment).
Le résultat de la requête est nul si 'valeur à tester' n'existe pas dans la table. Il y aura un ou plusieurs résultats selon le nombre de doublons existants.

Vous pouvez vous aider du site que j'ai indiqué en lien. N'hésitez pas non plus à tester avec la console SQL. Vous repérerez vites si vous faites une erreur et si le résultat correspond à ce que voulez de la base.

ps: encore mieux en utilisant COUNT * SELECT, vous obtiendrez directement le nombre de doublon(si 0 =>ok on insére, si >0 => message d'erreur, doublon pas d'insertion)

ps2: évidemment à la place de 'valeur à tester' on peut utiliser une $variable PHP
0
En moins théorique ça peut ressembler à ça:
IF(SELECT COUNT  (SELECT * FROM 'nom_table' WHERE 'nom du champ' ='.$valeurtestée.'))>0 INSERT INTO 'nom_de_la_table VALUES (nom_du_champ) ($valeurtestée) ) 

voilà simple et balèze SQL n'est ce pas?
ps:SQL à vérifier pour toute erreur de frappe(en décomposant chaque sous-requête et testant c'est plus simple)
ps2: faire les 2 premières sous-requête(sans le if) pour orienter sur un message d'erreur(doublon existe) ou confirmer l'enregistrement(pas de doublon) et traiter le résultat avec PHP (if===0 =>ok, iF >0 =>pas ok il y a doublon).
0
Bjour et merci de votre réponse, visiblement ce script n'insère que la valeur testé, de plus, elle n'affiche pas de message disant "Cette valeur (ou ex: Cet utilisateur) existe déjà" et c'est uniquement le cas où la valeur n'existe pas qu'elle est supposé INSERER
0