update sql

Eléphanteau du PHP | 40 Messages

26 oct. 2006, 23:59

Bonsoir.

Code : Tout sélectionner

<?php // On commence par récupérer les champs $min1 = $_POST['min1'] ; $min2 = $_POST['min2'] ; $min3 = $_POST['min3'] ; etc etc // On vérifie si les champs sont vides // Aucun champ n'est vide, on peut enregistrer dans la table { // connexion à la base $db = mysql_connect(**************) or die('Erreur de connexion '.mysql_error()); // sélection de la base mysql_select_db('******',$db) or die('Erreur de selection '.mysql_error()); // on écrit la requête sql $sql = mysql_query("UPDATE tbl_tarifs SET min1 = '$min1', max1 = '$max1', min2 = '$min2', max2 = '$max2', min3 = '$min3', max3 = '$max3', min4 = '$min4', max4 = '$max4', min5 = '$min5', max5 = '$max5', mindp = '$mindp', maxdp = '$maxdp', minpension = '$minpension', maxpension = '$maxpension', pdj = '$pdj', taxe = '$taxe', supindiv = '$supindiv', animal = '$animal', WHERE hotel = 'nomdutruc' ") or die( mysql_error()); // on insère les informations du formulaire dans la table // on affiche le résultat pour le visiteur echo '<span class="texterror">Vos infos on été ajoutées.</span><br>'; echo '<span class="recherche"><a href="tarifs.php">Revenir en arriere</a></span>'; mysql_close(); // on ferme la connexion } ?>
Ma question :

Quand je mets à jour mes données (bdd) via un formulaire, dans le cas ou je remplis pas un champ de formulaire, le script va prendre ça pour un vide et va modifier la donnée de la bdd et mettre un vide à la place.

Comment faire pour éviter ça, à part obliger la personne à remplir tous les champs du formulaire?

MercI.

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

27 oct. 2006, 00:14

Salut,
Tu peux soit:
1. Préremplir les champs du formulaire avec les données de la BD... s'il n'y a pas eu de changement alors la ligne de donnée (tuple, enregistrement, données d'une personne) sera mis à jour avec les mêmes données.

2. construire une requete dynamique en fonction des champs remplis.
// initialisation d'un tableau pour contenir les différentes mise à jour
$sql_tab = array();
// si le champ n'est pas vide (donc renseigné pour être modifié)
if (!empty($_POST['min1']) )
    $sql_tab[] = "min1 = ".$_POST['min1'] ; 

// idem avec les autres champs
if (!empty($_POST['min2']))
    $sql_tab[] = "min2 = ".$_POST['min2'] ; 

// si'l y a au moins une condition à modifier on exécute la requête
if(count($sql_tab) > 0)
{
   // code de mise à jour
   // je te laisse verifier l'utilité de la fonction implode
   $sql_set = implode(",",$sql_tab);
   // construction de la requête avec les champs à modifier
   $sql = "UPDATE tbl_tarifs SET ".$sql_set." WHERE hotel = 'nomdutruc' ") or die( mysql_error());
}
else 
{
    //tous les champs sont vide
}
Ceci sert juste d'exemple... il y a certainement des choses à pauffiner mais le principe y est.

N'oublis pas de protéger les données reçues par post (addslashes ou autre ) il ne faut pas faire confiance aveuglément
Modifié en dernier par Truc le 27 oct. 2006, 00:15, modifié 1 fois.

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

ViPHP
ViPHP | 1961 Messages

27 oct. 2006, 00:14

Bonsoir,

Il faut construire ta requête dynamiquement. Tu l'écris en fonction du contenu de tes variables.
$qry = "UPDATE ma_table SET ";
if(isset($chp1) && ! empty($chp1)){
   $qry .= 'mon_champ = \'' . $chp1 . '\'';
}
if(isset($chp2) && ! empty($chp2)){
   $qry .= ', mon_champ2 = \'' . $chp2 . '\'';
}
/* même chose pour chaque champ */
Ceci ne doit pas t'empècher de tester aussi la validité des données transmises par l'utilisateur
Deux choses sont infinies, l'Univers et la sottise humaine!!
Mais je ne suis pas sur de ce que j'affirme au sujet de l'Univers.

A. Einstein

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

27 oct. 2006, 10:20

Personnellement je suis d'avantage pour la solution 1 de Truc : pré-renseigner les valeurs et tout écraser à chaque fois.

C'est sans doute moins joli que de construire dynamiquement une requête, mais cela permet à l'utilisateur de vider volontairement un champ, chose que la requête dynamique n'acceptera pas ( => champ vide jamais mis à jour).
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...