Page 1 sur 1

Faire un UPDATE uniquement pour les checkbox modifiées

Posté : 27 févr. 2012, 10:53
par Surfsp33
Bonjour,

Je cherche une méthode pour faire un update via PHP mais uniquement des checkbox que la personne aura modifiés pas de l'ensemble des checkbox.

Voilà à quoi ressemble le formulaire:

Image

Voilà à quoi ressemble ma base de données :

Image

Et voilà mon code :

Code : Tout sélectionner

<?php include('include/cnx_mysql.php'); // ON VERIFIE SI IL Y A DEJA DES DONNEES POUR CETTE PERSONNE $sql = 'SELECT COUNT(*) FROM test WHERE id_user = "5"'; $req = mysql_query($sql) or die('Erreur SQL !<br>'.$sql.'<br>'.mysql_error());   $data_count = mysql_fetch_row($req); $number_of_rows = $data_count[0]; mysql_free_result($req); // ON RECUPERE LES DONNEES POUR COCHER LES CASES DEJA ENREGISTREES if(isset($_POST['id_user'])) { if (isset($_POST['plage1'])) {$plage1 = 1;} else {$plage1 = 0;} if (isset($_POST['plage2'])) {$plage2 = 1;} else {$plage2 = 0;} if (isset($_POST['plage3'])) {$plage3 = 1;} else {$plage3 = 0;} if (isset($_POST['plage4'])) {$plage4 = 1;} else {$plage4 = 0;} // SI LA PERSONNE A DEJA DES DONNEES ON FAIT UN UPDATE if ($number_of_rows !=0) { $sql = 'UPDATE test SET plage1="'.$plage1.'", plage2="'.$plage2.'", plage3="'.$plage3.'", plage4="'.$plage4.'" WHERE id_user=5'; mysql_query($sql) or die('Erreur SQL !'.$sql.'<br>'.mysql_error());  mysql_close(); echo "Modification effectuée"; } // SI NON ON FAIT UN INSERT else { $sql = 'INSERT INTO test(id,id_user,plage1,plage2,plage3,plage4) VALUES("","5","'.$plage1.'","'.$plage2.'","'.$plage3.'","'.$$plage4.'")'; mysql_query($sql) or die('Erreur SQL !'.$sql.'<br>'.mysql_error());  mysql_close(); echo "Enregistrement effectué"; }} if ($number_of_rows !=0) { include('include/cnx_mysql.php'); $sql = 'SELECT * FROM test WHERE id_user = "5"'; $req = mysql_query($sql) or die('Erreur SQL !<br>'.$sql.'<br>'.mysql_error()); $data = mysql_fetch_assoc($req); mysql_close(); } ?> <!DOCTYPE html> <html>     <head>         <meta charset="utf-8" />             <!--[if lt IE 9]>             <script src="http://html5shiv.googlecode.com/svn/trunk/html5.js"></script>             <![endif]-->         <title>Test</title>     </head>     <body>              <form method="post" action="<?php echo $_SERVER['REQUEST_URI'];?>">             <p>                 Cocher vos disponibilités :<br />                 <input type="checkbox" name="plage1" id="plage1" <?php if ($data['plage1'] == 1) {echo "checked";} ?> /> <label for="plage1">00h - 06h</label><br />                 <input type="checkbox" name="plage2" id="plage2" <?php if ($data['plage2'] == 1) {echo "checked";} ?> /> <label for="plage2">06h - 12h</label><br />                 <input type="checkbox" name="plage3" id="plage3" <?php if ($data['plage3'] == 1) {echo "checked";} ?> /> <label for="plage3">12h - 18h</label><br />                 <input type="checkbox" name="plage4" id="plage4" <?php if ($data['plage4'] == 1) {echo "checked";} ?> /> <label for="plage4">18h - 00h</label><br />                 <input type="hidden" name="id_user" id="id_user" />                 <input type="submit" value="Envoyer" />             </p>         </form>               </body> </html>
Donc pour la partie :

Code : Tout sélectionner

$sql = 'UPDATE test SET plage1="'.$plage1.'", plage2="'.$plage2.'", plage3="'.$plage3.'", plage4="'.$plage4.'" WHERE id_user=5'; 
Comment arriver à ne faire l'UPDATE que sur les valeurs qui sont modifiées ?

Parce que là je vous ai simplifié le formulaire mais dans la réalité j'ai environ 50 checkbox différente et il serait inutile et lourd de faire l'update sur les 50 systématiquement. De plus je veux pouvoir envoyer un email d'information qui avertira des changements et uniquement des changements.

Comment faire ?

Merci d'avance.

Re: Faire un UPDATE uniquement pour les checkbox modifiées

Posté : 27 févr. 2012, 10:56
par Thibaud C
Je crois que ce sera encore plus lourd que de modifier les 50 checkboxs, mais il faut :
- soit que tu sauvegardes dans un coin les données de bases ( session par exemple )
- soit que tu pioche dans ta bdd;
et que tu fasses une comparaison avec tes nouveaux résultats récupérer dans le formulaire

Re: Faire un UPDATE uniquement pour les checkbox modifiées

Posté : 27 févr. 2012, 10:59
par xTG
Il faut construire ta requête dynamiquement. Mais le mieux serait aussi de savoir ce qui a été modifié (donc comparaison comme le dis Thibaud C).
Exemple :
$sql = 'UPDATE maTable SET';
$update = array();
if( !empty($_POST['champ1']) )
  $update['champ1'] = mysql_real_escape_string($_POST['champ1']);
if( !empty($_POST['champ2']) )
  $update['champ2'] = mysql_real_escape_string($_POST['champ2']);
if( !empty($update) ){
  $premier = true;
  foreach($update as $nomColonne => $valeur){
    if( $premier === false ) $sql .= ', ';
    $sql .= $nomColonne . " = '" . $valeur . "'";
    $premier = false;
  }
  $sql .= ' WHERE id = ' . mysql_real_escape_string($_POST['id']);
  mysql_query($sql);
}

Re: Faire un UPDATE uniquement pour les checkbox modifiées

Posté : 27 févr. 2012, 11:08
par mere-teresa
Et utilisez l'extension mysqli_* plutôt que mysql_* (le i veut dire "improved" = amélioré)

Re: Faire un UPDATE uniquement pour les checkbox modifiées

Posté : 27 févr. 2012, 13:25
par Surfsp33
Merci pour vos réponses.

Je vais faire quelques essais pour voir si je comprends tout :)

PS : Mon hébergeur n'autorise pas mysqli_ ni PDO.

Re: Faire un UPDATE uniquement pour les checkbox modifiées

Posté : 27 févr. 2012, 13:57
par xTG
Ne pas avoir PDO bon d'accord... Mais mysqli ? Elle est disponible dès PHP 4.1.13.
Ils ont quelques années de retard, ça me ferrait peur un hébergeur comme ça moi.