Page 1 sur 2

Problème de récupération de données dans une base SQL

Posté : 15 nov. 2007, 10:55
par Marjerem
Bonjour,

Je débute en PHP et j'essaie de créer un formulaire de staisfaction destiné aux utilisateurs du site Intranet dont je m'occupe. J'ai écrit ce formulaire en php, mais deux éléments me posent problème au moment de l'insertion dans ma base SQL.
Voici le code des deux questions qui me posent problème :

Code : Tout sélectionner

1ère question : <LABEL>7: Quelles sont les rubriques que vous consultez le plus souvent ? </BR> (plusieurs choix sont possibles): </LABEL> </BR> <INPUT type="checkbox" name="rubriquesconsult[]" value="actualitesdesservices" onclick="return itemClicked(actualitesdesservices)" />Actualités des Services <INPUT type="checkbox" name="rubriquesconsult[]" value="annuaire" onclick="return itemClicked(annuaire)" />Annuaire <INPUT type="checkbox" name="rubriquesconsult[]" value="breves" onclick="return itemClicked(breves)" />Brèves</BR> <INPUT type="checkbox" name="rubriquesconsult[]" value="dossiersactu" onclick="return itemClicked(dossiersactu)" />Dossiers d'actualités <INPUT type="checkbox" name="rubriquesconsult[]" value="zoomsur" onclick="return itemClicked(zoomsur)" />Zoom sur <INPUT type="checkbox" name="rubriquesconsult[]" value="servicesenligne" onclick="return itemClicked(servicesenligne)" />Les services en ligne</BR> <INPUT type="checkbox" name="rubriquesconsult[]" value="mairie" onclick="return itemClicked(mairie)" />Mairie <INPUT type="checkbox" name="rubriquesconsult[]" value="outilspratiques" onclick="return itemClicked(outilspratiques)" />Outils pratiques <INPUT type="checkbox" name="rubriquesconsult[]" value="recherchearticlesdiva" onclick="return itemClicked(recherchearticlesdiva)" />Recherche (d'articles sur DIVA) </BR> </BR> 2ème question : <LABEL>8: Si vous avez choisi "Les services en ligne à la question précédente </BR> merci de préciser les 3 services que vous consultez le plus : </LABEL> </BR> <INPUT type="checkbox" name="servicesconsult" value="actionculturelle" onclick="return itemClicked(actionculturelle)" />Action Culturelle <INPUT type="checkbox" name="servicesconsult" value="archives" onclick="return itemClicked(archives)" />Archives Municipales <INPUT type="checkbox" name="servicesconsult" value="bibliotheques" onclick="return itemClicked(bibliotheques)" />Bibliothèques Municipales </BR> <INPUT type="checkbox" name="servicesconsult" value="cvl" onclick="return itemClicked(cvl)" />CVL <INPUT type="checkbox" name="servicesconsult" value="circulation" onclick="return itemClicked(circulation)" />Circulation <INPUT type="checkbox" name="servicesconsult" value="commandepublique" onclick="return itemClicked(commandepublique)" />Commande Publique</BR> <INPUT type="checkbox" name="servicesconsult" value="directiongenerale" onclick="return itemClicked(directiongenerale)" />Direction Générale <INPUT type="checkbox" name="servicesconsult" value="directionaffjurid" onclick="return itemClicked(directionaffjurid)" />Direction des Affaires Juridiques <INPUT type="checkbox" name="servicesconsult" value="directionfinances" onclick="return itemClicked(directionfinances)" />Direction des Finances</BR> <INPUT type="checkbox" name="servicesconsult" value="drh" onclick="return itemClicked(drh)" />Direction des Ressources Humaines et des Relations Sociales <INPUT type="checkbox" name="servicesconsult" value="enseignement" onclick="return itemClicked(enseignement)" />Enseignement <INPUT type="checkbox" name="servicesconsult" value="fetesanim" onclick="return itemClicked(fetesanim)" />Fêtes et Animations</BR> <INPUT type="checkbox" name="servicesconsult" value="patrimoine" onclick="return itemClicked(patrimoine)" />Gestion du Patrimoine <INPUT type="checkbox" name="servicesconsult" value="syndicats" onclick="return itemClicked(syndicats)" />Organisations Syndicales <INPUT type="checkbox" name="servicesconsult" value="secretariatgeneral" onclick="return itemClicked(secretariatgeneral)" />Secrétariat Général</BR> <INPUT type="checkbox" name="servicesconsult" value="communication" onclick="return itemClicked(communication)" />Service Communication <INPUT type="checkbox" name="servicesconsult" value="sit" onclick="return itemClicked(sit)" />Service Informatique et Télécomunnications <INPUT type="checkbox" name="servicesconsult" value="sports" onclick="return itemClicked(sports)" />Sports </BR> </BR>
Voici maintenant un extrait du code du fichier de traitement de mon formulaire :
foreach($_POST as $index => $valeur) {
$$index = mysql_real_escape_string(trim($valeur));
}

$rubriquesconsult = $_POST['rubriquesconsult'];
$sqlrubriquesconsult = '';
for ($i=0; $i<count($rubriquesconsult); $i++)
{
	$sqlrubriquesconsult .=$rubriquesconsult[$i];
	$rubriquesconsult .= ', ';
}

$servicesconsult = $_POST['servicesconsult'];
$sqlservicesconsult = '';
for ($i=0; $i<count($servicesconsult); $i++)
{
	$sqlservicesconsult .=$servicesconsult[$i];
	$servicesconsult .= ', ';
}

$sql = "INSERT INTO satisfactiondiva VALUES ('', '$nom', '$prenom', '$service', '$quantiteinfos', '$qualiteinfos',
'$clarteinfos', '$faciliteutilisation', '$frequenceconsult', '$dureeconsult', '$sqlrubriquesconsult',
'$sqlservicesconsult', '$servicecorresp', '$cellulecorresp', '$frequencecreationcontenu', '$outilcomplet',
'$souhaits', '$rubriquesaetoffer', '$remarques')";
$res = mysql_query($sql);
if ($res) {
echo $msg_ok;
} else {
echo mysql_error();
}
}

?>
Je voudrais donc insérer les données correspondant aux cases cochées dans une base SQL mais ça ne se passe pas comme je le souhaiterais ; en fait, au moment de l'insertion ça me donne :
Pour la question 1, je ne récupère qu'une seule valeur parmi les cases cochées ; pour la question 2, je ne retrouve chaque fois qu'une seule valeur 's'.

Pour ces deux questions, j'ai choisi cette structure de base SQL :

Code : Tout sélectionner

Champ Type Interclassement Null rubriquesconsult varchar (255) latin1_general_ci Non servicesconsult varchar (255) latin1_general_ci Non
Merci d'avance de votre aide !

Posté : 15 nov. 2007, 12:40
par Ryle
Modération :
Marjerem, afin d'améliorer la lisibilité de ton message,
pense à utiliser les balises [code] ou [php] (selon le langage utilisé).

Elles sont disponibles au-dessus de la zone de saisie de ton message
lorsque tu postes un nouveau message.

J'édite ton message pour qu'il soit plus lisible.

Des indications sont disponibles sur la manière de mettre en forme vos messages dans la FAQ

Posté : 15 nov. 2007, 12:44
par Marjerem
Merci !
C'est effectivement beaucoup plus lisible...
Merci de ton aide, mais t'aurais pas eu le temps de jeter un coup d'oeil sur mon code, par hasard ? Parce que là je sèche...

Posté : 15 nov. 2007, 12:47
par Ryle
Pour ton second problème, tu as omis les crochets dans les noms des champs "servicesconsult", du coup la valeur de la dernière case cochée écrase les précédentes et il ne t'en reste plus qu'une.

Pour les boucles elles me semblent correctes. N'hésites pas à ajouter des echo pour afficher tes variables et voir comment elles se construisent, tu verras peut être ce qui pose problème :)


Sinon p'tite remarque en passant, le retour à la ligne en html, c'est <br /> et pas </ br> ;)

Posté : 15 nov. 2007, 12:51
par Marjerem
merci, je vais corriger pour ma deuxième erreur.

Posté : 15 nov. 2007, 13:08
par Marjerem
J'ai inséré un
echo $sql
pour voir ce que ça donne et voilà le message que j'ai reçu en retour :
Notice: Array to string conversion in c:\program files\easyphp1-8\www\traitement_formulaire_diva.php on line 46
Merci d'avoir répondu à ce questionnaire. L'équipe DIVA vous souhaite une bonne journée !INSERT INTO satisfactiondiva VALUES ('', 'test7', 'test7', 'service test6', 'moyenne', 'moyenne', 'bonne', 'tresmauvaise', 'unefoisparsemaine', 'trentesecondesadeuxminutes', 'annuaire', 's', 'drh', 'comptabilite', 'unefoisparsemaine', 'non', 'tyreyace\r\njercftuacr a\r\nyuvtrcuyazetbrc\r\nyzetriyazbcra\r\nauizetbrazcrna\r\nyueribtacntra\r\nzurtbcituanr\r\naioerèynioayvta', 'tyreyace\r\njercftuacr a\r\nyuvtrcuyazetbrc\r\nyzetriyazbcra\r\nauizetbrazcrna\r\nyueribtacntra\r\nzurtbcituanr\r\naioerèynioayvta', 'tyreyace\r\njercftuacr a\r\nyuvtrcuyazetbrc\r\nyzetriyazbcra\r\nauizetbrazcrna\r\nyueribtacntra\r\nzurtbcituanr\r\naioerèynioayvta')
En fait, il ne me renvoie toujours qu'une seule valeur 'annuaire' (alors que plusieurs ont été saisies) et pour le champ d'après, il me renvoie 's' qui ne corresponda à rien (en fait, je devrais avoir une liste de 3 services correspondant aux trois cases cochées dans le formulaire).
Tu vois d'où ça pourrait venir ?

Posté : 15 nov. 2007, 14:24
par Berzemus
je repère un bug la:
for ($i=0; $i<count($servicesconsult); $i++)
{
    $sqlservicesconsult .=$servicesconsult[$i];
    $servicesconsult .= ', ';
} 
Ce serait pas $sqlservicesconsult.= ', '; au lieu de $servicesconsult.= ', ';, par hasard ?

Si oui, remplace plutôt la permière ligne de ton for par
$sqlservicesconsult .=$servicesconsult[$i].','; 
Quand on peut raccourcir le code sans trop de difficultés, ça évite des erreurs, et c'est plus clair.

Posté : 15 nov. 2007, 15:15
par Marjerem
Alors j'ai suivi ton conseil et voilà ce que ça me donne :
Notice: Array to string conversion in c:\program files\easyphp1-8\www\traitement_formulaire_diva.php on line 46
Merci d'avoir répondu à ce questionnaire. L'équipe DIVA vous souhaite une bonne journée !INSERT INTO satisfactiondiva VALUES ('', 'retest9', 'retest8', 'reservice test8', 'moyenne', 'moyenne', 'bonne', 'tresmauvaise', 'unefoisparsemaine', 'trentesecondesadeuxminutes', 'annuaire', 's,, ', 'drh', 'comptabilite', 'unefoisparsemaine', 'non', 'tyreyace\r\njercftuacr a\r\nyuvtrcuyazetbrc\r\nyzetriyazbcra\r\nauizetbrazcrna\r\nyueribtacntra\r\nzurtbcituanr\r\naioerèynioayvta', 'tyreyace\r\njercftuacr a\r\nyuvtrcuyazetbrc\r\nyzetriyazbcra\r\nauizetbrazcrna\r\nyueribtacntra\r\nzurtbcituanr\r\naioerèynioayvta', 'tyreyace\r\njercftuacr a\r\nyuvtrcuyazetbrc\r\nyzetriyazbcra\r\nauizetbrazcrna\r\nyueribtacntra\r\nzurtbcituanr\r\naioerèynioayvta')
Je te donne mes lignes de code :
$servicesconsult = $_POST['servicesconsult'];
$sqlservicesconsult = '';
for ($i=0; $i<count($servicesconsult); $i++)
{
	$sqlservicesconsult .=$servicesconsult[$i].',';
	$sqlservicesconsult .= ', ';
}

Posté : 15 nov. 2007, 15:30
par Berzemus
Je me suis mal expliqué je crois..

remplace plutôt tes deux boucles par ceci (implode() c'est pratique):
$rubriquesconsult = $_POST['rubriquesconsult'];
$sqlrubriquesconsult = implode(',',$rubriquesconsult);

$servicesconsult = $_POST['servicesconsult'];
$sqlservicesconsult = implode(',',$rubriquesconsult);
:wink:

(si c'est bien le contenu de ces deux talbeaux que tu veux instérer dans ta base.. (ce qui n'est pas 'optimal' niveau normalisation, ceci dit, mais si ça marche pour toi, pourquoi pas).

Posté : 15 nov. 2007, 17:36
par Invité
Merci beaucoup !
C'est presque ça, il ne me reste qu'un souci : il me ramène les infos concernant 'rubriquesconsult', mais le champ 'servicesconsult' reste vide, même si je le remplis (j'ai corrigé le dernier '$rubriquesconsult' par '$servicesconsult').
Qu'est-ce que t'en penses ?

Posté : 15 nov. 2007, 20:16
par Ryle
Il y a une petite erreur dans le code de Berzemus, l'as tu vu et corrigé ?
$sqlservicesconsult = implode(',',$rubriquesconsult);
// devrait être 
$sqlservicesconsult = implode(',',$servicesconsult);
Sinon une petite remarque personnelle, lorsque tu utilises des nom de variables avec plusieurs mots, je te recommande de mettre en majuscule la première lettre de chaque nouveau mot :
$servicesConsult
$sqlServicesConsult
Perso je trouve ça plus lisible :)

Posté : 16 nov. 2007, 15:10
par Marjerem
Merci !
ça fonctionne et j'ai même fait évoluer mon code depuis hier : je récupère maintenant le nom de la machine, que j'intègre dans ma base de données en tant que clé primaire pour empêcher qu'une personne ne réponde plusieurs fois à mon questionnaire (c'est destiné à un Intranet de collectivité locale).
J'ai maintenant deux autres soucis, toujours sur ce même code :
-le contrôle sur le nom de la machine se fait correctement, seulement lorsqu'une personne qui a déjà répondu essaie de répondre à nouveau le message suivant lui est renvoyé au moment du traitement de ses réponses
Duplicate entry 'UC30493' for key 1
Je cherche donc à modifier ce message pour lui renvoyer un truc du type "Vous avez déjà répondu à ce questionnaire" ; mais je ne trouve pas...
-mon deuxième souci, c'est que je voudrais qu'une fois le traitement effectué (qu'il se soit bien passé ou non), la fenêtre se ferme automatiquement ; là encore, je ne trouve pas...

Si quelqu'un a un tuyau...

Encore merci ! Cette communauté est décidément active est pleine de gens de bonne volonté. Et ça, c'est une chance pour les débutants comme moi...!

Posté : 16 nov. 2007, 17:50
par Marjerem
En fait, j'ai réussi à faire afficher la phrase voulue lorsqu'il rencontre l'erreur SQL "Duplicate" (1062).
Mais je n'arrive pas à faire disparaître la phrase par défaut
Duplicate entry 'UC30493' for key 1
Donc en fait, ça me donne
Vous avez déjà répondu au questionnaireDuplicate entry 'UC30493' for key 1
Voici un extrait de mon code :

Code : Tout sélectionner

if ($sql = '1062') echo "Vous avez déjà répondu au questionnaire"; // si un champ est vide, on affiche le message d'erreur if (strlen($message) > strlen($msg_erreur)) { echo $message; // sinon c'est ok } else { foreach($_POST as $index => $valeur) { $$index = mysql_real_escape_string(trim($valeur)); } $computername=$_POST['computername']; $computername = $_ENV["COMPUTERNAME"];; $rubriquesconsult = $_POST['rubriquesconsult']; $sqlrubriquesconsult = ''; $rubriquesconsult = $_POST['rubriquesconsult']; $sqlrubriquesconsult = implode(',',$rubriquesconsult); $servicesconsult = $_POST['servicesconsult']; $sqlservicesconsult = ''; $servicesconsult = $_POST['servicesconsult']; $sqlservicesconsult = implode(',',$servicesconsult); $sql = "INSERT INTO satisfactiondiva VALUES ('$computername', '$nom', '$prenom', '$service', '$quantiteinfos', '$qualiteinfos', '$clarteinfos', '$faciliteutilisation', '$frequenceconsult', '$dureeconsult', '$sqlrubriquesconsult', '$sqlservicesconsult', '$servicecorresp', '$cellulecorresp', '$frequencecreationcontenu', '$outilcomplet', '$souhaits', '$rubriquesaetoffer', '$remarques')"; $res = mysql_query($sql); if ($res) { echo $msg_ok; } else { echo mysql_error(); } } ?>
Une bonne âme aurait-elle une recette miracle pour moi ? Je pense que la solution se trouve dans la fin du code, lorsque je lui demande d'afficher l'erreur my_sql, mais je ne sais pas comment lui dire de n'afficher cette erreur que si elle est différente de l'erreur '1062'...

Encore merci pour votre aide !

Posté : 16 nov. 2007, 18:36
par Truc
suffit de ne pas mettre de
echo mysql_error();
:-k

Posté : 16 nov. 2007, 18:41
par sadeq
Il faut tester mysql_errno() : le n° de l'erreur. Mais il faut désactiver l'echo automatique déclenché par les fonctions qui causent l'erreur en les préfixant par @

Exemple:
$res = @mysql_query($sql);
if ($res) {
echo $msg_ok;
} else {
             if ( mysql_errno() != 1062 ) echo mysql_error();
}