Verifier avant d'ajouter un sujet
ladj59 Messages postés 322 Statut Membre -
j'ai une table (base_physique)avec des sujets et une autre table(sujets) avec d'autres sujets
Tous les sujets de base_physique sont forcément dans mon formulaire et quand je rajoute un sujet dans la table sujets, je le rajoute que s'il n'est pas déja présent dans la table base_physique
il faut donc que a chaque fois que je rajoute un sujet dans la table sujets, je verifie qu'il ne soitr pas déja present dans la table base_physique
Comment faire svp???
Configuration: Windows XP Internet Explorer 7.0
38 réponses
- 1
- 2
Problème : à chaque ajout d'un sujet dans la table sujets, vérifier qu'il n'existe pas déjà dans base_physique afin de l'insérer uniquement s'il est bien absent.
Plusieurs approches ont été proposées, notamment compter les occurrences dans sujets et insérer si le compte vaut zéro, ou utiliser une clause NOT EXISTS dans l'insertion pour éviter les doublons.
Des réponses signalent des erreurs de syntaxe, notamment l'utilisation incorrecte de COUNT(*) et la tentative d'INSERT ... WHERE NOT EXISTS, et conseillent de corriger la requête ou de scinder en deux scripts.
Pour une solution pratique, une insertion avec SELECT ... WHERE NOT EXISTS (SELECT 1 FROM base_physique WHERE sujet = '$sujet2') permet d'éviter les doublons sans étape préalable.
-
Bonjour,
Tu peux faire cela :mysql_query = "INSERT INTO sujet VALUES .... IF NOT EXIST (SELECT * FROM base_physique WHERE .....)";
J'espère que ça te va...-
j'ai essayé cela et ca ne marche pas et je comprends pas pourquoi
if(isset($_POST['sujet2']))
{
//ajout à la bdd
$sujet2=$_POST['sujet2'];
$nombre2=mysql_query("SELECT COUNT (*) AS nombre2 FROM sujets WHERE sujet2 ='$sujet2'");
$n2=$nombre2['nombre2'];
// nombre correspond au nombre de fois où le sujet est déjà présent
//s'il vaut 0 on l'ajoute sinon on passe
if ($n2==0)
{
mysql_query("INSERT INTO sujets VALUES('', '$sujet2') IF NOT EXIST (SELECT * FROM base_physique WHERE sujet LIKE '".$sujet2."'");
}
}
?>
-
-
Je suppose qu'avant tu as mis tout ce qu'il fallait (mysql_connect, etc) J'espère que oui mais on ne sait jamais, mieux vaut demander...
Partons du principe que ce n'est pas cela le problème. On va partir dans du débugageif(isset($_POST['sujet2'])) { echo "on est bien entré dans le if isset <BR/>"; //ajout à la bdd $sujet2=$_POST['sujet2']; $nombre2=mysql_query("SELECT COUNT (*) AS nombre2 FROM sujets WHERE sujet2 ='$sujet2'") or die(mysql_error()); $n2=$nombre2['nombre2']; echo "n2 vaut $n2 <BR />"; // nombre correspond au nombre de fois où le sujet est déjà présent //s'il vaut 0 on l'ajoute sinon on passe if ($n2==0) { echo "on est bien entré dans la boucle if ==0 <BR />" $sql="INSERT INTO sujets VALUES('', '$sujet2') IF NOT EXIST (SELECT * FROM base_physique WHERE sujet LIKE '".$sujet2."'"; echo "La requète SQL qui va se lancer est : $sql"; mysql_query($sql) or die(mysql_error(); } }
Tu lance ça et normalement ça devrait t'apporter des infos intéressantes tu n'a qu'à me donner les infos que tu obtiens et je te dirais ce que ça vaut -
Effectivement j'avais pas vu l'erreur pourtant hyper classique : il ne faut pas mettre d'espace entre le COUNT et la parenthèse
Donc ceci devrait fonctionner :if(isset($_POST['sujet2'])) { //ajout à la bdd $sujet2=$_POST['sujet2']; $nombre2=mysql_query("SELECT COUNT(*) AS nombre2 FROM sujets WHERE sujet2 ='$sujet2'"); $n2=$nombre2['nombre2']; // nombre correspond au nombre de fois où le sujet est déjà présent //s'il vaut 0 on l'ajoute sinon on passe if ($n2==0) { mysql_query("INSERT INTO sujets VALUES('', '$sujet2') IF NOT EXIST (SELECT * FROM base_physique WHERE sujet LIKE '".$sujet2."'"); } } ?> -
ok merci le probleme la est réglé mais maintenant il y a un autre probleme qui est :
on est bien entré dans le if isset
n2 vaut
on est bien entré dans la boucle if ==0
La requète SQL qui va se lancer est : INSERT INTO sujets VALUES('', 'le silice') IF NOT EXIST (SELECT * FROM base_physique WHERE sujet LIKE 'le silice'You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'IF NOT EXIST (SELECT * FROM base_physique WHERE sujet LIKE 'le silice'' at line 1 -
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question -
OUPS avec un "s" à EXIST je pense que ça marchera mieux
:oops: :pas taper: -
-
ca me mets encore cela quans je mets EXISTS
on est bien entré dans le if isset
n2 vaut
on est bien entré dans la boucle if ==0
La requète SQL qui va se lancer est : INSERT INTO sujets VALUES('', 'iii') IF NOT EXISTS (SELECT * FROM base_physique WHERE sujet LIKE 'iii'You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'IF NOT EXISTS (SELECT * FROM base_physique WHERE sujet LIKE 'iii'' at line 1 -
et avec un WHERE NOT EXISTS à la place du IF NOT EXISTS ? Excuse moi mais en fait ça fait longtemps que j'avais pas utilisé cela d'où mes retards à l'allumage...
-
ca marche toujours pas snif
au fait c'est normal que ca ne ette pas la valeur de n2 vaut
j'ai vraiment besoin que ca marche, tu ne vois pas un autre truc
c'est simpa de m'aider
on est bien entré dans le if isset
n2 vaut
on est bien entré dans la boucle if ==0
La requète SQL qui va se lancer est : INSERT INTO sujets VALUES('', 'tt') WHERE NOT EXISTS (SELECT * FROM base_physique WHERE sujet LIKE 'tt'You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'WHERE NOT EXISTS (SELECT * FROM base_physique WHERE sujet LIKE 'tt'' at line 1 -
Mouaif effectivement c'est pas normal mais bon vu que tu rentres dans la boucle c'est pas non plus la mort...
essaye ça :$sujet2=$_POST['sujet2']; $sql=mysql_query("SELECT COUNT (*) AS nombre2 FROM sujets WHERE sujet2 ='$sujet2'") or die(mysql_error()); $n2=$sql['nombre2']; echo "n2 vaut ".$n2." <BR />";
Par contre quelque-chose de beaucoup plus grave est de fermer les parenthèses :mysql_query("INSERT INTO sujets VALUES('', '$sujet2') IF NOT EXIST (SELECT * FROM base_physique WHERE sujet LIKE '".$sujet2."')");
En espérant que ça finisse par fonctionner...-
voila ce que ca m'affiche : on est bien entré dans le if isset
n2 vaut
quand je tape le code du dessous.
le probléme c'est que cela ne m'ajoute pas le sujet dans la table sujets
if(isset($_POST['sujet2']))
{
echo "on est bien entré dans le if isset <BR/>";
//ajout à la bdd
$sujet2=$_POST['sujet2'];
$sql=mysql_query("SELECT COUNT(*) AS nombre2 FROM sujets WHERE sujet2 ='$sujet2'") or die(mysql_error());
$n2=$sql['nombre2'];
echo "n2 vaut $n2 <BR />";
// nombre correspond au nombre de fois où le sujet est déjà présent
//s'il vaut 0 on l'ajoute sinon on passe
mysql_query("INSERT INTO sujets VALUES('', '$sujet2') WHERE NOT EXISTS (SELECT * FROM base_physique WHERE sujet LIKE '".$sujet2."')");
}
?>
-
-
j'ai aussi erssayé IF NOT EXISTS au lieu de WHERE NOT EXISTS
-
-
Je te propose d'arrêter de te faire ch... avec le count : tu n'as qu'à utiliser la fonction mysql_count_rows. Le fichier complet donnera :
if(isset($_POST['sujet2'])) { //ajout à la bdd $sujet2=$_POST['sujet2']; $sql=mysql_query("SELECT * FROM sujets WHERE sujet2 ='$sujet2'"); $n2 = mysql_num_rows($sql); echo "n2 vaut $n2"; // nombre correspond au nombre de fois où le sujet est déjà présent //s'il vaut 0 on l'ajoute sinon on passe if ($n2==0) { mysql_query("INSERT INTO sujets VALUES('', '$sujet2') WHERE NOT EXISTS (SELECT * FROM base_physique WHERE sujet LIKE '".$sujet2."')"); } } ?> -
Si t'es pressé d'avoir des résultats je te dirais bien de laisser tomber le WHERE NOT EXISTS et de faire ça :
if(isset($_POST['sujet2'])) { //ajout à la bdd $sujet2=$_POST['sujet2']; $sql = mysql_query("SELECT * FROM sujets WHERE sujet2 ='$sujet2'"); $sql1 = mysql_query("SELECT * FROM base_physique WHERE sujet ='$sujet2'"); $n2 = mysql_num_rows($sql); $n3 = mysql_num_rows($sql1); echo "n2 vaut $n2 et n3 vaut $n3"; // nombre correspond au nombre de fois où le sujet est déjà présent //s'il vaut 0 on l'ajoute sinon on passe if ($n2==0 AND $n3==0) { mysql_query("INSERT INTO sujets VALUES('', '$sujet2') ") or die(mysql_error()); } } ?>
Mais bon c'est fonctionnel mais c'est moins beau que le WHERE NOT EXISTS. Cependant comme je te l'ai déjà dit je n'ai plus utilisé cela depuis longtemps...
Sinon je te propose de recréer un topic où tu demanderais à d'autres gens que moi comment s'en servir... On ne sait jamais ça pourrait te resservir un jour !!!
Bon là ça marchera... A moins bien sûr que ta table sujets contient plus de 2 champs bien sûr-
merci beaucoup cette solution conviendra parfaitement mais c'est quand même bizarre que cela ne marche pas avec le WHERE NOT EXISTS
bon ca c'est fait mais mon projet est loin detre terminé helas^^
je vais surement mettre de nouveaux post bientot, si tu les vois ce serait cool de m'aider car ca me permet d'avancer
donc encore une fois merci beaucoup
-
-
Content que ça marche finalement mais cette solution je pense que tu aurais pu la trouver tout seul... Dommage de pas avoir réussi avec where not exists... (T'as essayé IF NOT EXISTS ? excuse-moi d'insister mais j'ai un sentiment d'inachevé)
Et si jamais tu as des nouveaux pb de php/sql t'auras qu'à m'envoyer un 'tit mp avec le lien vers le topic... ou pas vu comment je t'ai été d'une grande aide sur ce coup-ci :(
Bon courage pour la suite -
oue j'avais essayé avec le IF NOT EXISTS et ca ne marche pas
En revanche, au niveau de l'affichage j'avais pas fais attention mais il y a un léger probléme, en effet, cela m'affiche tous les sujets de base_physique dans l'ordre alphabétique puis ensuite tous les sujets de sujets dans l'ordre alphabétique..
exemple : base physique a popo momo comme sujets
sujets a lens wowo
actuellement dans le formulaire cela me donne : momo popo lens wowo
alors que moi je voudrais : lens momo popo wowo
un ordre alphabétique unique regroupant tous les sujets des 2 tables....
C'est posssible? -
De quel affichage parles-tu ?
Je suppose que tu as essayé un ORDER BY ? -
ben j'ai fait comme cela mais le probléme , c'est que ca mets les sujets de base_physique dans l'ordre alphabétique puis après ceux de sujets par ordre alphabétique
Mais moi je voudrais un ordre alphabétique global
le code :
$sujets=mysql_query("SELECT DISTINCT sujet FROM base_physique ORDER BY sujet");
$sujets2=mysql_query("SELECT DISTINCT sujet2 FROM sujets ORDER BY sujet2");
while ($sujet = mysql_fetch_array($sujets)) #propose tous les sujets présents dans la table
{
echo '<option value="'.$sujet['sujet'].'">'.$sujet['sujet'].'</option>';
}
while ($sujet2 = mysql_fetch_array($sujets2)) #propose tous les sujets présents dans la table
{
echo '<option value="'.$sujet2['sujet2'].'">'.$sujet2['sujet2'].'</option>';
}
?> -
Bonsoir,
Si tu n'as pas besoin de concerver la provenance des données (telle ou telle table) tu peux entrer toutes les valeurs dans un tableau que tu classeras ensuite
Un p'tit script vite fait :$sujets=mysql_query("SELECT DISTINCT sujet FROM base_physique ORDER BY sujet"); $sujets2=mysql_query("SELECT DISTINCT sujet2 FROM sujets ORDER BY sujet2"); $n=0; $tab = array(); while ($sujet = mysql_fetch_array($sujets)) #propose tous les sujets présents dans la table { $data = $sujet['sujet']; $tab[$n] = $data; $n++; } while ($sujet2 = mysql_fetch_array($sujets2)) #propose tous les sujets présents dans la table { $data = $sujet2['sujet2']; $tab[$n] = $data; $n++; } natcasesort($tab); echo "<pre>"; print_r($tab); echo "</pre>"; ?>
Ensuite il te suffit de récupérer les valeurs dans le tableau $tab et de les entrer dans ton formulaire -
- 1
- 2