Listes déroulantes à choix multiple

Eléphant du PHP | 179 Messages

16 sept. 2005, 12:21

if (!empty ($tabSpecialite)){
    foreach($tabSpecialite as $cle => $valeur){
       $requete.="'".$valeur."',";//suite de la requête
       }
}
après chaque valeur on rajoute une virgule
sauf que pour la dernière valeur on aura donc une virgule en trop
cette ligne sert à l'enlever, comme c'était indiqué
(-2 car il y a aussi un espace à enlever)

la ligne en question doit donc se trouver juste après la boucle

quand on construit une requête dynamiquement, on affiche toujours le SQL généré, ça aide à voir où se trouve l'erreur
et c'est ce que demandait Vaedan
Lorsque je fais ça j'obtiens ceci:
Il y a eu une erreur : Erreur de syntaxe près de '''','', '', '', '', '', '', '','', '', '', '', '')' à la ligne 1
Dans :
INSERT INTO societes VALUES('','TEST6', '',''','', '', '', '', '', '', '','', '', '', '', '')
Lorsque je teste ça:
Bonjour, il est vrai que le substr est mal placé mais
pour eviter de mettre le "substr" il suffit de replacer -> ',
l'écrire avant la valeur (dans la boucle).

PHP:
$requete = "INSERT INTO societes VALUES('','".$NomSociete."', '".$AutreNomSociete."','".$IdGroupe."'";//ne pas écrire ,' ici
if (!empty ($tabSpecialite)){
foreach($tabSpecialite as $cle => $valeur){
$requete.=",'".$valeur."'";//mais l'écrire ici avant la variable
}
}
// fin de la boucle et suite de la requête
$requete.=",'".$Presentation."', '".$InfCompl."', '".$PaysOrigine."', '".$Adresse."', '".$Tel."', '".$Fax."',
'".$SiteSociete."','".$NomReprFr."', '".$AdresseReprFr."', '".$TelReprFr."', '".$FaxReprFr."', '".$MAJ."')";
Ca me donne ça:
Il y a eu une erreur : Column count doesn't match value count at row 1
Dans :
INSERT INTO societes VALUES('','TEST6', '','','', '', '', '', '', '', '','', '', '', '', '')
quand on construit une requête dynamiquement, on affiche toujours le SQL généré, ça aide à voir où se trouve l'erreur


et c'est ce que demandait Vaedan
:?: Tu veux dire sous PHP-MyAdmin?
Petit à petit, on devient moins petit... mais qu'est-ce qu'on vieillit!

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

16 sept. 2005, 12:23

je voulais d'abord afficher le code SQL dans la page
tu construis ta requête dans $requete

donc une fois que c'est fait, un petit echo $requete; pour voir ce que ça donne

et effectivement ensuite la tester dans phpMyAdmin pour voir si ça passe

là tu as une erreur de syntaxe, donc affiche le code SQL généré, en entier, et tu pourras d'où vient le problème et ajuster la création du code

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

16 sept. 2005, 12:35

Bonjour, il est vrai que le substr est mal placé mais
pour eviter de mettre le "substr" il suffit de replacer -> ',
l'écrire avant la valeur (dans la boucle).

PHP:
$requete = "INSERT INTO societes VALUES('','".$NomSociete."', '".$AutreNomSociete."','".$IdGroupe."'";//ne pas écrire ,' ici
if (!empty ($tabSpecialite)){
foreach($tabSpecialite as $cle => $valeur){
$requete.=",'".$valeur."'";//mais l'écrire ici avant la variable
}
}
// fin de la boucle et suite de la requête
$requete.=",'".$Presentation."', '".$InfCompl."', '".$PaysOrigine."', '".$Adresse."', '".$Tel."', '".$Fax."',
'".$SiteSociete."','".$NomReprFr."', '".$AdresseReprFr."', '".$TelReprFr."', '".$FaxReprFr."', '".$MAJ."')";
Ca me donne ça:
Il y a eu une erreur : Column count doesn't match value count at row 1
Dans :
INSERT INTO societes VALUES('','TEST6', '','','', '', '', '', '', '', '','', '', '', '', '')
tu essaie d'inserrer trop de valeur dans ta table !! recompte le nombre de champs de ta table et le nombre que tu veux inserrer.

Eléphant du PHP | 179 Messages

16 sept. 2005, 16:41

tu essaie d'inserrer trop de valeur dans ta table !! recompte le nombre de champs de ta table et le nombre que tu veux inserrer.
Oui c'est exact, j'ai réussi à générer le nombre de colonnes suffisant en fonction du nombre de champs. La colonne qui manquait concernait justement les données de ma liste déroulante.
Maintenant, il me dit qu'il enregitre les données mais ça ne s'enregistre pas dans la base: il ne m'affiche aucun message d'erreurs. Voici le code de ma requête: c'est comme s'il ne prenait pas en compte ma boucle.

$requete = "INSERT INTO societes VALUES('','".$NomSociete."', '".$AutreNomSociete."','".$IdGroupe."','',',";
if (!empty ($tabSpecialite)){
    foreach($tabSpecialite as $cle => $valeur){
       $requete.="".$valeur.",";
       }
}
$requete = substr($requete, 0, -2);
$requete.='';
$requete.="'".$Presentation."', '".$InfCompl."', '".$PaysOrigine."', '".$Adresse."', '".$Tel."', '".$Fax."', 
'".$SiteSociete."','".$NomReprFr."', '".$AdresseReprFr."', '".$TelReprFr."', '".$FaxReprFr."', '".$MAJ."')";
et effectivement ensuite la tester dans phpMyAdmin pour voir si ça passe
Sous MyAdmin en revanche, ça ne lui plaît pas puiqu'il me dit:
Il semble qu'il y ait une erreur dans votre requête SQL. Le message ci-bas peut vous aider à en trouver la cause.

ERROR: Apostrophe non fermé @ 483
STR: '

MySQL a répondu:
#1064 - Erreur de syntaxe près de '')' à la ligne 1
Et comme je suis un boulet, ma foi, je n'arrive pas à trouver...
Petit à petit, on devient moins petit... mais qu'est-ce qu'on vieillit!

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

16 sept. 2005, 21:37

Visiblement tu as un probleme de concaténation...
j'ai repris le post depuis le début, question:
si une personne séléctionne "Editeur" et "Diffuseur-Distributeur" et "Producteur"
ces valeurs s'ajoutent dans le meme champ ou un champ par valeur ?

avec ta requete tu met une valeur par champ d'où le dépassement de table il me semble.

si tu veux mettre toutes les valeur dans le meme champ tu ne dois pas les concatèner
comme tu le fait mais plustot comme ceci:
$requete = "INSERT INTO societes VALUES('','".$NomSociete."', '".$AutreNomSociete."','".$IdGroupe."','";
 
if (!empty ($tabSpecialite)){
    foreach($tabSpecialite as $cle => $valeur)
              {
              $requete.=$valeur;
              }
        }
    
$requete .="',".$Presentation."', '".$InfCompl."', '".$PaysOrigine."','".$Adresse."', '".$Tel."', '".$Fax."', '".$SiteSociete."',    '".$NomReprFr."', '".$AdresseReprFr."', '".$TelReprFr."', '".$FaxReprFr."', '".$MAJ."')";
	
Mais cete manière n'est pas très pratique pour récuperé les données (deja dis il me semble).
Sinon tu peut montrer la structure de ta table, on y vera beaucoup plus clair.

De plus tu peux me rappeler d'où tu sort le "$tabSpecialite" parceque je vois bien un "$Specialite" qui récupère les valeurs de la liste mais pas l'autre !?

Pour voir ce que contient ta requete une fois construite c un echo $requete que tu dois faire juste apres (et tu l'affiche ici) avec des valeurs (de test) si possible.

Eléphant du PHP | 179 Messages

19 sept. 2005, 09:01

Bonjour,
De plus tu peux me rappeler d'où tu sort le "$tabSpecialite" parceque je vois bien un "$Specialite" qui récupère les valeurs de la liste mais pas l'autre !?

:oops: Oui effectivement. Comme j'ai tenté d'adapter le script d'ouckileou je me suis plantée dans la variable.

Visiblement tu as un probleme de concaténation...
j'ai repris le post depuis le début, question:
si une personne séléctionne "Editeur" et "Diffuseur-Distributeur" et "Producteur"
ces valeurs s'ajoutent dans le meme champ ou un champ par valeur ?
Comme c'est une liste déroulante, j'ai supposé qu'il s'agissait de toutes les valeurs sélectionnées dans un seul champ. Y a-t-il d'autres possibilités? Si oui quelle est la meilleure? (notamment pour une recherche sur le champ après...).

Mon champ "Specialite" comprend 3 valeurs "Editeur", "Diffuseur-Distributeur" et "Producteur". Il s'agit d'un champ SET. Or mon erreur actuelle est la suivante:

INSERT INTO societes VALUES('','TEST9', 'autrenom','6','Editeur','Diffuseur-Distributeur','Producteur','present', 'infcompl', 'pays', 'adre', 'tel', 'fax', 'site','nom repr', 'adre', 'tel2', 'fax2', 'maj')Il y a eu une erreur : Column count doesn't match value count at row 1
Pour une requête qui se présente ainsi:
$requete = "INSERT INTO societes VALUES('','".$NomSociete."', '".$AutreNomSociete."','".$IdGroupe."',";
if (!empty ($Specialite)){
    foreach($Specialite as $cle => $valeur){
       $requete.="'".$valeur."',";
       }
}
$requete = substr($requete, 0, -2);
$requete.='';
$requete.="','".$Presentation."', '".$InfCompl."', '".$PaysOrigine."', '".$Adresse."', '".$Tel."', '".$Fax."', 
'".$SiteSociete."','".$NomReprFr."', '".$AdresseReprFr."', '".$TelReprFr."', '".$FaxReprFr."', '".$MAJ."')";

echo ($requete);
A propos si tu as une autre proposition pour alléger tout ça, je suis preneuse: je suis là pour apprendre.
Petit à petit, on devient moins petit... mais qu'est-ce qu'on vieillit!

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

19 sept. 2005, 13:40

montre la structure de ta table

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

19 sept. 2005, 14:10

Comme c'est une liste déroulante, j'ai supposé qu'il s'agissait de toutes les valeurs sélectionnées dans un seul champ. Y a-t-il d'autres possibilités? Si oui quelle est la meilleure? (notamment pour une recherche sur le champ après...).
Oui ton choix aurrai été bien si ce n'était pas une liste a choix multiple. Dans ton cas je te sugère de remplacer le champ "Specialite" par "Editeur" et de crée 2 autre champs "Diffuseur-Distributeur" et "Producteur" tous en "int". Comme ça si la spécialité est séléctionnée dans la liste on notera 1 et sinon on notera 0 dans les champs respectifs.
INSERT INTO societes VALUES('','TEST9', 'autrenom','6','Editeur','Diffuseur-Distributeur','Producteur','present', 'infcompl', 'pays', 'adre', 'tel', 'fax', 'site','nom repr', 'adre', 'tel2', 'fax2', 'maj')Il y a eu une erreur : Column count doesn't match value count at row 1
Ton erreur est comme je l'avais dis un peu plus haut, tu veut inserer trop de valeurs dans la table. Tu n'a qu'un champ "spécialité" ou tu insert bien la première valeur séléctionnée de la liste (dans ton exemple "Editeur") mais ensuite tu est en décalage avec les champs puisque "Diffuseur-Distributeur" est inseré dans le champ qui correspond normalement a la présentaion ...oui, as tu compris ?


Donc une fois les autres tables crées je te propose ceci:

if (!empty ($Specialite))
{
    foreach($Specialite as $cle => $valeur)
    {
        // la c'est peut etre un peu lourd mais c'est pour bien faire la différence
       $Editeur = ($valeur=="Editeur") ? 1 : 0; 
       $DifDis = ($valeur=="Diffuseur-Distributeur") ? 1 : 0;
       $Producteur = ($valeur=="Producteur") ? 1 : 0;
    }
    $requete = "INSERT INTO societes VALUES('','".$NomSociete."', '".$AutreNomSociete."','".$IdGroupe."','".$Editeur."','".$DifDis."','".$Producteur."','".$Presentation."', '".$InfCompl."', '".$PaysOrigine."', '".$Adresse."', '".$Tel."', '".$Fax."', 
'".$SiteSociete."','".$NomReprFr."', '".$AdresseReprFr."', '".$TelReprFr."', '".$FaxReprFr."', '".$MAJ."')";
}


/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

19 sept. 2005, 14:26

Oui ton choix aurrai été bien si ce n'était pas une liste a choix multiple. Dans ton cas je te sugère de remplacer le champ "Specialite" par "Editeur" et de crée 2 autre champs "Diffuseur-Distributeur" et "Producteur" tous en "int". Comme ça si la spécialité est séléctionnée dans la liste on notera 1 et sinon on notera 0 dans les champs respectifs.
Pas d'accord !
C'est un gros problème de conception... si on rajoute une possibilité, on rajoute un champ ? S'il n'y a qu'une possibilité à chaque fois => 2 champs qui ne servent à rien

Je ne sais pas comment s'appelle le champ qui correspond à "Distributeur"et tout (c'est pour ça que je demande la structure)

Mais s'il l'enregistrement ne peut être qu'une seule chose à la fois (distributeur ou un autre) => 1 seul champ avec la valeur dedans (éventuellement une table séparée pour les valeurs)

Si l'enregistrement peut être plusieurs choses à la fois => 1 table pour les valeurs, et une relation entre les deux

Mauvais conseil je trouve là... :roll:

Eléphant du PHP | 179 Messages

19 sept. 2005, 14:32

montre la structure de ta table
Il y a une manipulation spécifique à faire? (type exportation?)
Petit à petit, on devient moins petit... mais qu'est-ce qu'on vieillit!

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

19 sept. 2005, 14:42

Tu peux faire ça, ou simplement lister les colonnes, leur type et nous dire un peu à quoi ça corrrespond

ça permettra de nous faire une idée sur ce que tu stockes dedans, et comment l'orhaniser au mieux
car je suis d'accord avec Truc, le type Set n'est peut-être pas le plus approprié

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

19 sept. 2005, 14:49

si on rajoute une possibilité, on rajoute un champ ?
Il et vrai j'ai pas pensé a un d'éventuel ajout d'une spécialité :?
Sinon ca marcherai quant meme mais sur 3 pattes :wink: La prochaine fois d'abord la structure et ensuite les idées :)

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

Eléphant du PHP | 179 Messages

19 sept. 2005, 15:03

Les SET ne devront pas être modifiés.


Bon alors voilà.
Nous avons trois tables:

- Table "Groupes": IdGroupe (INT autoincrémenté), NomGroupe, AutreNomGroupe, Presentation, InfComp, MAJ.

- Table "Societes": les champs non renseignés sont des champs VARCHAR ou TEXT.
IdSociete (INT) autoincrémenté
NomSociete
AutreNomSociete
RefGroupe (INT)
Specialite (SET Editeur, Diffuseur-Distributeur, Producteur)
Présentation
InfCompl
PaysOrigine
Adresse
Tel
Fax
SiteSociete
NomReprFr
AdresseReprFr
TelReprFr
FaxReprFr
MAJ

Table "Produits":
IdProduit (INT) autoincrémenté
NomProduit
RefSociete (INT)
DisciplinesBases (SET Sciences biologiques, mathématiques,etc...).
TypeBases (SET base de données bibliographique, etc...).
TypeAcces (SET reconnaissance IP, mot de passe,etc.)
Presentation
TypeRecherche (SET Payant, Gratuit) --> //notez que la possibilité que ce soit payant et gratuit en même temps est possible (une partie grauite, l'autre payante, donc pas d'incohérence).
Site
MAJ
Petit à petit, on devient moins petit... mais qu'est-ce qu'on vieillit!

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

19 sept. 2005, 15:09

le SET ça va marcher
mais bon, tu parlais par exemple de recherches

pour tout ce qui va être tri, calculs, requêtes avec des jointures, ça va être galère

moi j'aurai fait ça comme ça :
1 - si une société ne peut être que "Editeur" OU "Diffuseur-Distributeur" OU "Producteur"

Code : Tout sélectionner

Societes ------------ IdSociete NomSociete AutreNomSociete RefGroupe ID_Specialite # --> clé étrangère vers Specialites Specialites ------------ id_specialite libelle_specialite --> tu stockes là-dedans les valeurs
2 - si une société peut être "Editeur" ET/OU "Diffuseur-Distributeur" ET/OU "Producteur"

Code : Tout sélectionner

Societes ------------ IdSociete NomSociete AutreNomSociete RefGroupe possede --> relation entre Societes et Specialites --------- IdSociete id_specialite Specialites ------------ id_specialite libelle_specialite --> tu stockes là-dedans les valeurs

Eléphant du PHP | 179 Messages

19 sept. 2005, 15:14

:shock: :shock: :shock:
Tu veux dire que je dois créer une table pour chaque SET?

Tu veux dire: refaire tous mes scripts? :cry: :cry: :cry:

Certes j'ai encore trois semaines, mais à cette vitesse, je ne vais jamais y arriver ](*,)

Ceci dit, c'est vrai que je commence à galérer avec les jointures. Je n'y arrive déjà pas avec un INSERT tout bête...
Petit à petit, on devient moins petit... mais qu'est-ce qu'on vieillit!