Problème d'enregistrement dans ma base

Tuto créer son forum de toutes pièces

a marqué ce sujet comme résolu.

Bonjour,

Je travaille actuellement sur le tuto d’OC ’Créer son forum de toutes pièces’ et j’ai un problème avec une requête préparée (ligne 200). Mes données ne s’enregistrent pas en base. J’ai testé avec une requête simple et les données s’enregistrent en base normalement. J’ai vérifié le chemin de ma base, le nom de la table, de mes variables, que les variables étaient bien remplies, etc… et là je n’ai plus d’idées

quelqu’un peut m’aider ? d’avance merci

  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
<?php

session_start();

$titre="Enregistrement";
include("includes/identifiants.php");
//J LE CARROU - 11/11/2017 - Désactivation de la page menu.php
include("includes/debut.php");
//include("includes/menu.php");
//echo '<p><i>Vous êtes ici</i> : <a href="./index.php">Index du forum</a> --> Enregistrement';

if ($id!=0) erreur(ERR_IS_CO);

?>


<?php

if (empty($_POST['pseudo'])) // Si on la variable est vide, on peut considérer qu'on est sur la page de formulaire

{
    //J LE CARROU - 11/11/2107 - désactivation
    //echo '<h1>Inscription 1/2</h1>';
    //J LE CARROU - 11/11/2107 - Ajout d'un div

    echo '
    <div id="enregistrement">
    <form method="post" action="register.php" enctype="multipart/form-data">

        <fieldset><legend>Identifiants</legend>
            <label for="pseudo">* Pseudo :</label>  <input name="pseudo" type="text" id="pseudo" /> (le pseudo doit contenir entre 3 et 15 caractères)<br />
            <label for="password">* Mot de Passe :</label><input type="password" name="password" id="password" /><br />
            <label for="confirm">* Confirmer le mot de passe :</label><input type="password" name="confirm" id="confirm" />
        </fieldset>

        <fieldset><legend>Contacts</legend>
            <label for="email">* Votre adresse Mail :</label><input type="text" name="email" id="email" /><br />

            <!--<label for="msn">Votre adresse MSN :</label><input type="text" name="msn" id="msn" /><br />-->
            <!--<label for="website">Votre site web :</label><input type="text" name="website" id="website" />-->
        </fieldset>

        <!--J LE CARROU - 11/11/2017 - désactivation champs inutiles-->
        <!--<fieldset><legend>Informations supplémentaires</legend>-->
            <!--<label for="localisation">Localisation :</label><input type="text" name="localisation" id="localisation" />-->
        <!--</fieldset>-->

        <fieldset><legend>Profil sur le forum</legend>
            <label for="avatar">Choisissez votre avatar :</label><input type="file" name="avatar" id="avatar" /> (Taille max : 10Ko)<br/>
            <label for="signature">Signature :</label><textarea cols="40" rows="4" size="6px" style=font-family:"Century Gothic" name="signature" id="signature"></textarea>
        </fieldset>
    <p>Les champs précédés d\'un * sont obligatoires</p>
    <p><input type="submit" value="S\'inscrire" /></p>

    </form>
    </div>
    </div>
    </body>
    </html>';    

} //Fin de la partie formulaire

else //On est dans le cas traitement

{
    $pseudo_erreur1 = NULL;
    $pseudo_erreur2 = NULL;
    $mdp_erreur = NULL;
    $email_erreur1 = NULL;
    $email_erreur2 = NULL;
    $msn_erreur = NULL;
    $signature_erreur = NULL;
    $avatar_erreur = NULL;
    $avatar_erreur1 = NULL;
    $avatar_erreur2 = NULL;
    $avatar_erreur3 = NULL;
?>

<?php

    //On récupère les variables
    $i = 0;
    $temps = time(); 
    $pseudo=$_POST['pseudo'];
    $signature = $_POST['signature'];
    $email = $_POST['email'];
    //$msn = $_POST['msn'];
    //$website = $_POST['website'];
    //$localisation = $_POST['localisation'];
    $pass = md5($_POST['password']);
    $confirm = md5($_POST['confirm']);

    //Vérification du pseudo
    $query=$db->prepare('SELECT COUNT(*) AS nbr FROM forum_membres WHERE membre_pseudo =:pseudo');
    $query->bindValue(':pseudo',$pseudo, PDO::PARAM_STR);
    $query->execute();
    $pseudo_free=($query->fetchColumn()==0)?1:0;
    $query->CloseCursor();
    if(!$pseudo_free)
    {
        $pseudo_erreur1 = "Votre pseudo est déjà utilisé par un membre";
        $i++;
    }
    if (strlen($pseudo) < 3 || strlen($pseudo) > 15)
    {
        $pseudo_erreur2 = "Votre pseudo est soit trop grand, soit trop petit";
        $i++;
    }
    //Vérification du mdp
    if ($pass != $confirm || empty($confirm) || empty($pass))
    {
        $mdp_erreur = "Votre mot de passe et votre confirmation diffèrent, ou sont vides";
        $i++;
    }
?>

<?php
    //Vérification de l'adresse email

    //Il faut que l'adresse email n'ait jamais été utilisée
    $query=$db->prepare('SELECT COUNT(*) AS nbr FROM forum_membres WHERE membre_email =:mail');
    $query->bindValue(':mail',$email, PDO::PARAM_STR);
    $query->execute();
    $mail_free=($query->fetchColumn()==0)?1:0;
    $query->CloseCursor();

    if(!$mail_free)
    {
        $email_erreur1 = "Votre adresse email est déjà utilisée par un membre";
        $i++;
    }
    //On vérifie la forme maintenant
    if (!preg_match("#^[a-zA-Z0-9._-]+@[a-zA-Z0-9._-]{2,}\.[a-z]{2,4}$#", $email) || empty($email))
    {
        $email_erreur2 = "Votre adresse E-Mail n'a pas un format valide";
        $i++;
    }
    //Vérification de l'adresse MSN
    //if (!preg_match("#^[a-zA-Z0-9._-]+@[a-zA-Z0-9._-]{2,}\.[a-z]{2,4}$#", $msn) && !empty($msn))
    //{
    //    $msn_erreur = "Votre adresse MSN n'a pas un format valide";
    //    $i++;
    //}
    //Vérification de la signature
    if (strlen($signature) > 200)
    {
        $signature_erreur = "Votre signature est trop longue";
        $i++;
    }
?>

<?php
    //Vérification de l'avatar :
    if (!empty($_FILES['avatar']['size']))
    {
        //On définit les variables :
        $maxsize = 10024; //Poid de l'image
        $maxwidth = 100; //Largeur de l'image
        $maxheight = 100; //Longueur de l'image
        $extensions_valides = array( 'jpg' , 'jpeg' , 'gif' , 'png', 'bmp' ); //Liste des extensions valides

        if ($_FILES['avatar']['error'] > 0)
        {
                $avatar_erreur = "Erreur lors du transfert de l'avatar : ";
        }
        if ($_FILES['avatar']['size'] > $maxsize)
        {
                $i++;
                $avatar_erreur1 = "Le fichier est trop gros : (<strong>".$_FILES['avatar']['size']." Octets</strong>    contre <strong>".$maxsize." Octets</strong>)";
        }

        $image_sizes = getimagesize($_FILES['avatar']['tmp_name']);
        if ($image_sizes[0] > $maxwidth OR $image_sizes[1] > $maxheight)
        {
                $i++;
                $avatar_erreur2 = "Image trop large ou trop longue : 
                (<strong>".$image_sizes[0]."x".$image_sizes[1]."</strong> contre <strong>".$maxwidth."x".$maxheight."</strong>)";
        }

        $extension_upload = strtolower(substr(  strrchr($_FILES['avatar']['name'], '.')  ,1));
        if (!in_array($extension_upload,$extensions_valides) )
        {
                $i++;
                $avatar_erreur3 = "Extension de l'avatar incorrecte";
        }
    }
?>

<?php
   if ($i==0)
   {
    echo'<h1>Inscription terminée</h1>';
    echo'<p>Bienvenue '.stripslashes(htmlspecialchars($_POST['pseudo'])).' vous êtes maintenant inscrit sur le forum</p>
    <p>Cliquez <a href="./index.php">ici</a> pour revenir à la page d accueil</p>';

        //La ligne suivante sera commentée plus bas
        $nomavatar=(!empty($_FILES['avatar']['size']))?move_avatar($_FILES['avatar']):''; 
        //J LE CARROU - 11/11/2017 - modification requête car je n'ai pas intégré certains champs du formulaire d'inscription
        //j'ai également supprimé les champs de la table forum_membres
        $query=$db->prepare('INSERT INTO forum_membres (membre_pseudo, 
        membre_mdp, 
        membre_email,             
        membre_avatar,
        membre_signature, 
        membre_inscrit,   
        membre_derniere_visite)
        VALUES (:pseudo, 
        :pass, 
        :email, 
        :nomavatar, 
        :signature, 
        :temps, 
        :temps)');
    $query->bindValue('pseudo', $pseudo, PDO::PARAM_STR);
    $query->bindValue('pass', $pass, PDO::PARAM_STR); //modification INT en STR
    $query->bindValue('email', $email, PDO::PARAM_STR);
       //$query->bindValue(':msn', $msn, PDO::PARAM_STR);
       //$query->bindValue(':website', $website, PDO::PARAM_STR);
    $query->bindValue('nomavatar', $nomavatar, PDO::PARAM_STR);
    $query->bindValue('signature', $signature, PDO::PARAM_STR);
       //$query->bindValue(':localisation', $localisation, PDO::PARAM_STR);
    $query->bindValue('temps', $temps, PDO::PARAM_INT);
    $query->execute();
    //print_r($query);

    //Et on définit les variables de sessions
        $_SESSION['pseudo'] = $pseudo;
        $_SESSION['id'] = $db->lastInsertId(); ;
        $_SESSION['level'] = 2;
        $query->CloseCursor();
    }
    else
    {
        echo'<h1>Inscription interrompue</h1>';
        echo'<p>Une ou plusieurs erreurs se sont produites pendant l incription</p>';
        echo'<p>'.$i.' erreur(s)</p>';
        echo'<p>'.$pseudo_erreur1.'</p>';
        echo'<p>'.$pseudo_erreur2.'</p>';
        echo'<p>'.$mdp_erreur.'</p>';
        echo'<p>'.$email_erreur1.'</p>';
        echo'<p>'.$email_erreur2.'</p>';
        echo'<p>'.$msn_erreur.'</p>';
        echo'<p>'.$signature_erreur.'</p>';
        echo'<p>'.$avatar_erreur.'</p>';
        echo'<p>'.$avatar_erreur1.'</p>';
        echo'<p>'.$avatar_erreur2.'</p>';
        echo'<p>'.$avatar_erreur3.'</p>';

        echo'<p>Cliquez <a href="./register.php">ici</a> pour recommencer</p>';
    }
}
?>
</div>
</body>
</html>

EDIT

en fait, j’ai trouvé pourquoi çà n’enregistre pas ; j’ai fait un print_r($query->erroInfo()) et j’ai vu que la variable membre_post de la table forum_membres n’admettait pas de valeur par défaut

en corrigeant en table (valeur par défaut = NULL pour la variable membre_post) les données s’enregistrent

je vais voir comment corriger ce bug maintenant

Bonjour

j’ai suivi le tuto de Qwix (ici) et j’ai bien compris le fonctionnement et ce que tu me disais plus haut. J’ai réussi à obtenir le même résultat après l’avoir adapté en PDO (codes ci-dessous).

  1. On affiche les données de la base dans une page modification1.php ; On passe l’id de l’enregistrement à modifier par l’URL et on récupère ensuite l’id par la méthode GET sur la page suivante modification2.php?id. On a donc autant de boutons "modifier" redirigeant vers une page de modification2.php?id que d’enregistrement dans la table.

  2. Les champs du formulaire modification2.php?id sont pré-remplis par une requête sur les données disponibles (value). L’utilisateur peut donc modifier et lorsqu’il clique sur modifier, les données du formulaire sont envoyées par méthode POST à une 3ème page modification3.php qui fait la mise à jour à l’aide d’une requête UPDATE avec un WHERE sur l’id.

Tout çà marche parfaitement même si j’ai bien compris qu’il faut l’optimiser pour la sécurité mais je verrai çà dans un second temps.

Ce que je veux faire maintenant, c’est faire des UPDATE multiples.

J’affiche les données de ma table sous forme de tableau ; Il faut donc que je passe plusieurs id.

Il me semble que la solution serait :

  1. d’utiliser un array sur l’id (ligne 25 modification2.php) puis

  2. parcourir l’array en faisant un while plutôt qu’un if (ligne 34 modification2.php). Mais là j’ai un peu de mal à concevoir le code. Il faut en plus que je "sorte" le bouton "Modifier" de la page modification2.php de la boucle pour que tout soit modifié d’un coup et pas seulement pour chaque enregistrement.

  3. Enfin, dans ma page modification3.php (ligne 36), il faut que je boucle sur l’id pour mettre à jour tous les enregistrements de la page modification2.php.

Mais n’ayant jusqu’à présent jamais utilisé d’array, je n’arrive pas à mettre tout çà en place.

Si quelqu’un peut m’aider (1) à valider mon algo et (2) mettre en place cet algo…

modification1.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
<html>
  <head>
    <title>modification de données en PHP :: partie 1</title>
  </head>
<body>
<?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());
}

//requête SQL:
$sql = "SELECT * FROM gbd_dat ORDER BY pat, fic, que" ;

//exécution de la requête:
$result = $bdd->query($sql); 


//affichage des données:
while ($donnees = $result->fetch(PDO::FETCH_ASSOC))
{
echo(
"<div align=\"center\">"
.$donnees['pat']." ".$donnees['fic']
." <a href=\"modification2.php?idPersonne=".$donnees['id']."\">modifier</a></div>\n"
) ;
}
?>

</body>
</html>

`

modification2.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
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
<html>
  <head>
    <meta charset="utf-8" />
    <link rel="stylesheet" href="style.css" />
    <title>modification de données en PHP :: partie2</title>
  </head>
<body>

<?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());
}


//récupération de la variable d'URL,
//qui va nous permettre de savoir quel enregistrement modifier
$id  = $_GET["idPersonne"] ;

//requête SQL:
$sql = "SELECT * FROM gbd_dat WHERE id = ".$id ;

//exécution de la requête:
$result = $bdd->query($sql); 

//affichage des données:
if($donnees = $result->fetch(PDO::FETCH_ASSOC))
{
?>

<form name="insertion" action="modification3.php" method="POST">
  <input type="hidden" name="id" value="<?php echo($id) ;?>">
  <table border="0" align="center" cellspacing="2" cellpadding="2">
    <tr align="center">
      <td>Patient</td>
      <td><input type="text" name="pat" value="<?php echo $donnees['pat'] ;?>"></td>
    </tr>
    <tr align="center">
      <td>Fiche</td>
      <td><input type="text" name="fic" value="<?php echo $donnees['fic'] ;?>"></td>
    </tr>
    <tr align="center">
      <td>Question</td>
      <td><input type="text" name="que" value="<?php echo $donnees['que'] ;?>"></td>
    </tr>
    <tr align="center">
      <td>Description</td>
      <td><input type="text" name="des" value="<?php echo $donnees['des'] ;?>"></td>
    </tr>
    <tr align="center">
      <td>Détails</td>
      <td><input type="text" name="det" value="<?php echo $donnees['det'] ;?>"></td>
    </tr>
    <tr align="center">
      <td>Corrections</td>
      <td><input type="text" name="cor" value="<?php echo $donnees['cor'] ;?>"></td>
    </tr>
    <tr align="center">
      <td>Non récupérable</td>
      <td><input type="number" name="non_rec" value="<?php echo $donnees['non_rec'] ;?>"></td>
    </tr>
    <tr align="center">
      <td>Commentaires</td>
      <td><input type="text" name="com" value="<?php echo $donnees['com'] ;?>"></td>
    </tr>

    <tr align="center">
      <td colspan="2"><input type="submit" value="modifier"></td>
    </tr>
  </table>
</form>

  <?php
  }//fin if 
  ?>

</body>
</html>

`

modification3.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
51
52
53
54
55
56
57
58
59
60
61
62
63
<?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());
}

//récupération des valeurs des champs:
//numéro patient:
$patient = $_POST["pat"] ;
//Fiche:
$fiche = $_POST["fic"] ;
//Question:
$question = $_POST["que"] ;
//Description:
$description = $_POST["des"] ;
//Détails:
$details = $_POST["det"] ;
//Correction:
$correction = $_POST["cor"] ;
//Non récupérable:
$nonrecuperable = $_POST["non_rec"] ;
//Commentaires :
$commentaires = $_POST["com"] ;

//récupération de l'identifiant de la personne:
$id = $_POST["id"] ;

//création de la requête SQL:
$sql = "UPDATE gbd_dat
        SET 
        pat = '$patient', 
        fic = '$fiche',
        que = '$question',
        des = '$description',
        det = '$details',
        cor = '$correction',
        non_rec = $nonrecuperable,
        com = '$commentaires'
        WHERE id = '$id' " ;

//exécution de la requête SQL:
$requete = $bdd->query($sql);


//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") ;
}
?>

`
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