Récupérer valeur de checkbox pour MAJ base

a marqué ce sujet comme résolu.

Bonjour,

utiliser les checkbox s’avère beaucoup plus compliqué que ce que j’imaginais… j’ai une table dans laquelle j’enregistre les valeurs de mes checkbox (0 : non coché ; 1 : coché) l’utilisateur peut donc cocher ou décocher la checkbox "NR" de chaque enregistrement

Image utilisateur

l’affichage fonctionne correctement : lorsque la valeur est 0 en base la case est décochée et cochée quand c’est 1.

par contre, l’action de cocher/décocher et enregistrer la valeur correspondante en base ne fonctionne pas correctement :

quelque soit la case que je coche, tous les enregistrements affichés passent à 1 dans ma table

par ailleurs, le fait de décocher mes checkbox, n’enregistre pas 0 en base

j’ai regardé la valeur de $_POST[’non_rec’] avec var_dump() et j’ai bien un tableau et qui récupère bien ’on’ si coché et ’0’ si non coché et dans mon traitement j’utilise l’indice du tableau

donc je ne vois pas trop ce qui est faux une piste de réflexion ?

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
<form id="insertion" name="insertion" action="dms_modification3.php" method="POST">    
                            <?php
                            while($element= $query -> fetch()) 
                            {
                                ?>

                                  <input type="hidden" name="limite" value="<?php echo($limite) ;?>">
                                  <table>
                                    <tr class="class02">
                                      <td class="ID"><input class="id" type="text" name="id[]" value="<?php echo $element['id'] ;?>"></td>
                                      <td class="Patient"><input class="pat" type="text" name="pat[]" value="<?php echo $element['pat'] ;?>"></td>
                                      <td class="Fiche"><input class="fic" type="text" name="fic[]" value="<?php echo $element['fic'] ;?>"></td>
                                      <td class="Question"><input class="que" type="text" name="que[]" value="<?php echo $element['que'] ;?>"></td>
                                      <td class="Description"><input class="des" type="text" name="des[]" value="<?php echo $element['des'] ;?>"></td>
                                      <td class="Details"><input class="det" type="text" name="det[]" value="<?php echo $element['det'] ;?>"></td>
                                      <td class="Corrections"><input class="cor" type="text" name="cor[]" value="<?php echo $element['cor'] ;?>"></td>
                                      <!--<td class="NR"><input class="non_rec" type="checkbox" name="non_rec[]" value="<?php echo $element['non_rec'] ;?>"></td>-->
                                      <td class="NR">
                                      <input type="hidden" name="non_rec[]" value="0"/>
                                      <input class="non_rec" type="checkbox" name="non_rec[]" 
                                    <?php if($element['non_rec'] == 1) echo ' CHECKED="checked"'; ?>
                                      >

                                      </td>
                                      <td class="Commentaires"><input class="com" type="text" name="com[]" value="<?php echo $element['com'] ;?>"></td>
                                    </tr>
                                    </table>
                                <?php
                            }//fin while 
                        ?>

                                    <div>
                                    <input class="modifier" type="submit" value="Modifier">
                                    </div>

                                </form>

`
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
<?php
//connection au serveur
try
{
// On se connecte à MySQL
$bdd = new PDO('mysql:host=localhost;dbname=dms;charset=utf8', 'root', '', array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
}
catch(Exception $e)
{
// En cas d'erreur, on affiche un message et on arrête tout
die('Erreur : '.$e->getMessage());
}

//$nb = count($_POST['id']);
$limite = $_POST['limite'];
var_dump($_POST['non_rec'][1]);
//préparation de la requête
$requete = "UPDATE gbd_dat1 SET 
        pat = :patient,
        fic = :fiche,
        que = :question,
        des = :description,
        det = :details,
        cor = :correction,
        non_rec = :nonrecuperable,
        com = :commentaires
        WHERE id = :id ";

/* On prépare la requête à son exécution. Les marqueurs seront identifiés */
$result = $bdd->prepare($requete);

//print_r($bdd->errorInfo());
$result->bindParam('id',$id,PDO::PARAM_INT);
$result->bindParam('patient',$patient,PDO::PARAM_STR);
$result->bindParam('fiche',$fiche,PDO::PARAM_STR);
$result->bindParam('question',$question,PDO::PARAM_STR);
$result->bindParam('description',$description,PDO::PARAM_STR);
$result->bindParam('details',$details,PDO::PARAM_STR);
$result->bindParam('correction',$correction,PDO::PARAM_STR);
$result->bindParam('nonrecuperable',$nonrecuperable,PDO::PARAM_INT);
$result->bindParam('commentaires',$commentaires,PDO::PARAM_STR);

for($i=0;$i<$limite;$i++)
   {
        $patient=$_POST['pat'][$i];
        $fiche=$_POST['fic'][$i];
        $question=$_POST['que'][$i];
        $description=$_POST['des'][$i];     
        $details=$_POST['det'][$i];
        $correction=$_POST['cor'][$i];
        //$nonrecuperable=$_POST['non_rec'][$i];
        $nonrecuperable = isset($_POST['non_rec'][$i]) ? 0 : 1;
        $commentaires=$_POST['com'][$i];        
        $id=$_POST['id'][$i];
        $result->execute();
        //var_dump($patient);
    }

//affichage des résultats, pour savoir si la modification a marchée:
if($requete)
{
    echo("La modification à été correctement effectuée") ;
}
else
{
    echo("La modification à échouée") ;
}
?>

`

Salut !

Il faut bien se rendre compte que quand tu utilises des checkboxes, seules celles que tu as cochées seront envoyées. Ajouter à cela le fait qu’utiliser des attributs name sous forme de tableau non_rec[], ce seront toujours les X premiers enregistrements traités qui seront considérés comme ayant la case cochée, X étant le nombre de cases NR cochées. Donc tu ne coches que pour "la dernière ligne", ce sera comme si tu cochais uniquement pour la première.

Ce que je te conseille, c’est de regrouper tes valeurs par lignes en spécifiant ce numéro dans le name de tes inputs. Ce que font la plupart des frameworks que je connais dans ce cas, c’est de donner des name du genre ligne[ ici l'ID de l'enregistrement ][ ici le nom du champ ]. Pour un exemple concret, toujours avec ton champ non_rec, ça donnerait ceci : patients[<?php echo $element['id']; ?>][non_rec].

L’avantage avec ce système de nommage, c’est qu’au moment du traitement, tu boucles sur le contenu de $_POST['patients'], et tu as toutes les données pour un patient directement.

+0 -0

Non, pas de tutoriel, juste des explications et des exemples sur ton code.

Au lieu d’avoir ce que tu as actuellement, je te conseille de faire comme suit :

1
2
3
4
5
6
7
8
<td class="ID"><input class="id" type="text" name="patients[<?php echo $elements['id']; ?>][id]" value="<?php echo $element['id'] ;?>"></td>
<td class="Patient"><input class="pat" type="text" name="patients[<?php echo $element['id']; ?>][pat]" value="<?php echo $element['pat'] ;?>"></td>
<td class="Fiche"><input class="fic" type="text" name="patients[<?php echo $element['id']; ?>][fic]" value="<?php echo $element['fic'] ;?>"></td>
<td class="Question"><input class="que" type="text" name="patients[<?php echo $element['id']; ?>][que]" value="<?php echo $element['que'] ;?>"></td>
<td class="Description"><input class="des" type="text" name="patients[<?php echo $element['id']; ?>][des]" value="<?php echo $element['des'] ;?>"></td>
<td class="Details"><input class="det" type="text" name="patients[<?php echo $element['id']; ?>][det]" value="<?php echo $element['det'] ;?>"></td>
<td class="Corrections"><input class="cor" type="text" name="patients[<?php echo $element['id']; ?>][cor]" value="<?php echo $element['cor'] ;?>"></td>
<td class="NR"><input class="non_rec" type="checkbox" name="patients[<?php echo $element['id']; ?>][non_rec]"<?php if($element['non_rec'] == 1) echo ' checked="checked"'; ?> /></td>
Une meilleure manière de faire, selon moi

Comme ça, tu récupères toutes les valeurs pour un patient dans un tableau. Si tu as une valeur pour non_rec, c’est que la case a été cochée, dans le cas contraire, la case n’a pas été cochée. Il est certain que ça change ce que tu vas recevoir dans $_POST, au lieu de $_POST['id'], $_POST['pat'] etc., tu auras $_POST['patients'] sur lequel tu pourras utiliser foreach ($_POST['patients'] as $id => $donneesPatient), et $donneesPatient contient toutes les informations (id, pat, fic, que, des, etc. — au passage, pas très parlants tes noms de colonnes), donc $donneesPatient['fic'] te retourne ce que tu avais auparavant avec $_POST['fic'][$i], $donneesPatient['que'] est $_POST['que'][$i], etc.
En fait, si tu utilises les bons attributs name (surtout la partie entre les derniers crochets), tu as drectement un tableau que tu peux plus facilement passer à execute(). Si tu veux, par analogie, tes attributs name vont suivre une logique très proche de ceci : name="nom de la table[ ID de l'enregistrement ][ nom de la colonne ]".

A noter que tu n’as plus besoin du champ pour l’ID du coup, et si tu penses qu’il faut qu’on puisse le modifier, je trouve très dangereux d’en permettre sa modification.

+0 -0

oui, tu as raison, j’ai oublié de faire en sorte que seuls les 3 derniers champs (correction, non-récupérable et commentaires) puissent être modifiés, les 4 premiers sont simplement de l’affichage.

plutôt que S_POST[’patients’] je pense qu’il faut plutôt que je le nome S_POST[’ligne’] car si j’ai bien compris ton raisonnement, je récupère toutes les infos d’un enregistrement dans cette variable $_POST[’ligne’]

+0 -0

J’avais mis patients parce qu’une ligne représente bien un patient, et le pluriel est là pour ne pas oublier que c’est un tableau dessous. Mais tu nommes comme tu veux.

Si jamais tu te demandes pourquoi tu avais de l’italique dans ton message, sache que c’est à cause des $ si courants en PHP. Quand tu donnes de petits morceaux de code (et surtout dès qu’il y a $ dedans), entoure-les d’accents graves `. Pour ton message ci-dessus, ça donne `$_POST['patients']` au lieu de directement $_POST['patients'].

+0 -0

Salut Ymox,

merci++++

çà marche nickel !!!

je vais étudier en détail ta technique

j’ai corrigé également en empêchant la saisie dans les 6 premières colonnes ;

ci-dessous le code final

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
<?php
// On démarre la session AVANT d'écrire du code HTML
session_start();

?>


<!DOCTYPE html>

<html>

    <head>

        <meta charset="utf-8" />
        <link rel="stylesheet" href="style.css" />
        <title>Mereva</title>

    </head>

    <body>

        <!--début du bloc page-->
        <div id="page">

            <!-- En-tête -->
            <div class="element_page"> 
                <?php include("entete.php"); ?>
            </div>

            <!-- Le corps --> 
            <div class="element_page">
                <div id="corps">

                    <?php include("menus.php"); ?>
                    <!--Tableau avec le contenu de la table GBD_DAT-->

                    <div id='element_tableau'>
                        <div id="tableau">

                            <?php

                            //*******************************************************************
                            //affichage page par page tutoriel Ymox sur le site Zeste de Savoir
                            //https://zestedesavoir.com/tutoriels/351/paginer-avec-php-et-mysql/

                            //*******************************************************************


                            //*Connexion à la base de données
                            //*OpenCLassroom "Concevez votre site web avec php et MySql"  
                            try
                            {
                            // On se connecte à MySQL
                            $bdd = new PDO('mysql:host=localhost;dbname=dms;charset=utf8', 'root', '', array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
                            }
                            catch(Exception $e)
                            {
                            // En cas d'erreur, on affiche un message et on arrête tout
                            die('Erreur : '.$e->getMessage());
                            }

                            $limite = 10;
                            $page = (!empty($_GET['page']) ? $_GET['page'] : 1);
                            $debut = ($page - 1) * $limite;


                            // Partie "Requête"
                            /* On calcule donc le numéro du premier enregistrement ; SQL_CALC_FOUND_ROWS compte le nombre d'enregistrements*/
                            /*sans tenir compte du critère limit*/
                            $sql = 'SELECT SQL_CALC_FOUND_ROWS * FROM `gbd_dat1` LIMIT :limite OFFSET :debut';
                            $query = ($sql);
                            /* On prépare la requête à son exécution. Les marqueurs seront identifiés */
                            $query = $bdd->prepare($query);
                            /* On lie ici une valeur à la requête, soit remplacer de manière sûre un marqueur par sa valeur, nécessaire pour que la requête fonctionne. */
                            $query->bindValue(
                            'limite',         // Le marqueur est nommé « limite »
                            $limite,         // Il doit prendre la valeur de la variable $limite
                            PDO::PARAM_INT   // Cette valeur est de type entier
                            );
                            $query->bindValue(
                            'debut',         // Le marqueur est nommé « début »
                            $debut,         // Il doit prendre la valeur de la variable $debut
                            PDO::PARAM_INT   // Cette valeur est de type entier
                            );

                            /* Maintenant qu'on a lié la valeur à la requête, on peut l'exécuter pour en récupérer le résultat */
                            $resultSet = $query->execute();

                            /* Ici on récupère le nombre d'éléments total. Comme c'est une requête, il ne
                            * faut pas oublier qu'on ne récupère pas directement le nombre.
                            * De plus, comme la requête ne contient aucune donnée client pour fonctionner,
                            * on peut l'exécuter ainsi directement */
                            $resultFoundRows = $bdd->query('SELECT found_rows()');
                            /* On doit extraire le nombre du jeu de résultat */
                            $nombredElementsTotal = $resultFoundRows->fetchColumn();

                            // début du tableau
                            echo '<table>'."\n";
                            // première ligne on affiche les titres prénom et surnom dans 2 colonnes
                            echo '<tr class="class01">';
                            echo '<td class="ID">#ID</td>';
                            echo '<td class="Patient">Patient</td>';
                            echo '<td class="Fiche">Fiche</td>';
                            echo '<td class="Question">Question</td>';
                            echo '<td class="Description">Description</td>';
                            echo '<td class="Details">Details</td>';
                            echo '<td class="Correction">Corrections</td>';
                            echo '<td class="NR">NR</td>';
                            echo '<td class="Commentaires">Commentaires</td>';
                            echo '</tr>';
                            echo '</table>'."\n";
                            // Partie "Boucle"
                            // lecture et affichage des résultats sur 2 colonnes, 1 résultat par ligne.
                            ?><form id="insertion" name="insertion" action="dms_modification3.php" method="POST">    
                            <?php
                            while($element= $query -> fetch()) 
                            {
                                ?>

                                <input type="hidden" name="limite" value="<?php echo($limite) ;?>">
                                <input type="hidden" name="lignes[<?php echo $element['id']; ?>][id]" value="<?php echo $element['id'] ;?>">
                                <input type="hidden" name="lignes[<?php echo $element['id']; ?>][pat]" value="<?php echo $element['pat'] ;?>">
                                <input type="hidden" name="lignes[<?php echo $element['id']; ?>][fic]" value="<?php echo $element['fic'] ;?>">
                                <input type="hidden" name="lignes[<?php echo $element['id']; ?>][que]" value="<?php echo $element['que'] ;?>">
                                <input type="hidden" name="lignes[<?php echo $element['id']; ?>][des]" value="<?php echo $element['des'] ;?>">
                                <input type="hidden" name="lignes[<?php echo $element['id']; ?>][det]" value="<?php echo $element['det'] ;?>">
                                  <table>
                                    <tr class="class02">

                                    <td class="ID"><?php echo $element['id'] ;?></td>
                                    <td class="Patient"><?php echo $element['pat'] ;?></td>
                                    <td class="Fiche"><?php echo $element['fic'] ;?></td>
                                    <td class="Question"><?php echo $element['que'] ;?></td>
                                    <td class="Description"><?php echo $element['des'] ;?></td>
                                    <td class="Details"><?php echo $element['det'] ;?></td>
                                    <td class="Corrections"><input class="cor" type="text" name="lignes[<?php echo $element['id']; ?>][cor]" value="<?php echo $element['cor'] ;?>"></td>
                                    <td class="NR"><input class="non_rec" type="checkbox" name="lignes[<?php echo $element['id']; ?>][non_rec]"<?php if($element['non_rec'] == 1) echo ' checked="checked"'; ?> /></td>
                                    <td class="Commentaires"><input class="com" type="text" name="lignes[<?php echo $element['id']; ?>][com]" value="<?php echo $element['cor'] ;?>"></td>
                                    </tr>
                                    </table>
                                <?php
                            }//fin while 
                        ?>

                                    <div>
                                    <input class="modifier" type="submit" value="Modifier">
                                    </div>

                                </form>

                        <!--fin du bloc tableau-->  
                        </div>



                    <!--fin du bloc element_tableau-->
                    </div>

                        <?php
                        $query->closeCursor();
                        ?>
                <!--fin du bloc corps-->
                </div>

            <!--fin du bloc element_page correspondant au CORPS-->
            </div>

            <div class="element_page">
                <!--// Partie "Filtres"-->
                <div id='filtres'>
                    <form action="demande_de_corrections_page_filtres.php" method="get">
                    <select onselect="this.form.submit()" name="patient" id="patient">
                    <?php
                    $sql="SELECT DISTINCT pat, fic FROM gbd_dat1 ORDER BY pat";
                    $result = $bdd->query($sql); 
                    while ($donnees = $result->fetch(PDO::FETCH_ASSOC))
                    {
                    ?>
                    <option value="<?php echo $element['pat'];?>"><?php echo $donnees['pat'];?></option>
                    <?php
                    }
                    ?>
                    </select>
                    <select onselect="this.form.submit()" name="fiche" id="fiche">
                    <?php
                    $sql="SELECT DISTINCT pat, fic FROM gbd_dat1 ORDER BY pat";
                    $result = $bdd->query($sql);
                    while ($donnees = $result->fetch(PDO::FETCH_ASSOC))
                    {
                    ?>
                    <option value="<?php echo $donnees['fic'];?>"><?php echo $donnees['fic'];?></option>
                    <?php
                    }
                    ?>
                    </select>
                    <input class="valider" type="submit" value="Valider" />                             
                    </form> 
                </div>

                 <!--// Partie "Liens"-->

                <div id='liens'>

                    <?php
                    /* On calcule le nombre de pages */
                    $nombreDePages = ceil($nombredElementsTotal / $limite);



                    /* Si on est sur la première page, on n'a pas besoin d'afficher de lien
                    * vers la précédente. On va donc l'afficher que si on est sur une autre
                    * page que la première */
                    if ($page > 1):
                    ?><a href="?page=<?php echo $page - 1; ?>">Précédente</a> - <?php
                    endif;

                    /* On va effectuer une boucle autant de fois que l'on a de pages */
                    for ($i = 1; $i <= $nombreDePages; $i++):
                    ?><a href="?page=<?php echo $i; ?>"><?php echo $i; ?></a> <?php
                    endfor;

                    /* Avec le nombre total de pages, on peut aussi masquer le lien
                    * vers la page suivante quand on est sur la dernière */
                    if ($page < $nombreDePages):
                    ?>- <a href="?page=<?php echo $page + 1; ?>">Suivante</a><?php
                    endif;
                    ?>         
                </div> 
            </div>

            <!-- Le pied de page -->
            <div class="element_page"> 
            <div id="pied_de_page"/>
            <?php include("pied_de_page.php"); ?>
            </div>
            </div> 

        <!--fin du bloc page-->
        </div>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
    <!-- jQuery est inclus ! -->
   <script>

        jQuery(document).ready(function(){
        // Du code en jQuery va pouvoir être tapé ici !
        console.log("jQuery est prêt !");
        });




   </script>
    </body>

</html>

`
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
<?php
//connection au serveur
try
{
// On se connecte à MySQL
$bdd = new PDO('mysql:host=localhost;dbname=dms;charset=utf8', 'root', '', array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
}
catch(Exception $e)
{
// En cas d'erreur, on affiche un message et on arrête tout
die('Erreur : '.$e->getMessage());
}

//$nb = count($_POST['id']);
$limite = $_POST['limite'];
//var_dump($_POST['non_rec']);
//préparation de la requête
$requete = "UPDATE gbd_dat1 SET 
        pat = :patient,
        fic = :fiche,
        que = :question,
        des = :description,
        det = :details,
        cor = :correction,
        non_rec = :nonrecuperable,
        com = :commentaires
        WHERE id = :id ";

/* On prépare la requête à son exécution. Les marqueurs seront identifiés */
$result = $bdd->prepare($requete);

//print_r($bdd->errorInfo());
$result->bindParam('id',$id,PDO::PARAM_INT);
$result->bindParam('patient',$patient,PDO::PARAM_STR);
$result->bindParam('fiche',$fiche,PDO::PARAM_STR);
$result->bindParam('question',$question,PDO::PARAM_STR);
$result->bindParam('description',$description,PDO::PARAM_STR);
$result->bindParam('details',$details,PDO::PARAM_STR);
$result->bindParam('correction',$correction,PDO::PARAM_STR);
$result->bindParam('nonrecuperable',$nonrecuperable,PDO::PARAM_INT);
$result->bindParam('commentaires',$commentaires,PDO::PARAM_STR);

for($i=0;$i<$limite;$i++)
   {
        foreach($_POST['lignes'] as $id => $donneesLigne)
        {
            $patient=$donneesLigne['pat'];
            $fiche=$donneesLigne['fic'];
            $question=$donneesLigne['que'];
            $description=$donneesLigne['des'];
            $details=isset($donneesLigne['det']) ? $donneesLigne['det'] : '';
            $correction=$donneesLigne['cor'];
            $nonrecuperable=isset($donneesLigne['non_rec']) ? 1 : 0;
            $commentaires=$donneesLigne['com'];
            $id=$donneesLigne['id'];
            $result->execute();
        }
    }

//affichage des résultats, pour savoir si la modification a marchée:
if($requete)
{
    echo("La modification à été correctement effectuée") ;
}
else
{
    echo("La modification à échouée") ;
}
?>

`

Salut Ymox,

j’ai étudié un peu ton code et j’essaie de l’adapter à nouveau je fais une requête sur une première table crf_pin_not et je veux enregistrer le résultat de cette requête dans une table test je n’ai pas de bugg mais je n’ai rien qui s’inscrit dans ma table test

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
<?php
        //*Connexion à la base de données
        try
        {
        // On se connecte à MySQL
        $bdd = new PDO('mysql:host=localhost;dbname=dms;charset=utf8', 'root', '', array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
        }
        catch(Exception $e)
        {
        // En cas d'erreur, on affiche un message et on arrête tout
        die('Erreur : '.$e->getMessage());
        }



        // Partie "Requête"
        $sql = 'SELECT * FROM `CRF_PIN_NOT` WHERE PIN_NOT_DAT="" ';
        $query = ($sql);
        /* On prépare la requête à son exécution. Les marqueurs seront identifiés */
        $query = $bdd->prepare($query);
        /* On lie ici une valeur à la requête, soit remplacer de manière sûre un marqueur par sa valeur, nécessaire pour que la requête fonctionne. */
        //$query->bindValue('limite',$limite,PDO::PARAM_INT);
        $result = $query->execute();
?>
        <form name="update" action="data_recherche2.php" method="POST">
<?php
        while($element= $query -> fetch()) 
        {
?>
        <input class="cor" type="text" name="lignes[<?php echo $element['PIN_NOT_CLE']; ?>][PIN_NOT_CLE]" value="<?php echo $element['PIN_NOT_CLE'] ;?>">
        <input class="cor" type="text" name="lignes[<?php echo $element['PIN_NOT_CLE']; ?>][PAT]" value="<?php echo $element['PAT'] ;?>">
<?php

        }
?>
        <input class="modifier" type="submit" value="Modifier">
        </form>
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
<?php
//connection au serveur
try
{
// On se connecte à MySQL
$bdd = new PDO('mysql:host=localhost;dbname=dms;charset=utf8', 'root', '', array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
}
catch(Exception $e)
{
// En cas d'erreur, on affiche un message et on arrête tout
die('Erreur : '.$e->getMessage());
}

var_dump($_POST['lignes']);
//préparation de la requête
$requete = "INSERT INTO test (id, pat) VALUES (id = :id, pat = :patient)" ;

/* On prépare la requête à son exécution. Les marqueurs seront identifiés */
$result = $bdd->prepare($requete);

//print_r($bdd->errorInfo());
//$result->bindParam('id',$id,PDO::PARAM_STR);
$result->bindParam('id',$id,PDO::PARAM_STR);
$result->bindParam('patient',$patient,PDO::PARAM_STR);

foreach($_POST['lignes'] as $id => $donneesLigne)
{
$patient=$donneesLigne['PAT'];
$id=$donneesLigne['PIN_NOT_CLE'];
$result->execute();

}


//affichage des résultats, pour savoir si la modification a marchée:
if($requete)
{
    echo("La modification à été correctement effectuée") ;
}
else
{
    echo("La modification à échouée") ;
}
?>

`

bonsoir

je pense que j’ai l’affichage des erreurs mais là çà ne m’affichait pas d’erreur…

je cherche maintenant à automatiser des requêtes de recherche de manquant sur une base de données comportant plusieurs tables (pour essayer de mettre en place mon algo, je me suis limité à une table2 toute simple dans laquelle j’ai des données manquantes)

j’ai une table1 qui me servira de paramétrage de la requête de recherche de manquants=requête 2

je boucle donc sur la table1 pour récupérer les paramètres à utiliser dans la requête 2

je boucle ensuite sur cette requête 2 pour faire des INSERT INTO des résultats de cette requête 2 dans une table 3

je sais pas si mon algo est clair ni même si c’est le plus logique (j’en suis qu’au début) mais il fonctionne presque sauf que seule la première boucle de la requête 2 est insérée dans ma table ; je me suis appuyé sur le code que Ymox m’a fournit plus haut

n’hésitez pas à me dire si vous pensez qu’il y a plus simple (je suis sûr que oui)

mais surtout où est mon erreur car quand je fais un var_dump($element) avant envoi en POST j’ai bien tous les données que je souhaite insérer dans la table3 mais je ne "reçois" que 3 enregistrements d’envoyés (une boucle)

une idée ?

data_recherche1.php

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
<?php
        //*Connexion à la base de données
        try
        {
        // On se connecte à MySQL
        $bdd = new PDO('mysql:host=localhost;dbname=dms;charset=utf8', 'root', '', array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
        }
        catch(Exception $e)
        {
        // En cas d'erreur, on affiche un message et on arrête tout
        die('Erreur : '.$e->getMessage());
        }

        //requete 1 : récupération dans la table1 des paramétres à utiliser dans la requete 2
        $sql =  'SELECT tbl, var FROM table1 ORDER BY tbl';
            foreach($bdd->query($sql) as $row) 
            {
                //var_dump($row);
                $table = $row['tbl'];
                $variable = $row['var'];
                //$critere = $row['critere'];

                //requete 2 : recherche de donnees manquantes dans la table2
                $sql = 'SELECT * FROM ' . $table . ' WHERE ' . $variable . '= "" ';
                $query = ($sql);
                /* On prépare la requête à son exécution. Les marqueurs seront identifiés */
                $query = $bdd->prepare($query);
                $result = $query->execute();


?>

        <form name="update" action="data_recherche2.php" method="POST">
<?php
        //envoie des donnees à insérer dans la table3
        while($element= $query -> fetch()) 
        {
            //var_dump($element);
            //var_dump($variable);
?>
        <!--les 2 premiers champs à afficher seront toujours en position [0] (id des enregistrements de la table 2) et [1] (identification du patient)-->
        <input class="cor" type="text" name="lignes[<?php echo $element[0]; ?>][0]" value="<?php echo $element[0] ;?>"></br>
        <input class="cor" type="text" name="lignes[<?php echo $element[0]; ?>][1]" value="<?php echo $element[1] ;?>"></br>
        <input class="cor" type="text" name="lignes[<?php echo $element[0]; ?>][var]" value="<?php echo $variable ;?>"></br>
<?php
        }
    }
?>
        <input class="modifier" type="submit" value="Modifier">
        </form>

data_recherche2.php

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
<?php
//connection au serveur
try
{
// On se connecte à MySQL
$bdd = new PDO('mysql:host=localhost;dbname=dms;charset=utf8', 'root', '', array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
}
catch(Exception $e)
{
// En cas d'erreur, on affiche un message et on arrête tout
die('Erreur : '.$e->getMessage());
}

var_dump($_POST['lignes']);
//préparation de la requête
$requete = "INSERT INTO table3 (pat, var) VALUES (:patient, :variable)" ;

/* On prépare la requête à son exécution. Les marqueurs seront identifiés */
$result = $bdd->prepare($requete);
//$id = null;
//$patient= null;

$result->bindParam('patient',$patient,PDO::PARAM_STR);
$result->bindParam('variable',$variable,PDO::PARAM_STR);


foreach($_POST['lignes'] as $key => $donneesLigne)
{
//$id=$donneesLigne['PIN_NOT_CLE'];
$patient=$donneesLigne[1];
$variable=$donneesLigne['var'];
$result->execute();
}



//affichage des résultats, pour savoir si la modification a marchée:
if($requete)
{
    echo("La modification à été correctement effectuée") ;
}
else
{
    echo("La modification à échouée") ;
}
?>

`

je pense que j’ai l’affichage des erreurs mais là çà ne m’affichait pas d’erreur…

LE CARROU

Tu as bien paramétré PDO, mais très probablement pas PHP, sans quoi tu aurais su qu’il y avait une erreur de syntaxe dans ta requête. Ce n’est pas PDO toute seule, c’est PHP tout seul ou PHP et PDO  ;)

A noter que tu testes $requete qui contient une chaîne de caractères non vide et ne commençant pas par un nombre, donc tu tomberas toujours dans le premier cas de ton if (le test passera toujours). Il te faudrait tester ce que retourne $result->execute().

Après, j’ai un peu de peine à comprendre ce que tu souhaites faire. En ce qui me concerne, je te conseille d’utiliser les vrais noms de tables (pour autant qu’ils soient parlants pour tout le monde, sinon adapte-les au moins pour l’explication ici) et les vrais noms de colonnes, ça me permet de mieux saisir le contexte que quelque chose d’abstrait avec des numéros et noms génériques.

Note qu’il y a quelque chose qui me fait un peu peur dans ce que tu nous montres : tu sembles avoir des informations sur la structure de la base de données (noms de tables et de colonnes aussi ?) dans une table… En général, je me méfie d’un souci de modélisation dans ce genre de cas.

Tu peux nous montrer le HTML résultant de l’exécution de data_recherche1.php ?

+0 -0

Bonjour Ymox,

j’ai suivi scrupuleusement les consignes du tuto PHP (ici) ; je viens à nouveau de vérifier et les paramètres me semblent bons ?

je vais essayer d’expliquer plus clairement ce que je souhaite faire et pourquoi j’ai des noms de table/colonne dans une table de paramétrage

dans une étude, nous allons avoir une base de données avec plusieurs tables=tables de l’étude nous avons par ailleurs plusieurs études avec une base étude à chaque fois dont la structure sera assez similaire mais les noms de tables/colonnes peuvent légèrement varier

je souhaite "analyser" le contenu des bases pour rechercher les données manquantes et c’est cette étape que je souhaite automatiser c’est pourquoi j’ai une table de paramétrage qui est en gros le dictionnaire de données de ma base (liste des tables et des variables) à partir de laquelle je pourrai "boucler" pour lancer toutes les requêtes de recherche de manquants (en sélectionnant les variables sur lesquelles je souhaite faire une recherche, qui peut varier d’une étude à l’autre) ensuite, je veux enregistrer le résultat de ces requêtes dans un 3ème type de table=table de monitorage ; je pourrai alors éditer des listing de données manquantes à partir de cette table de monitorage. Les utilisateurs devront alors vérifier les données et saisir le résultats de leur vérification dans l’outil en utilisant l’interface ci-dessous.

j’ai déjà un outil au format access qui est conçu sur ce principe et je souhaite le développer sous forme d’une application web ; j’espère que c’est plus clair désormais ? quel est le problème d’avoir les noms de tables/colonnes dans une tables de l’application ? comment faire sinon ?

outil

Le problème d’avoir la structure de la base de données dans celle-ci implique une complexification notable et la multiplication des requêtes, donc des performances moindres. Mais comme je l’ai dit, ce n’est pas totalement à proscrire. Dans ton cas, je ne vois pas trop comment faire d’autre du coup.

Quand j’ai demandé le résultat HTML, c’est le code source HTML résultant de l’appel du script que je voulais voir, pas sa version interprétée par un navigateur  ;)

+0 -0
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
        <form name="update" action="data_recherche2.php" method="POST">
        <!--les 2 premiers champs à afficher seront toujours en position [0] (id des enregistrements de la table 2) et [1] (identification du patient)-->
        <input type="text" name="lignes[1][0]" value="1"></br>
        <input type="text" name="lignes[1][1]" value="CINT001"></br>
        <input type="text" name="lignes[1][var]" value="PIN_NOT_S_4_DAT"></br>
        <!--les 2 premiers champs à afficher seront toujours en position [0] (id des enregistrements de la table 2) et [1] (identification du patient)-->
        <input type="text" name="lignes[2][0]" value="2"></br>
        <input type="text" name="lignes[2][1]" value="CINT002"></br>
        <input type="text" name="lignes[2][var]" value="PIN_NOT_S_4_DAT"></br>
        <!--les 2 premiers champs à afficher seront toujours en position [0] (id des enregistrements de la table 2) et [1] (identification du patient)-->
        <input type="text" name="lignes[3][0]" value="3"></br>
        <input type="text" name="lignes[3][1]" value="CINT003"></br>
        <input type="text" name="lignes[3][var]" value="PIN_NOT_S_4_DAT"></br>

        <form name="update" action="data_recherche2.php" method="POST">
        <!--les 2 premiers champs à afficher seront toujours en position [0] (id des enregistrements de la table 2) et [1] (identification du patient)-->
        <input type="text" name="lignes[1][0]" value="1"></br>
        <input type="text" name="lignes[1][1]" value="CINT001"></br>
        <input type="text" name="lignes[1][var]" value="PIN_NOT_DAT"></br>
        <!--les 2 premiers champs à afficher seront toujours en position [0] (id des enregistrements de la table 2) et [1] (identification du patient)-->
        <input type="text" name="lignes[2][0]" value="2"></br>
        <input type="text" name="lignes[2][1]" value="CINT002"></br>
        <input type="text" name="lignes[2][var]" value="PIN_NOT_DAT"></br>
        <input class="modifier" type="submit" value="Modifier">
        </form>

C’est normal pour toi que tu aies deux <form> et un seul </form> ?
Dans data_recherche1.php, il faut enlever la ligne 33 pour la mettre entre les 14 et 16.

Manifestement tu vas avoir des écrasements de valeurs. Sur les "deux" formulaires de ton code HTML, il y a deux groupes de trois lignes[1] et lignes[2], donc potentiellement plus, mais certainement des soucis. Les valeurs d’un groupe vont écraser celle du précédent.

Si ton but est d’insérer telles-quelles les lignes ainsi affichées, il te faut un compteur qui soit déclaré là où tu commences ton formulaire, avant la première boucle, et qui soit incrémenté à la fin de la deuxième, et qui remplace $element[0] dans la construction de name.

+0 -0

Salut Ymox,

ta technique fonctionne parfaitement

cependant, même si je comprends un peu mieux maintenant, il y a quelque chose que je ne comprends pas sur l’array qui est envoyé (ci-dessous)

pourquoi, sur la deuxième boucle les identifiants de l’array sont ’CINT001’ et ’CINT002’ et pas la suite de l’array à savoir 4 => et 5 => ? j’ai un peu de mal avec les array et je m’excuse par avance si ma question est stupide…

Image utilisateur
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
<?php
        //*Connexion à la base de données
        try
        {
        // On se connecte à MySQL
        $bdd = new PDO('mysql:host=localhost;dbname=dms;charset=utf8', 'root', '', array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
        }
        catch(Exception $e)
        {
        // En cas d'erreur, on affiche un message et on arrête tout
        die('Erreur : '.$e->getMessage());
        }

        //requete 1 : récupération dans la table1 des paramétres à utiliser dans la requete 2
        ?>
        <form name="update" action="data_recherche2.php" method="POST">

        <?php 
        $i = 0; 
            $sql =  'SELECT tbl, var FROM table1 ORDER BY tbl';
            foreach($bdd->query($sql) as $row) 
            {
                //var_dump($row);
                $table = $row['tbl'];
                $variable = $row['var'];
                //$critere = $row['critere'];

                //requete 2 : recherche de donnees manquantes dans la table2
                $sql = 'SELECT * FROM ' . $table . ' WHERE ' . $variable . '= "" ';
                $query = ($sql);
                /* On prépare la requête à son exécution. Les marqueurs seront identifiés */
                $query = $bdd->prepare($query);
                $result = $query->execute();

        //envoie des donnees à insérer dans la table3
        while($element= $query -> fetch()) 
        {
            //var_dump($element);
            //var_dump($variable);
?>
        <!--les 2 premiers champs à afficher seront toujours en position [0] (id des enregistrements de la table 2) et [1] (identification du patient)-->
        <input type="text" name="lignes[<?php echo $element[$i]; ?>][0]" value="<?php echo $element[0] ;?>"></br>
        <input type="text" name="lignes[<?php echo $element[$i]; ?>][1]" value="<?php echo $element[1] ;?>"></br>
        <input type="text" name="lignes[<?php echo $element[$i]; ?>][var]" value="<?php echo $variable ;?>"></br>
<?php
        }
        $i=$i+1;
        }
?>
        <input class="modifier" type="submit" value="Modifier">
        </form>
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
<?php
//connection au serveur
try
{
// On se connecte à MySQL
$bdd = new PDO('mysql:host=localhost;dbname=dms;charset=utf8', 'root', '', array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
}
catch(Exception $e)
{
// En cas d'erreur, on affiche un message et on arrête tout
die('Erreur : '.$e->getMessage());
}

var_dump($_POST['lignes']);
//préparation de la requête
$requete = "INSERT INTO table3 (pat, var) VALUES (:patient, :variable)" ;

/* On prépare la requête à son exécution. Les marqueurs seront identifiés */
$result = $bdd->prepare($requete);
//$id = null;
//$patient= null;

$result->bindParam('patient',$patient,PDO::PARAM_STR);
$result->bindParam('variable',$variable,PDO::PARAM_STR);


foreach($_POST['lignes'] as $key => $donneesLigne)
{
//$id=$donneesLigne['PIN_NOT_CLE'];
$patient=$donneesLigne[1];
$variable=$donneesLigne['var'];
$result->execute();
//var_dump($result);
}
//var_dump($result);


//affichage des résultats, pour savoir si la modification a marchée:
if($requete)
{
    echo("La modification à été correctement effectuée") ;
}
else
{
    echo("La modification à échouée") ;
}
?>

`

Non, toujours pas (enfin, avec le HTML interprété, c’est pas sûr, mais je ne pense pas que ce soit bon).

Remplace tout $element[0] par $i dans la création de name. Donc au lieu d’avoir name="lignes[<?php echo $element[$i]; ?>][…]", tu mets name="lignes[<?php echo $i; ?>][…]".

Encore une chose que je trouve étrange, c’est que tu incrémentes $i en dehors de la seconde boucle. Je ne pense pas que ce soit vraiment ce que tu souhaites.

+0 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte