Faire un UPDATE uniquement pour les checkbox modifiées

Petit nouveau ! | 2 Messages

27 févr. 2012, 10:53

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.

Eléphant du PHP | 179 Messages

27 févr. 2012, 10:56

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

ViPHP
xTG
ViPHP | 7331 Messages

27 févr. 2012, 10:59

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

Modérateur PHPfrance
Modérateur PHPfrance | 6037 Messages

27 févr. 2012, 11:08

Et utilisez l'extension mysqli_* plutôt que mysql_* (le i veut dire "improved" = amélioré)
Règle n°2 du webmaster : Toujours commencer par le HTML qu'on veut obtenir....toujours ! :priere:
J'aime apprendre de nouvelles choses.

Petit nouveau ! | 2 Messages

27 févr. 2012, 13:25

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.

ViPHP
xTG
ViPHP | 7331 Messages

27 févr. 2012, 13:57

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.