Aide pour finalisation de code

Résolu
wookiee80
Messages postés
14
Date d'inscription
mercredi 31 octobre 2007
Statut
Membre
Dernière intervention
26 mars 2009
- 12 juin 2008 à 13:55
JoJo738
Messages postés
1267
Date d'inscription
mercredi 7 juillet 2004
Statut
Membre
Dernière intervention
29 juin 2010
- 27 juin 2008 à 10:35
Bonjour tout le monde.

J'ai besoin d'un peu d'aide pour finaliser ce code dans lequel je patoge un peu

donc voila le principe est:

ce
code dois générer une série de question incluant un formulaire pour
chacune d'elle différent suivant si la question a déjà ou non été
répondu.

donc si ça a été répondu par la réponse pas_acquis:
je redonne la question avec comme possibilité répondre
par en cours d'acquisition ou acquis

si ça a été répondu pas en_cours:
je redonne la question avec pour seule possibilité choisir acquis

et si c acquis j'affiche juste la question.

tout ça je le gère avec une table question dans laquelle j'ai l'ID de la question plus la question en elle même

et
une table réponse contenant l'ID réponse, l'ID de la question, le n° de
l'agent(retenu dans une session), pas acquis, en cours et acquis.

Pour l'instant le résultat est :

j'obtiens bien la liste de mes questions.
le formulaire qui va avec qui est celui avec les trois choix étant donné que la table réponse est vide.
Par contre rien ne s'enregistre au niveau de la table réponse lorsque j'envoie un choix.

Donc je pense que ça vient du fait que je créé ma variable $ID_question_traitement avant ma fonction mysq_fetch_array.



Mais le problème c'est que je ne sais pas du tout comment bouger l'un
ou l'autre étant donné que si je bouge ma variable alors elle ne sera
pas prise en compte au départ. Et si je bouge ma fonction j'avance d'un
cran dans le tableau créé par cette fonction et me retrouve alors
coincé.

Donc voila le code en question:



if (empty($_SESSION['epicea']))
{
header("location:accueil_questionnaire.php");
}

$epicea = $_SESSION['epicea'] ;

?>




traitement de texte











Traitement de texte writer



27 réponses

MasterCent
Messages postés
83
Date d'inscription
jeudi 22 septembre 2005
Statut
Membre
Dernière intervention
14 décembre 2011
1
13 juin 2008 à 15:50
Salut wookiee80,

Sans rentrer dans ton code, une ligne attire mon attention :



" value= "pas_acquis" id="pas_acquis"/><label for="pas_acquis">Pas acquis</label>

Ne devrais tu pas faire un <?php echo $ID_questions_traitement ?> , as tu testé ta page coté client (code source de la page ) ?

Que vaut $choix, après le code : $choix = $_POST['$ID_questions_traitement'];
Que donne un print_r ($_REQUEST );

Enfin, et que les experts me corrigent, il me semble que : $_POST['$ID_questions_traitement']; devrait s'ecrire $_POST[$ID_questions_traitement]; (sans apostrophe) ou




$_POST["$ID_questions_traitement"];

Voilà pour un début,

m100









 
3
JoJo738
Messages postés
1267
Date d'inscription
mercredi 7 juillet 2004
Statut
Membre
Dernière intervention
29 juin 2010
1
13 juin 2008 à 18:48
Bon, petite correction rapide ;)

Code commenté mais NON corrigé ;)

<?php

session_start();

// il faut vérifier l'existance de $_SESSION['epicea'] ... isset()
if (empty($_SESSION['epicea']))
{
    header('location: accueil_questionnaire.php');
}
$epicea = $_SESSION['epicea'];

?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr">
<head>
 <title>traitement de texte</title>
 <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
 <meta content="wookiee" name= "author" /</gras>
 <link rel ="stylesheet" media="screen" type="text/css" title="design" href="style/design_learning.css" />
</head>

<?php

// Si il y a une erreur, autant l'affichier dans le corps de la page

// je te conseil de faire un fichier config avec une connexion MySQL (comme ça tu n'as plus besoin de modifier qu'un seul fichier)
mysql_connect('localhost', 'root', '');
mysql_select_db('e_learning');

?>

Traitement de texte writer

<?php

//    ********************************************************
//    *                                                *
//    *                                                *
//    *   PRINCIPE POUR LES QUESTIONNAIRES E_LEARNING     *
//    *                                                *
//    *                                                *
//    ********************************************************

//    Au chargement de la page:
//    ________________________
//
//
//
//    -Afficher chaque question avec suivant la reponse deja ou non fournie
//         un formulaire adequat.
//
//
//    faire une boucle pour afficher toutes les questions:(la on va faire pour le traitement de texte writer en exemple)
//
//
//                * on va aller chercher toutes les questions avec une requete:

$questions_traitement =  'SELECT * FROM questions_traitement';
// evite les *, précise les champs
$requete = mysql_query($questions_traitement) or die (mysql_error().'\n'.$questions_traitement);// pour avoir mon erreur precisement

$ID_question_traitement = $questions_traitement2['ID_questions_traitement'];
// -> D'ou vient $questions_traitement2 ???
// ne serait-ce pas $questions_traitement['ID_questions_traitement']
// dans ce cas, tu fais : 'SELECT ID_questions_traitement, mon_champ2, mon_champ3 ...' et pas de 'SELECT * ...'

// on créé des variable pour chaque type de reponse potentielle:
// et on va chercher les reponses eventuellement deja enregistrées:

// j'ai modifié les "/', je préfère les ' (déjà point de vue rapidité ;))
$reponse_traitement_pas_acquis = mysql_query('SELECT pas_acquis FROM reponses_traitement WHERE epicea="'.$epicea.'" AND ID_questions_traitement="'.$ID_question_traitement.'"') or die (mysql_error());

$reponse_traitement_en_cours = mysql_query('SELECT en_cours FROM reponses_traitement WHERE epicea="'.$epicea.'" AND ID_questions_traitement="'.$ID_question_traitement.'"') or die (mysql_error());

$reponse_acquis = mysql_query('SELECT acquis FROM reponses_traitement WHERE epicea="'.$epicea.'" AND ID_questions_traitement="'.$ID_question_traitement.'"') or die (mysql_error());

// Tes trois requetes n'ont aucun sens ainsi séparées ... elles récupères toutes les trois des valeurs différentes, mais avec une même recherche (WHERE), autant en faire une seule. Ou alors tu as oublié un WHERE .... là encore, possibilité de es rasemblées en une seule ;)

// as tu vérifié $epicea et $ID_question_traitement ??
// -> si tu sais que c'est une donnée numérique -> $épicea = intval($epicea);
//    sinon, mysql_escape_string($epicea)
// Idem pour $ID_question_traitement

// Pour chacunes des reponses eventuelles on va regarder si il  a deja une entrée dans la table
//  si c'est le cas alors c'est que l'agent a deja repondu à cette question.

$reponse_traitement_pas_acquis2 = mysql_num_rows ($reponse_traitement_pas_acquis);
$reponse_traitement_en_cours2 = mysql_num_rows ($reponse_traitement_en_cours);
$reponse_acquis2 = mysql_num_rows ($reponse_acquis);
// Hum ... je te conseil $nbre_traitement_pas_acquis, ca evitera te t'embrouillé dans ton code et aidera ceux qui t'aiderons

$choix = $_POST['$ID_questions_traitement' ];
// EUH .... $_POST[$ID_questions_traitement]; pultôt, non ?
// Tu ne verifies pas que ta variable existe ???
// -> ISSET() ! (avec gestion des erreurs)

// Avec un peu de recherche, tu peux regrouper toutes tes requetes en une seule
// SELECT COUNT(q1.pas_acquis) as count_pas_aquis, COUNT(q2.en_cours) as count_en_cours FROM reponses_traitement as q1, reponses_traitement as q2 WHERE ...

if (isset($_POST['$ID_questions_traitement']))
{
    if    ( $choix == 'pas_acquis')
    {
        mysql_query ("INSERT INTO reponses_traitement VALUES ('','".$ID_question_traitement."','".$epicea."','1','','')")
        or die (mysql_error());

    }
    if ($choix == 'en_cours')
    {
        mysql_query ("INSERT INTO reponses_traitement VALUES ('','".$ID_question_traitement."','".$epicea."','','1','')")
        or die (mysql_error());

    }
    if ($choix == 'acquis')
    {
        mysql_query ("INSERT INTO reponses_traitement VALUES ('','".$ID_question_traitement."','".$epicea."','','','1')")
        or die (mysql_error());

    }
    // Je te conseilerais un switch peut être ...
    /*
     * switch($choix)
     * {
     *     case 'pas_acquis' :
     *         mysql_query ('INSERT INTO reponses_traitement VALUES ("","'.$ID_question_traitement.'","'.$epicea.'","1","","")') or die (mysql_error());
     *       break;
     *
     *     case 'pas_acquis' :
     *         mysql_query ('INSERT INTO reponses_traitement VALUES ("","'.$ID_question_traitement.'","'.$epicea.'","","1","")') or die (mysql_error());
     *       break;
     *
     *     case 'pas_acquis' :
     *         mysql_query ('INSERT INTO reponses_traitement VALUES ("","'.$ID_question_traitement.'","'.$epicea.'","","","1")') or die (mysql_error());
     *       break;
     *     default :
     *         echo 'Erreur !';
     *       break;
     * }
     */
    // D'ailleurs, si tu n'as que ça comme traitement, tu peux faire un champ $sql = '"", "", ""'; et l'intégré dans une requete plus loin (tu n'aura qu'a modifier ton $sql
    // Et si c'est pas déjà fait plus haut : protège tes variables (une faille est si vite arrivée) !!
}

// Voila tout est pret pour faire la boucle et afficher les questions :

// perso, je prèfere mysql_fetch_assoc ... question de gôut ( $row->id, $row->question_traitement, ...). A toi de voir ;)
while ($questions_traitement2 = mysql_fetch_array($requete))
{

    echo  $questions_traitement2['question_traitement'] ;

    // if( $reponse_traitement_pas_acquis2 + reponse_traitement_en_cours2 + $reponse_acquis2['question_traitement'] == 0 )
    // ;) (faire gaffe aux nombres négatifs, mais pas le cas ici :p
    if($reponse_traitement_pas_acquis2 ==0 AND $reponse_traitement_en_cours2 ==0 AND $reponse_acquis2['question_traitement'] ==0)
    {

        ?>

<form action="traitement_de_texte.php" method="POST">

<?php echo $ID_questions_traitement; ?>" value ="pas_acquis" id="pas_acquis" />
<label for="pas_acquis">Pas acquis</label>
 <?php echo $ID_questions_traitement; ?>" value="en_cours" id="en_cours" />
<label for="en_cours">En cours d'acquisition</label>
" value="acquis" id="acquis" />
<label for="acquis">Acquis</label>

</form>

<?php
}

    // if( $reponse_traitement_pas_acquis2 + reponse_traitement_en_cours2 + $reponse_acquis2['question_traitement'] == 0 )
    // ;) (faire gaffe aux nombres négatifs, mais pas le cas ici :p
if($reponse_traitement_pas_acquis2 !=0 AND $reponse_traitement_en_cours2==0 AND $reponse_acquis2['question_traitement']==0)
{

    ?>

<form action="traitement_de_texte.php" method="POST">

<?php echo $ID_questions_traitement; ?>" value="en_cours" id="en_cours" />
<label for="en_cours">En cours d'acquisition</label>
<?php echo $ID_questions_traitement; ?>" value="acquis" id="acquis/">
<label for="acquis">Acquis</label>

</form>
    <?php
}

// ...
if($reponse_traitement_pas_acquis2 !=0 AND $reponse_traitement_en_cours2 !=0 AND $reponse_acquis2['question_traitement']==0)
{

    ?>

<form action="traitement_de_texte.php" method="POST">

<?php echo $ID_questions_traitement; ?>" value="acquis" id="acquis" />
<label for="acquis">Acquis</label>

</form>
    <?php
}

// ...
// Euh, pourquoi les avoirs séparées ??? Pourtant c'est à chaque fois le même IF, non ? regroupe tout ! (encore le cas en bas)

if($reponse_traitement_pas_acquis2 !=0 AND $reponse_traitement_en_cours2 !=0 AND $reponse_acquis2['question_traitement'] !=0)
{
    echo 'Validé';

}

}
?>

</html>

<?php
mysql_close();
?>

<hr />Si ma reponse te convient, merci de l'accepter ! 
3
JoJo738
Messages postés
1267
Date d'inscription
mercredi 7 juillet 2004
Statut
Membre
Dernière intervention
29 juin 2010
1
16 juin 2008 à 14:39
Hello,

Euh ... $ID_question_traitement n'est pas défini (partie traitement) ^^

Sinon,
if (!isset($_SESSION['epicea']) || empty($_SESSION['epicea']))
{
    header("location:accueil_questionnaire.php");
}
;)

Ah, et pour tes requetes, après quelques galères j'ai trouvé ça (pas moyens de regroupé les count en utilisant plusieurs tables :s) :

SELECTCOUNT(NULLIF( pas_acquis,0 )) as nbre_pas_acquis,COUNT(NULLIF(en_cours,0)) as nbre_en_cours,COUNT(NULLIF(acquis,0)) as nbre_acquis
FROM`reponses_traitement`

<hr />Si ma reponse te convient, merci de l'accepter ! 
3
JoJo738
Messages postés
1267
Date d'inscription
mercredi 7 juillet 2004
Statut
Membre
Dernière intervention
29 juin 2010
1
16 juin 2008 à 15:22
Si je regarde ton code, je me pose une question :

$ID_question_traitement ne serait pas un parametre GET ???

Sinon, pour rendre ton script plus simple, je te ceonseil un champ situation, avec comme valeur 0 (pas acquis), 1 (en cours), 2 (acquis). En effet, soit c'est asquis, soit pas soit en cours : donc pas besoin de s'embetter avec trois champs alors qu'un seul suffit (ma requete_count() serait légérement différente, au lieu d'avoir 0 0 0 il y aurait 1 2 3 (NULLIF))

<hr />Si ma reponse te convient, merci de l'accepter ! 
3

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
JoJo738
Messages postés
1267
Date d'inscription
mercredi 7 juillet 2004
Statut
Membre
Dernière intervention
29 juin 2010
1
16 juin 2008 à 17:29
Hum, me suis encore défoulé !! ^^

Bon, regarde ce code, c'est un truc fait vite fait (sais pas si ca marche, d'ailleur ca marchera pas ;)) Faita ttention au id_qestion et au traitement. Ce quie st en rouge c'est ce que tu aurais dû faire pour faire fonctionner ton script ;)
Mon echo <<< EOS\nEOS; est un echo normal ;)

Ensuite, un truc que j'ai aps comrpis ... tu as des questions dans ta table, puis, quand le gars change l'état de la question, tu RAJOUTE dans ta table, la même question ...
Donc, il te faut une table avec les questions, et une table avec les reponses des users. Tu lis les questions, et tu ne fait que rajouté/editer les réponses. Perso, j'aime pas trop ça (on doit vérifier si la valeur existe, sinon on édite bla bla bla ...).
Dans ce cas là, dans ma table user, (ou autre), il y a un champ long_text dans lequel je serialize() (regarde sur php.net) mon resultat POST. C'est beaucoup plus imple :p (mais la lecture SQL est beaucoup moins facile : tu dois lire, unseriliser() le resultat, puis traiter (ou jongler entre ID des questions et REGEX))

<?php

/////// /////// /////// /////// /////// /////// /////// /////// /////// ///////
/////// /////// /////// /////// /////// /////// /////// /////// /////// ///////

/*
 * Fichier de connection MySQL
 */

mysql_connect('localhost', 'root', '');
mysql_select_db('e_learning');

/*
 * Fin du fichier de connexion
 */

/////// /////// /////// /////// /////// /////// /////// /////// /////// ///////
/////// /////// /////// /////// /////// /////// /////// /////// /////// ///////

if (!isset($_SESSION['epicea']) || empty($_SESSION['epicea']))
{
    Header('location: accueil_questionnaire.php');
}
$epicea = $_SESSION['epicea'] ;

// En fait, on crée une boucle POST. Grace au name="quest[ key ]"
// Donc, on lit la boucle grâce au foreach
if( isset($_POST['quest']) )
{
    foreach( $_POST['quest'] as $id_question => $value )
    {
        // action pour chaque question        // UPDATE FROM table SET situation $value WHERE id_question $id_question
    }
}

$questions_traitement =  'SELECT * FROM questions_traitement';
$requete = mysql_query ($questions_traitement) or die (mysql_error() . "\n" . $questions_traitement);

echo <<< EOS
 <form action="?" method="POST">
 
EOS;

while ( $row = mysql_fetch_array($requete) )
{
    echo '
 
   ', $row['question_traitement'], ' ';
   
    switch( $row['situation'] )
    {
        case 0 :
            // PAS ACQUIS
            echo '
   quest[', $row['question_id'], ']" value ="0" id= "pas_acquis" checked="checked" /><label for="pas_acquis">Pas acquis</label>
   quest[', $row[' question_id '], '" value ="1" id= "en_cours" /><label for="en_cours">En cours d\'acquisition</label>
   quest[', $row[' question_id '], '" value ="2" id= "acquis" /><label for="acquis">Acquis</label>';
            break;
        case 1 :
            // EN COURS
            echo '
   quest[', $row[' question_id '], '" value ="1" id= "en_cours" checked="checked" /><label for="en_cours">En cours d\'acquisition</label>
   quest[', $row[' question_id '], '" value ="2" id="acquis" /><label for="acquis">Acquis</label>';
            break;
        case 2 :
            // ACQUIS
            echo '
   Acquis';
            break;
    }
   
    echo '
 

';
}

echo <<< EOS
 
  
 

 </form>
EOS;

?>

<hr />Si ma reponse te convient, merci de l'accepter ! 
3
MasterCent
Messages postés
83
Date d'inscription
jeudi 22 septembre 2005
Statut
Membre
Dernière intervention
14 décembre 2011
1
17 juin 2008 à 09:28
Salut Wookiee80 et Jojo738,

De mon côté, j'ai un peu bossé sur la partie DataBase :
Imaginons qu'il existe une table des Quetsions et une table des Réponses.
J'ai simplifié la structure comme suit :

-- Structure de la table `test_quest`

CREATE TABLE `test_quest` (
  `Q_ID` bigint(20) NOT NULL auto_increment,
  `Q_NUM` bigint(20) NOT NULL,
  `Q_TEXT` varchar(255) NOT NULL,
  PRIMARY KEY  (`Q_ID`)
) ENGINE= InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=6 ;

-- Contenu de la table `test_quest`

INSERT INTO `test_quest` (`Q_ID`, `Q_NUM`, `Q_TEXT`) VALUES
(1, 1, 'Voir'),
(2, 2, 'Entendre'),
(3, 3, 'Gouter'),
(4, 4, 'Toucher'),
(5, 5, 'Sentir');

CREATE TABLE `test_rep` (
  `R_ID` bigint(20) NOT NULL auto_increment,
  `R_Q_ID` bigint(20) NOT NULL,
  `R_U_ID` bigint(20) NOT NULL,
  `R_STATUT` int(11) NOT NULL COMMENT '0 ou Null -> 2',
  PRIMARY KEY  (`R_ID`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 COMMENT='Les réponses' AUTO_INCREMENT=4 ;

-- Contenu de la table `test_rep`

INSERT INTO `test_rep` (`R_ID`, `R_Q_ID`, `R_U_ID`, `R_STATUT`) VALUES
(1, 2, 77, 1),
(2, 3, 77, 2),
(3, 2, 78, 2);

Autrement dit, il existe 5 questions, auquelles deux utilisateurs n° 77 et 78 ont partiellement répondu !

Pour connaitre TOUS les statuts de réponses d'un utilisateur, la requête suivante devrait faire l'affaire !

-- Quel est l'état d'avancement d'un utilisateur ?
SELECT Q_ID , Q_NUM , Q_TEXT , ifnull ( R_STATUT , 0 ) 
 FROM `test_quest` left join  ( select * from  `test_rep` where R_U_ID = 77 ) alias_R
on Q_ID = R_Q_ID  ; 

Ce qui renverra un tableau de toutes les réponses ( dont les statuts null auront été mis à zéro )

Dans le code PHP, un boucle pourra parcourrir toutes les réponses de ce user,
une instruction  swicth() construira les statut restants : ( en ne mettant pas de break au CASE, et en travaillant en ordre croissant de statut )

J'y bosse un peu + tard !

m100
3
MasterCent
Messages postés
83
Date d'inscription
jeudi 22 septembre 2005
Statut
Membre
Dernière intervention
14 décembre 2011
1
17 juin 2008 à 10:55
Et voilà un exemple d'utilisation du cas décrit précédement :

<?PHP
    // Auteur : PhilippeE - 2008 //

// données perso, pour acces à MA base
   require_once ( "../IBFFP/projet.php5" ) ;

// pour les tests ...
   print_r ( $_REQUEST ) ;
   echo ("<HR/>") ;

// traitement :

   $UID = "77" ; // via Session, ... 77 est un exemple ..

function ConstruitFormulaire ( $UID ) {

    // securité :
    if ( ! (is_numeric ( $UID )) ) Die ( "tentative d'intrusion" );
   
    $result = "" ;
       
    // interrogation de la base de données,
    $sql = " SELECT Q_ID , Q_NUM , Q_TEXT ,
                if ( isnull( R_STATUT ) , 0 , R_STATUT )  AS STATUT
             FROM `test_quest` left join
             ( select * from  `test_rep` where R_U_ID = 77 ) alias_R
             on Q_ID = R_Q_ID  " ;

    // mettre ici les parametres propres    
    $db = mysql_connect ( PRJ_DBSERVER , PRJ_DBUSER  , PRJ_DBX  )
          or Die ("echec connection pour " . PRJ_DBUSER . PRJ_DBX ) ;
          mysql_select_db    (  PRJ_DATABASE  , $db ) ;

    // soumission de la requete ( ifnull est remplace par un test IF()   
    $rs = mysql_query   (  $sql ) or Die ("echec de soumission requête $sql" ) ;

    // construction d'un formulaire des reponses possibles ( % au statut )
    while ( $row = mysql_fetch_array ( $rs ) ) {
       
            $Q_ID = $row [0] ;
            $Q_NUM = $row [1] ;
            $Q_TEXT = $row [2] ;
            $R_STATUT = $row [3] +1 ; // +1 car ce sont les réponses possibles
             
              $result .= "<label>$Q_TEXT</LABEL>
" ;
             
              switch( $R_STATUT ) {
             
             case 0 ;
              $result .= "A faire
" ;      
               case 1 ;
              $result .= "En cours
" ;      
               case 2 ;
              $result .= "Fait
" ;      
           
              break ;
              default :
              $result .= "Fait
" ;
             
            } // swicth
             
             
    } // while

    mysql_free_result($rs) ;
   
    return $result ;
   
} // ConstruitFormulaire

echo "<HTML><FORM>" ;
echo ConstruitFormulaire ( $UID  ) ;
echo "";
echo "</FORM></HTML>" ;

?>
3
MasterCent
Messages postés
83
Date d'inscription
jeudi 22 septembre 2005
Statut
Membre
Dernière intervention
14 décembre 2011
1
17 juin 2008 à 14:01
OK, voici la suite :


Attention :  je me souviens que jojo738 proposait une
sérialisation, à adapter à son idée donc ... car c'est le SQL auquel je m'interresse ici !

// Ecriture

/* Récupération des réponses ( dans mon exemple,
   quelque chose qui ressemblerait à ceci ! array(Q1 => 1 , Q3 => 2 ) */

function EcritureReponses ( $UID , $aRep )
{
    // mettre ici les parametres propres    
    $db = mysql_connect ( PRJ_DBSERVER , PRJ_DBUSER  , PRJ_DBX  )
          or Die ("echec connection pour " . PRJ_DBUSER . PRJ_DBX ) ;
          mysql_select_db    (  PRJ_DATABASE  , $db ) ;

    if ( ! (is_numeric ( $UID )) ) Die ( "tentative d'intrusion" );
    
   // parcours de toustes les réponses de l'utilisateur
    while ( list ( $key , $value ) = each ( $aRep ) )
    {

          if ( $key[0] == "Q" ) { // est-ce une Question ?
            $QID = $key[1] ; // ICI il n'y a pas de Q > 9 !! ; A FAIRE DONC
              
               // préparation d'un UPDATE             $sql "UPDATE `test_rep` SET `R_STATUT` '$value'                        WHERE `R_U_ID` $UID and `R_Q_ID` $QID LIMIT 1 " ;

            // echo ( $sql . "
") ;       

            // Execution , sans recordset    
            $tmp =     mysql_unbuffered_query( $sql ) or die ( mysql_error() ) ;
           
            // Test si aucun enregistrement n'a été modifié
            if ( ! mysql_affected_rows() ) {
               /* PRUDENCE, CAR RISQUE DE DOUBLONS, SI PAS DE CHANGEMENT
                  Solutions,
                  soit un champ dans lequel on note la date et l'heure                              
                  soit un test si existant,...
                  soit un index SQL qui empeche les doublons !
                   */
                                
                // pas d'affectations -> création
                 $sql = "INSERT INTO `test_rep` ( `R_Q_ID` , `R_U_ID` , `R_STATUT` )
                            VALUES (     '$QID' , '$UID', '$value'     ) " ;
                   
                // echo ( $sql ."
") ;   
                // Execution , sans recordset    
                $tmp =     mysql_unbuffered_query( $sql ) or die ( mysql_error() ) ;
                }
   
          }// if
   
    } // While   

} // EcritureReponses

// traitement :

 $UID = "77" ; // via Session, ... 77 est un exemple ..

EcritureReponses ( 77 , $_REQUEST ) ;

Voilà pour la partie SQL
3
JoJo738
Messages postés
1267
Date d'inscription
mercredi 7 juillet 2004
Statut
Membre
Dernière intervention
29 juin 2010
1
17 juin 2008 à 18:37
Salut ;)

Je penche vite fait, après je vais réviser pour mon bac ^^

Pour la sérialisation le but est d'avoir une table avec les questions et une table user avec un seul champ réponse.
Ensuite, on récupère les informations du POST/GET et on serialize(), on obtient un array linéaire (une chaine de caractère = à l'array()). Si on veut modifier les informations, on deserialize() la valeur du champ SQL et on traite comme un array() normal.

@ MasterCent
Euh, $_REQUEST est une valeur déprécié (qui ne s'utilise plus, par soucis de compatibilité ) -> va directement au POST, GET, ENV, SESSION, COOKIE, ...
Aussi au niveau des echo : echo '...'; echo '...', ' j\'ai utilisé une virgule,', $var, ' et pas de double quote. Sauf ici :', "\n";
Ton $sql, sécurise le ^^ -> tu ne sais pas si valeur est une bonne valeur ;)

Je replancherai plus tard ;)

<hr />Si ma reponse te convient, merci de l'accepter ! 
3
MasterCent
Messages postés
83
Date d'inscription
jeudi 22 septembre 2005
Statut
Membre
Dernière intervention
14 décembre 2011
1
18 juin 2008 à 08:10
@Jojo738,

tu as parfaitement raisons sur deux points :
- $_REQUEST n'est pas à utiliser ( en réalité, je l'emploi en phase de tests lorsque je n'ai pas encore tranché sur la méthode :-), sinon, en général $_POST pour les form / $_GET pour l'Ajax

- Le sql n'est pas (suffisamment) sécurisé ! ( d'habitude, j'ai une fonction qui se charge de cette partie pendant la construction de la chaine SQL ... )  c'est à faire !

Là ou je suis partagé, c'est de ne consacrer qu'un seul champ pour les réponses. L'expérience m'a appris qu'il faut toujours anticiper les changements  courants (  rajout ou suppression de questions, etc ... ).  De plus, une des formes normales des bases de données  Entité-Relationnelle interdit les champs multivalués ( autrement dit, dont la valeur totale se décomposent en plusieurs valeurs - ici les différentes réponses - a la manière de flags ) cfr :  http://fr.wikipedia.org/wiki/Forme_normale_(bases_de_donn%C3%A9es_relationnelles) 
Maintenant, il peut s'agir d'économie de place ( ce que je comprendrait aisément ! ) // mais tout cela est déjà loin pour moi.

Je m'en retourne travailler !
Bon boulot ! et bon bac !

m100
3
JoJo738
Messages postés
1267
Date d'inscription
mercredi 7 juillet 2004
Statut
Membre
Dernière intervention
29 juin 2010
1
18 juin 2008 à 19:43
L'expérience m'a appris qu'il faut toujours anticiper les changements  courants (  rajout ou suppression de questions, etc ... )

Il est possible de s'en sortir. Etant donné que c'est sous la forme d'aun Array(), il suffit de travailler sur le tableau de sortie. Suppression et addition sont tout aussi facile ($array['new_id'] = '...'; / unset($array['id']); / ...). Le seul *hic*, c'est quand on veut obligatoirement traiter tous les resultats ... la c'est une grosse perte.

En fait, je ne l'utilise que quand c'est obligatoire (historique pour forum (messages lu/non lus) .... enfin, quand je dis obligatoire, je parle de la perte de place dans ma BD ^^

HS : plus au j'ai écrit deserialize()
, c'est unserialize()



<hr />





Si ma reponse te convient, merci de l'accepter ! 
3
MasterCent
Messages postés
83
Date d'inscription
jeudi 22 septembre 2005
Statut
Membre
Dernière intervention
14 décembre 2011
1
20 juin 2008 à 13:35
Salut Wookie80,


[...]
Dans la requet sql :
// interrogation de la base de données,
    $sql = " SELECT Q_ID , Q_NUM , Q_TEXT ,
                if ( isnull( R_STATUT ) , 0 , R_STATUT )  AS STATUT
             FROM `test_quest` left join
             ( select * from  `test_rep` where R_U_ID = 77 ) alias_R
             on Q_ID = R_Q_ID  " ;

j'ai mis en rouge les zones d'ombre
j'ai recherché sur les site les alias mais en fait je ne comprends pas trop le truc
l'alias se fait entre le champ Q_ID de la table test_quest et le champ R_Q_ID de la table test_rep
c'est bien ça ?



C'est la jointure qui se fait ici, entre la table test_quest et la sous-requête 

( select * from  `test_rep` where R_U_ID = 77 )

renomée alias_r.  ( alias_r n'est que le nom donné à la requête le temps de l'exécution - j'aurais pu l'appeler tmp01 ...)

Cette jointure (relation)  ne garde que les "couples" qui vérifie l'égalité de valeur entre Q_ID et R_Q_ID  ( ou  ecrit autrement : 





entre test_quest.Q_ID et  alias_R.R_Q_ID )
De plus cette jointure est particulière car il s'agit ici d'un LEFT JOIN , autrement dit,  toutes les valeurs de Test_quest, et , lorsqu'il y a égalité, celles de alias_r.
D'ou la présence des "null".
[ en fait, on tente d'extraire de la base de l'info qui ne s'y trouve pas,  au travers  le fait que si elle ne s'y trouve pas, c'est une info en soi !  ]







le isnull va servir à savoir si le champ R_STATUT contient une réponse.

=> Oui





Mais on fait la requete sur la table test_quest alors que le champ se trouve dans la table test_rep.


=> NON,
le test se fait sur la "multiplication" de la table test_quest et ( des réponses de R_U_ID dans la table test_rep renommé pour l'occasion ).
Donc isnnul teste le champ R_STATUT, issu de la requête alias_r .
A nouveau, je rebaptise ce champ, ou son résultat grâce à l'instruction AS STATUT - sous entendu "resulltat qui s'appellera STATUT'




Désolé je pense que c'est une incompréhension de ma part mais je ne tiens pas a recopier ton code bêtement sans comprendre
C'est là que je pêche en fait.



=> Savoir que l'on ignore est le premier pas sur le chemin de la connaissance.




m100
A+
3
MasterCent
Messages postés
83
Date d'inscription
jeudi 22 septembre 2005
Statut
Membre
Dernière intervention
14 décembre 2011
1
25 juin 2008 à 11:48
Salut wookiee80, ( &  Jojo738 )

Heureux d'entendre que ce forum t'apporte de l'aide.

Concernant "if ( ! (is_numeric ( $epicea )) ) Die ( "tentative d'intrusion" );",
l'idée est que de ne veux travailler que avec un numéro.

Il existe d'autres possibilités :
addslashes() ;  qui "protègera" quelque peu ton code,
mais aussi  $epicea =   1 *  $epicea ; qui aurait pour effet de " transtyper " ta variable. "22" (le mot) devient 22 (le nombre) ou provoque une erreur.

Pour ton code sql,
- essaie de l'injecter en direct dans une interface type phpmyadmin
- essaie de mettre de ` autour de tes valeurs  `R_ID_questions` = '1' - parfois cela aide (quel est le type de  R_ID_questions ? )

Mais surtout, divise ta recherche, pour localiser l'erreur !

A+

m100
3
wookiee80
Messages postés
14
Date d'inscription
mercredi 31 octobre 2007
Statut
Membre
Dernière intervention
26 mars 2009

16 juin 2008 à 11:34
bonjour tout le monde.

merci MasterCent :)
en effet deja avec l'echo ça va aller mieux
je l'ai remplacé entre temps car j'avais vu l'erreur entre deux ;)

merci aussi à toi JoJo738
ça m'a debloqué encore un peu dans ce code.
Par contre je ne ferme pas le post car j'en ai pas fini avec ce code.

Donc pour repondre aussi à M100 du coté client si j'affiche le code source de la page j'ai bien pour le name dans mon formulaire à chaque fois l'ID des questions. donc pour ça c'est ok c ce que je voulais avoir.

Mon probleme se pose sur le fzit que je veux comparer l'ID des questions dans la table questions_traitement avec l'ID des questions qui se trouvent dans la table réponse traitement.
A partir de ça si je trouve le meme ID pour le meme n° d'epicea c'est que la question à deja été repondu par l'agent.

Donc je vais devoir afficher de nouveau lma question mais en tenant compte de la reponse deja donnée.
Et c'est la que j'ai du mal.
Comment comparer ces deux ID  POUR l'agent connecté.
Car ça serait sur une question ça irait mais la c bien pour les 31 questions.

Enfin j'ai deja retoucher le code avec tes conseils JoJo738.
J'ai laissé quelques requetes comme je les avait mise car je n'arrivait pas à voir comment faire sans
ainsi que les if pour le formulaire, car ce n'est pas le meme.
A chaque fois il est different.

voila donc je vous remet le code retouché.(à moitié )
en soulignant la requete sur la table reponse_traitement que j'ai faite mais dont je ne me sers pas car c ici que je coince reelement.


<?php
    session_start();
    
    if (empty($_SESSION['epicea']))// verification d'une existance de session avec l'epicea en varia ble session.
    {
        header("location:accueil_questionnaire.php");
    }    
    
    
    $epicea = $_SESSION['epicea'] ;

////////////////////////////////////
// connection
        
        mysql_connect('localhost', 'root', '');
        mysql_select_db('e_learning');
        

////////////////////////////////////////////////////////////
// traitements

       
       if (isset($_POST[$ID_questions_traitement]))
        {
        
        if    ( $_POST[$ID_questions_traitement] == 'pas_acquis')
            {
                mysql_query ("INSERT INTO reponses_traitement VALUES ('','".$ID_questions_traitement."','".$epicea."','1','','')")
                or die (mysql_error());

            }
        if ($_POST[$ID_questions_traitement] == 'en_cours')
            {
                mysql_query ("INSERT INTO reponses_traitement VALUES ('','".$ID_questions_traitement."','".$epicea."','','1','')")
                or die (mysql_error());

            }    
        if ($_POST[$ID_questions_traitement] == 'acquis')
            {
                mysql_query ("INSERT INTO reponses_traitement VALUES ('','".$ID_questions_traitement."','".$epicea."','','','1')")
                or die (mysql_error());

            }    
        }       
    

    
            // on va chercher toutes les questions avec l'ID de la question dans la table question.
            $q = 'SELECT * FROM questions_traitement';
            $requete= mysql_query ($q)
            or die (mysql_error().'\n'.$requete);// pour avoir mon erreur precisement 
            
            // on va chercher l'ID des questions dans la table reponse afin d'avoir toutes les questions posées pour l'agent connecté dans la session
            $r = 'SELECT ID_questions_traitement FROM reponses_traitement WHERE epicea="'.$epicea.'"';
            $requete2 = mysql_query ($r)
            or die (mysql_error().'\n'.$requete2);
            
            $r2 = (mysql_fetch_array ($requete2)); // on construit un tableau pour mettre en ordre les valeurs de la table.       
                    
                    
                    
             // Pour chacunes des reponses eventuelles on va regarder si il  a deja une entrée dans la table
             //  si c'est le cas alors c'est que l'agent a deja repondu à cette question.

                $reponse_traitement_pas_acquis= mysql_query('SELECT pas_acquis FROM reponses_traitement WHERE epicea="'.$epicea.'" AND ID_questions_traitement="'.$ID_questions_traitement.'"')
                or die (mysql_error());

                $reponse_traitement_en_cours= mysql_query('SELECT en_cours FROM reponses_traitement WHERE epicea="'.$epicea.'" AND ID_questions_traitement="'.$ID_questions_traitement.'"')
                or die (mysql_error());

                $reponse_acquis= mysql_query('SELECT acquis FROM reponses_traitement WHERE epicea="'.$epicea.'" AND ID_questions_traitement="'.$ID_questions_traitement.'"')
                or die (mysql_error());

                $nbre_traitement_pas_acquis2 = mysql_num_rows ($reponse_traitement_pas_acquis);

                $nbre_traitement_en_cours2 = mysql_num_rows ($reponse_traitement_en_cours);

                $nbre_acquis2 = mysql_num_rows ($reponse_acquis);        

?>    

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr"  >
   <head>
       <title>traitement de texte</title>
       <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
       <meta content="wookiee" name="author">
       <link rel="stylesheet" media="screen" type="text/css" title="design" href="style/design_learning.css"/>
    </head>
    

    
    
    

    
    
       
       Traitement de texte writer

       
       

       
<?php

          
                    

                // Voila tout est pret pour faire la boucle et afficher les question:

                
                

                while ($q2= mysql_fetch_array($requete))

                {
                
                    $ID_questions_traitement = $q2['ID_questions_traitement'];
                    
                   

                    if($reponse_traitement_pas_acquis2 ==0 AND $reponse_traitement_en_cours2 ==0)
                    {
                     echo  $q2['question_traitement'] ;
                     ?>
                    
                    <form action="traitement_de_texte.php" method="POST">
                        " value="pas_acquis" id="pas_acquis"/><label for="pas_acquis">Pas acquis</label>
                          " value="en_cours" id="en_cours"/><label for="en_cours">En cours d'acquisition</label>
                          " value="acquis" id="acquis"/><label for="acquis">Acquis</label>

                        
                    </form>
                    

        
                    <?php
                    }
                    
                    if($reponse_traitement_pas_acquis2 !=0 AND $reponse_traitement_en_cours2==0 AND $reponse_traitement_acquis ==0)
                    {
                        echo  $q2['question_traitement'] ; 
                         ?>
                         
                        <form action="traitement_de_texte.php" method="POST">
                        
                            " value="en_cours" id="en_cours"/><label for="en_cours">En cours d'acquisition</label>
                            " value="acquis" id="acquis/"><label for="acquis">Acquis</label>

                            
                        </form>
                        <?php
                    }

                    if($reponse_traitement_pas_acquis2 !=0 AND $reponse_traitement_en_cours2 !=0 AND $reponse_traitement_acquis ==0)
                    {
                         echo  $q2['question_traitement'] ;
                        ?>
                    
                        <form action="traitement_de_texte.php" method="POST">
                        
                            " value="acquis" id="acquis"/><label for="acquis">Acquis</label>

                            
                        </form>
                        <?php
                    }

                    if($reponse_traitement_pas_acquis2 !=0 AND $reponse_traitement_en_cours2 !=0 AND $reponse_traitement_acquis !=0 )
                    {
                        echo 'Validé';
                        
                    }                    
                    
                    
                }
                ?>

                
       
        
    
            

</html>        

<?php
        mysql_close();
?>

0
MasterCent
Messages postés
83
Date d'inscription
jeudi 22 septembre 2005
Statut
Membre
Dernière intervention
14 décembre 2011
1
16 juin 2008 à 13:16
Bonjour Wookiee80,

Petite question : Dans ta base de données,
comment (quel type, quelle info) stockes tu les statuts "acquis", "en cours" ... ?Par exemple le mot ou  un chiffre  1 en cours, 2 acquis, ...

..

 
0
wookiee80
Messages postés
14
Date d'inscription
mercredi 31 octobre 2007
Statut
Membre
Dernière intervention
26 mars 2009

16 juin 2008 à 13:48
salut MasterCent

Alors dans ma BDD je stocke les reponses dans la table reponses_traitement
j'ai fais tois champs pas_acquis en_cours et acquis à zero par defaut et je stocke la valeur 1 quand ils sont repondus.
voila :)
0
wookiee80
Messages postés
14
Date d'inscription
mercredi 31 octobre 2007
Statut
Membre
Dernière intervention
26 mars 2009

16 juin 2008 à 15:12
oh d'accord je vois
en fait je ne me rendais meme pas compte que point de vue securité c'etait incomplet.

oui voila c bien ça mon probleme
car je ne sais pas comment le definir pendant cette phase.

d'accord oui ok je vois pour les requetes
c'est beaucoup plus soigné et on va dire plus rapide je pense.

et bien merci encore JoJo738
je ne manquerai pas de te tenir au courant quand ça fonctionnera en tout cas
il me manque que cette phase pour comparer les ID des questions posées venant de la table questions_traitement et celui enregistré dans le champ ID_questions_traitement dans la table reponse_traitement.
0
wookiee80
Messages postés
14
Date d'inscription
mercredi 31 octobre 2007
Statut
Membre
Dernière intervention
26 mars 2009

16 juin 2008 à 15:35
ah mais oui bien sur
en GET elle va etre retenue au rechargement de la page et etre donc traitée comme telle :)
mais si je ne m'abuse elle reprend une valeur differente au prochain rechargement de la page ?

encore une fois merci JoJo, pourquoi je ne l'ai pas fait avant.
de une je ne vais pas avoir 3 champs differents et en plus je facilite le traitement car je ne fais qu'une entrée dans la table pour une question donnée.

encore merci je vais essayer ça de suite :)
0
JoJo738
Messages postés
1267
Date d'inscription
mercredi 7 juillet 2004
Statut
Membre
Dernière intervention
29 juin 2010
1
16 juin 2008 à 16:38
Heu .... pourquoi reprendrait-elle une valeur différente ??? Si c'est un paramètre GET, c'est fixe, c'est à toi de la changer.

Enfin, j'ai pas trop compris ton code ... peux tu expliquer le plus précisement possible le but de ton script ?

<hr />Si ma reponse te convient, merci de l'accepter ! 
0
wookiee80
Messages postés
14
Date d'inscription
mercredi 31 octobre 2007
Statut
Membre
Dernière intervention
26 mars 2009

16 juin 2008 à 16:47
d'accord.

alors voila la page doit afficher 31 questions avec 31 formulaires attachés donc un par question.
pourles formulaires j'ai des types radios pour le choix des reponses.

les questions sont du genre savez vous remplir une zone texte ?
les reponses : pas acquis en cours d'acquisition ou acquis.

pour un agent qui arrive sur cette page il est forcement connecté à sa session et a donc son n° epicea qui sert à le reconnaitre.

donc je dois par ce script pouvoir lui donner les 31 questions
avec suivant si il a deja repondu ou non different choix.

si il n'a pas repondu il a les trois choix: pas acquis en cours acquis
si il a repondu pas acquis il n'a pu que deux choix encours ou acquis
si il a deja repondu en cours il n'a pu que le choix acquis come solution
et si il a repondu acquis il ne voit plus que la question sans pouvoir y repondre.

voila voila apres si tu veux voir les tables qui vont avec tu n'as qu'a me le dire et je te les envoie a la rigueur :)
la je m'en vais pour ce soir dslé :s

merci pour ton aide en tout cas ;)
ciao et bonne fin d'apres midi :)
0