Plusieurs questions pour un formulaire...

Eléphanteau du PHP | 15 Messages

30 mars 2013, 00:17

Bonjour tout le monde,
tout d'abord merci pour le support à toute la communauté PHP France.

Voici mon "problème":
Je débute en PHP et j'ai décidé pour un projet professionnel de créer un formulaire avec des questions à choix multiples ainsi que des questions libres.

Mon soucis aujourd'hui :
- Je voudrais limiter l'accès au questionnaire : une personne limité à une fois (par le nom par exemple vu que le champs est créé dans la base de données)
- Générer un graphique ou même juste un système de pourcentage afin de pouvoir traiter les résultats en un coup d'oeil.

Actuellement, j'ai créé le formulaire, la base de données, testé le formulaire et vérifier les insertions, tout va bien. Je bloque complètement sur la suite et je ne trouve pas d'aide en ligne...

Voici le code PHP :

Code : Tout sélectionner

<?php // Parametres mysql à remplacer par les vôtres define('DB_SERVER', 'localhost'); // serveur mysql define('DB_SERVER_USERNAME', 'root'); // nom d utilisateur define('DB_SERVER_PASSWORD', ''); // mot de passe define('DB_DATABASE', 'test'); // nom de la base $DATE = Date("d/m/Y H:i:s"); // Connexion au serveur mysql $connect = mysql_connect(DB_SERVER, DB_SERVER_USERNAME, DB_SERVER_PASSWORD) or die('Impossible de se connecter : ' . mysql_error()); // sélection de la base de données mysql_select_db(DB_DATABASE, $connect); $msg_erreur = "Erreur. Les champs suivants doivent être obligatoirement remplis :<br/><br/>"; $msg_ok = "Votre demande a bien été prise en compte."; $message = $msg_erreur; if (empty($_POST['civilite'])) $message .= "Votre civilité<br/>"; if (empty($_POST['nom'])) $message .= "Votre nom<br/>"; if (empty($_POST['email'])) $message .= "Votre email <br/>"; if (strlen($message) > strlen($msg_erreur)) { echo $message; } } else { foreach($_POST as $index => $valeur) { $$index = mysql_real_escape_string(trim($valeur)); } $pref = $_POST['pref']; $sqlpref = ''; for ($i=0; $i<count($pref); $i++) { $sqlpref .= $pref[$i]; $sqlpref .= ', '; } $sql = "INSERT INTO formulaire(ID, civilite, nom, email, adresse, code postal, ville, pays, pref, message, date) VALUES ('','$civilite','$nom','$email','$adresse','$code postal','$ville','$pays','$pref','$message','')"; $res = mysql_query($sql); if ($res) { echo $msg_ok; } else { echo mysql_error(); } } ?>
Voici la structure de la table de données :

Code : Tout sélectionner

CREATE TABLE IF NOT EXISTS `formulaire` ( `id` INT( 10 ) NOT NULL AUTO_INCREMENT PRIMARY KEY , `civilite` VARCHAR( 5 ) NOT NULL , `nom` VARCHAR( 150 ) NOT NULL , `prenom` VARCHAR( 150 ) NOT NULL , `quest10` varchar(150) NOT NULL, `quest11` varchar(150) NOT NULL, `quest20` varchar(150) NOT NULL, `quest21` varchar(150) NOT NULL, `quest22` varchar(150) NOT NULL, `q2other` text NOT NULL, `quest30` varchar(150) NOT NULL, `quest31` varchar(150) NOT NULL, `quest32` varchar(150) NOT NULL, `quest40` varchar(150) NOT NULL, `quest41` varchar(150) NOT NULL, `quest42` varchar(150) NOT NULL, `quest43` varchar(150) NOT NULL, `q3other` text NOT NULL, `message` text NOT NULL, `date` datetime NOT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1;
J'ai scindé les réponses afin de faciliter le traitement... Je suppose du moins que ça devrait être plus simple si toutes les réponses sont bien séparées dans la tables..

Voilà donc, est ce que quelqu'un pourrait me donner un coup de main pour achever mon premier essai en PHP s'il vous plais?

Merci par avance !

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

30 mars 2013, 01:24

salut,

au niveau structure de données c'est pas ça. Pour faire bien il te faut justement avoir une table pour cela.

les questions c'est la personne qui y réponds ou c'est elle qui les pose ? (c'est pas clair).

dans la première optique (la plus logique) c'est assez simple, il te suffit de 4 tables tables.
- utilisateur
- une table question
- une table réponse
- une tabel reponseutilisateur qui reprend les clef primaires des 3 autres 1ère tables.


quand au reste dit nous exactement ce que tu n'arrive pas a faire.

@+
Il en faut peu pour être heureux ......

Eléphanteau du PHP | 15 Messages

30 mars 2013, 17:48

Bonjour,
Merci de prendre le temps de m'aider. LED questions sont posées, le user coche juste les cases réponses qu'il souhaite.
Aujourd'hui je souhaiterais limiter l'accès au questionnaire a une fois par personne,c'est a dire qu'une fois que la personne a répondu, elle ne pourra plus recommencer et ensuite créer une page admin où je verrais en un coup d'oeil les statistiques des reponses en pourcentage ou mieux en graphique.

Apparemment la partie graphique pour les statistiques est compliquée a réaliser...
Merci beaucoup par avance.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

30 mars 2013, 18:36

poru ce qui est de la restriction, suffit d'avoir un champ, dans la base de donnée, indiquant que cela a été fait. tu peux aussi le vérifier en comptant le nombre de ligne qui n'ont pas les champs à null, si c'est 0 c'est que la personne à déjà répondu.
par exemple select count(*) as nb from formulaire where laconditionpourtrouverlememebre and quest10 is not null (par exemple).

il est impératif que ce système soit couplé à système type "espace membre" sinon tu ne pourras pas limiter les réponses (même en demandant une adresse email c'est trop simple de flouer le système).

pour ce qui est des graphiques, il te faut avoir les nombres de réponse pour les questions, a partir de la tu peux faire ce que tu veux (il existe des librairies php qui te mâche le travail (des exemple ici).

commence par la première partie, demande nous ce que tu ne comprend pas et ensuite on attaquera la seconde :)

@+
Il en faut peu pour être heureux ......

Eléphanteau du PHP | 15 Messages

30 mars 2013, 19:14

Merci pour tes réponses rapides et constructives!
Je vais m'attaquer à la partie restriction. Concernant la possibilité de gruger, il faut savoir que ce questionnaire est destiné à être rempli par des professeurs qui ne sont pas censé tenter quoi que ce soit mais c'est juste une sécurité pour éviter de fausser les résultats.
Je pense qu'une restriction par le nom/prénom devrait suffire..
Je vais voir ce qui est le mieux et le plus simple pour le moment et je reviens pour le résultat et la suite.
Merci encore!

Eléphanteau du PHP | 15 Messages

02 avr. 2013, 22:03

Salut,

voilà donc quelques nouvelles :
Avec un ami, nous avons donc créé tout ce qui est login, empêcher un user de faire deux fois le questionnaire et bien sur tester tout ça ainsi que les inscriptions dans la base de données.

Il me manque donc la création de statistiques simples... Je veux dire même des pourcentages simple me conviendrait.

Allons y , voici le script actuel :

Les tables SQL :

Code : Tout sélectionner

CREATE TABLE IF NOT EXISTS `formulaire` ( `id` int(11) NOT NULL AUTO_INCREMENT, `idaccount` int(11) NOT NULL, `quest10` varchar(150) NOT NULL, `quest11` varchar(150) NOT NULL, `quest20` varchar(150) NOT NULL, `quest21` varchar(150) NOT NULL, `quest22` varchar(150) NOT NULL, `q2other` text NOT NULL, `quest30` varchar(150) NOT NULL, `quest31` varchar(150) NOT NULL, `quest32` varchar(150) NOT NULL, `quest40` varchar(150) NOT NULL, `quest41` varchar(150) NOT NULL, `quest42` varchar(150) NOT NULL, `quest43` varchar(150) NOT NULL, `q3other` text NOT NULL, `message` text NOT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ; CREATE TABLE IF NOT EXISTS `identification` ( `id` int(10) NOT NULL AUTO_INCREMENT, `civilite` varchar(5) NOT NULL, `nom` varchar(150) NOT NULL, `prenom` varchar(150) NOT NULL, `date` datetime NOT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
La page ident.php en rapport donc avec l'index :

Code : Tout sélectionner

<?php session_start(); // Parametres mysql à remplacer par les vôtres define('DB_SERVER', 'localhost'); // serveur mysql define('DB_SERVER_USERNAME', 'root'); // nom d utilisateur define('DB_SERVER_PASSWORD', ''); // mot de passe define('DB_DATABASE', 'test'); // nom de la base // Connexion au serveur mysql $connect = mysql_connect(DB_SERVER, DB_SERVER_USERNAME, DB_SERVER_PASSWORD) or die('Impossible de se connecter ! ' . mysql_error()); // sélection de la base de données mysql_select_db(DB_DATABASE, $connect); $msg =""; //je valide le form if(isset($_POST)) { //protection des variables foreach ($_POST as $key => $val) { $formval[$key] = mysql_real_escape_string($val); } //test si le user existe $result = mysql_query("SELECT id FROM identification WHERE nom='".$formval['nom']."' AND prenom='".$formval['prenom']."'"); if( mysql_num_rows($result)>0) echo $msg = "vous avez deja rempli le formulaire"; else { //j'ajoute le nom à la table mysql_query("INSERT INTO identification VALUES ('','".$formval['civilite']."', '".$formval['nom']."','".$formval['prenom']."', NOW())"); //recup l'id enregistre $id = mysql_insert_id(); //j'enregistre dans une session $_SESSION['id']=$id; // Puis on redirige vers le questionnaire header('Location: ./formulaire.php'); exit(); } } ?>
Le traitement.php :

Code : Tout sélectionner

<?php session_start(); // Parametres mysql à remplacer par les vôtres define('DB_SERVER', 'localhost'); // serveur mysql define('DB_SERVER_USERNAME', 'root'); // nom d utilisateur define('DB_SERVER_PASSWORD', ''); // mot de passe define('DB_DATABASE', 'test'); // nom de la base $DATE = date("Y/m/d H:i:s"); // Connexion au serveur mysql $connect = mysql_connect(DB_SERVER, DB_SERVER_USERNAME, DB_SERVER_PASSWORD) or die('Impossible de se connecter : ' . mysql_error()); // sélection de la base de données mysql_select_db(DB_DATABASE, $connect); $msg_erreur = "Erreur. Les champs suivants doivent être obligatoirement remplis :<br/><br/>"; $msg_ok = "Votre demande a bien été prise en compte."; $quest10 = ""; if(isset($_POST['quest10'])) { $temp = implode(",",$_POST['quest10']); $quest10 = mysql_real_escape_string($temp); } $quest11 = ""; if(isset($_POST['quest11'])) { $temp = implode(",",$_POST['quest11']); $quest11 = mysql_real_escape_string($temp); } $quest20 = ""; if(isset($_POST['quest20'])) { $temp = implode(",",$_POST['quest20']); $quest20 = mysql_real_escape_string($temp); } $quest21 = ""; if(isset($_POST['quest21'])) { $temp = implode(",",$_POST['quest21']); $quest21 = mysql_real_escape_string($temp); } $quest22 = ""; if(isset($_POST['quest22'])) { $temp = implode(",",$_POST['quest22']); $quest22 = mysql_real_escape_string($temp); } $quest30 = ""; if(isset($_POST['quest30'])) { $temp = implode(",",$_POST['quest30']); $quest30 = mysql_real_escape_string($temp); } $quest31 = ""; if(isset($_POST['quest31'])) { $temp = implode(",",$_POST['quest31']); $quest31 = mysql_real_escape_string($temp); } $quest32 = ""; if(isset($_POST['quest32'])) { $temp = implode(",",$_POST['quest32']); $quest32 = mysql_real_escape_string($temp); } $quest40 = ""; if(isset($_POST['quest40'])) { $temp = implode(",",$_POST['quest40']); $quest40 = mysql_real_escape_string($temp); } $quest41 = ""; if(isset($_POST['quest41'])) { $temp = implode(",",$_POST['quest41']); $quest41 = mysql_real_escape_string($temp); } $quest42 = ""; if(isset($_POST['quest42'])) { $temp = implode(",",$_POST['quest42']); $quest42 = mysql_real_escape_string($temp); } $quest43 = ""; if(isset($_POST['quest43'])) { $temp = implode(",",$_POST['quest43']); $quest43 = mysql_real_escape_string($temp); } { $q2other = isset($_POST["q2other"]) ? mysql_real_escape_string($_POST['q2other']) : ""; } $q3other = isset($_POST["q3other"]) ? mysql_real_escape_string($_POST['q3other']) : ""; { $message = isset($_POST['message']) ? mysql_real_escape_string($_POST['message']) : ""; } $sql = "INSERT INTO formulaire(id,idaccount,quest10,quest11, quest20, quest21, quest22, quest30, quest31, quest32, quest40, quest41, quest42, quest43, q2other, q3other, message) VALUES ('',".$_SESSION['id'].",'$quest10','$quest11','$quest20','$quest21','$quest22','$quest30','$quest31','$quest32','$quest40','$quest41','$quest42','$quest43','$q2other','$q3other','$message')"; $res = mysql_query($sql); if ($res) { echo $msg_ok; } else { echo mysql_error(); } session_destroy(); ?>
Bon il y avait des implode à la base mais j'ai choisi de tout séparé peut être pour faire plus simple pour les statistiques...

Pourriez vous m'aider à finaliser tout ça s'il vous plais?
Merci par avance!

Mammouth du PHP | 2278 Messages

02 avr. 2013, 23:55

Je ferai pour ma part deux remarques:
1)
Il ne faudrait pas se servir de l
mysql mais de mysqli ou PDO (voir le manuel en ligne et d'innombrables remarques ici).
Si je devais corriger un projet, dans quelque langage que ce soit, je sanctionnerais le recours à mysql comme l'emploi de toute fonction obsolète.
2)
Comment sait-on que la réponse est juste ? peur-être ai-je mal vu la structure du questionnaire.
3)
Remarque supplémentaire : le qcm est la tarte à la crème des programmeurs débutants, mais pour en faire un qui vaille coup, il faut un énorme travail, en particulier pour l'analyse des réponses libres. (j'en sais quelque chose, pour avoir ça dans mes cartons avec Oui/non, réponses à cocher 1/n ou p/n, appariements, réponses libres avec gestion de synonymes, de mots interdits, mots dans l'ordre ou le désordre.... le tout avec ou sans illustration par un texte, une vidéo ou une musique.)
Vanitas vanitatum et omnia vanitas
Mes derniers livres :
Sauvez les Mots chez BoD,
Tous les chemins mènent à ROM chez BoD

Eléphanteau du PHP | 15 Messages

03 avr. 2013, 07:23

Excusez moi pais je n'ai pas parler de QCM ! Si c'est le cas je me suis trompé. C'est un questionnaire comme par exemple : Quelle est votre couleur préférée ? Suivi de 3 choix et un champs autre ou la personne peut laisser un message...
Et oui je debute, j'aime beaucoup les remarques constructives mais là, sans vous offenser, je ne vois pas le but hormi la critique facile...
Merci quand même...

Mammouth du PHP | 2278 Messages

04 avr. 2013, 07:50

Toutes mes excuses pour le QCM. En nrevanche, dans le même genre il y a Limesurvey (gratuit et libre: riche en création de questions, modeste en exploitation : tris à plat, tris croisés) dont la structure est peut être intéressante.
Il y a aussi ,
http://www.cs.cornell.edu/andru/civs.html
pour leur procédure de controle des votes.

Si ce n'est pas constructif que de faire remarquer que l'emploi de Mysql est à éviter, je suis pape. Il suffit pour cela de jeter un simple coup d'oeil au manuel en ligne.
d'autant que le passage à Mysli est assez facile: et que un tel projet, si vous parvenez à le développer (
création de documents papier d'enquête, ouverture du questionnaire sur invitation par les créateurs ou à tout le monde (une fois chacun) ou à ceux qui demandent à participer=
n'a pas légion de concurrents, sauf commerciaux et fort coûteux. application éventuelle de la loi de condorcet

Et QCM ou pas, l'analyse des réponses libres est un travail considérable en particulier la gestion d'éventuelles négations:
pour les exploiter dans ce cas-ci, il faudrait sans doute faire une première lecture avec interprétation humaine et création de modalités à la volée:
Si à la question 1, on a une réponse du genre:
Je mange du fromage à tous les repas
on crée une modalité : fromage_toujours ou quelque chose du genre et on indique que la réponse a été fournie une fois;
Vanitas vanitatum et omnia vanitas
Mes derniers livres :
Sauvez les Mots chez BoD,
Tous les chemins mènent à ROM chez BoD

Eléphanteau du PHP | 15 Messages

04 avr. 2013, 09:02

Bonjour,
Merci pour votre intervention. Je vais jeter un oeil et voir ce qui est plus simple.
Toutefois pour ma culture personnelle, j'aimerais quand même terminer ce script tel qu'il est avec MySql...
Je me doute que ce ne doit être que du calcul et du SELECT mais je ne connais pas le fonctionnement.
Pourriez vous m'expliquer ceci s'il vous plais? Merci par avance!

Mammouth du PHP | 2278 Messages

04 avr. 2013, 11:32

En ros mysqli c'est le même jeu de commmandes avec des syntaxes un peu différentes, et en particulier si ça vous plaît la possibilité de passer en POO
ex:
Connexion
Mysql
$lien = mysql_connect('localhost', 'root', '');
if (!$lien)
{
die ('Impossible de se connecter : ' . mysql_error());
}
Mysqli
procédural
$lien = mysqli_connect('localhost', 'root', '');
if (!$lien)
{
die ('Erreur de connexion (' . mysqli_connect_errno() . ') '. mysqli_connect_error () );
}
Mysqli objet
$lien = new mysqli('localhost', 'root', '');

if ($lien->connect_error) {
die('Erreur de connexion (' . $lien->connect_errno . ') '
. $lien->connect_error);
}
echo 'Succès... ' . $lien->host_info . "\n";


Remarque
Avec Mysqli, on peut passer en quatrième paramètre le nom de la base de données sur laquelle se feront, par défaut, les manipulations.
J'ai un document en préparation sur ce thème.
Vanitas vanitatum et omnia vanitas
Mes derniers livres :
Sauvez les Mots chez BoD,
Tous les chemins mènent à ROM chez BoD