Fonction UPDATE et requete WHERE

Signaler
Messages postés
17
Date d'inscription
vendredi 9 mai 2008
Statut
Membre
Dernière intervention
30 décembre 2010
-
Messages postés
17
Date d'inscription
vendredi 9 mai 2008
Statut
Membre
Dernière intervention
30 décembre 2010
-
Bonsoir,
J'ai créé un formulaire relié à une base de donnée MySQL. Jusque là tout fonctionne.
Dans un deuxième temps, j'aimerais pouvoir actualiser ma base de donnée.
J'ai donc créé un tableau qui reprend l'ensemble de ma base de donnée et qui me permet d'en actualiser 3 champs.
Le problème est que je ne maitrise pas la balise WHERE associée à la fonction UPDATE et rien ne se passe.
Voici le code de ma page :

<?PHP
$db = mysql_connect('*****', '*****', '*****');
mysql_select_db('*****',$db);
$sql = "UPDATE ***** SET reglement='$reglement', certificat='$certificat', Statut='$Statut' WHERE id='$id'";
mysql_query($sql)
or die('Erreur lors de la connexion à la base de donnée !'.$sql.'
'.mysql_error());


echo("Mise à jour enregistrée

");
?>

Quelqu'un peut il me dire pourquoi cela ne fonctionne pas ?
Merci d'avance

18 réponses

Messages postés
55
Date d'inscription
mercredi 15 octobre 2003
Statut
Membre
Dernière intervention
6 mai 2009

Et on est supposés t'aider avec si peu de renseignements ?

Si ton site n'utilise pas de multiples connexions à mysql, tu n'as pas besoin d'affecter le resultat du mysql_connect dans une variable, ni de l'inclure en paramètre optionnel dans mysql_select_db
ensuite, utilise des quotes simples pour les chaines de caractères, et favorise la concaténation
ensuite, vérifie la structure de ta table, int => pas de quotes, chaine => quote.
Je vois un "Statut" comme nom de champ.
Le mieux dans ces cas là, fais un echo de $sql, copie colle ce que ca affiche dans une fenetre d'execution SQL de phpmyadmin ou tout autre interpréteur de commandes SQL de ta bdd.
Mysql te dira là où ca coince.
Messages postés
17
Date d'inscription
vendredi 9 mai 2008
Statut
Membre
Dernière intervention
30 décembre 2010

Désolé si je n'ai pas été suffisamment complet dans mes explications, j'ai posté mon message hier soir après quelques heures d'énervement et de recherches en vain...

Voici l'echo de $sql :
UPDATE inscriptions09 SET reglement='En attente', certificat='En attente', Statut='En attente' WHERE id=''

Mes connaissances en PHP ne sont pas très avancées et je n'ai pas très bien compris le problème des quotes mais effectivement cela semble venir de là et particulierement de id qui est un int en auto increment alors que reglement, certificat et statut sont des chaines.

La connexion à la base semble fonctionner puisque si je ne mets aucune requete "WHERE" il actualise la base en donnant les mêmes valeurs à toute la base...

Dites moi si vous avez besoin de plus d'infos et un immense merci pour votre aide !
Messages postés
232
Date d'inscription
jeudi 30 août 2007
Statut
Membre
Dernière intervention
31 juillet 2009

Bin la réponse est très clair ... c'est que tu fais un UPADATE sur un id qui n'existe pas ... donc si tu veux modifier un id spécifique il va falloir faire une requete SELECT afin de sélectionner l'id que tu souhaite ...

La actuellement ton $id faut rien ...
Messages postés
17
Date d'inscription
vendredi 9 mai 2008
Statut
Membre
Dernière intervention
30 décembre 2010

Je comprend. Le problème doit être en amont alors, sur le tableau qui me sert à actualiser ma base.
Mon souhait au départ était d'afficher l'intégralité de ma base dans un tableau et de pouvoir actualiser 3 champs de cette base à l'aide de listes déroulantes.
La structure de mon tableau est la suivante :
id I Nom I Prénom I ... I liste déroulante 1 I liste déroulante 2 I liste déroulante 3 I bouton enregistrer
Je ne sais pas comment faire pour que lorsque j'appuie sur le bouton enregistrer, cela actualise les champs correspondants aux listes déroulantes (il y a un bouton "enregistrer" sur chaque ligne)
Messages postés
232
Date d'inscription
jeudi 30 août 2007
Statut
Membre
Dernière intervention
31 juillet 2009

Dans ta base de donnée ... les champ correspondants à tes listes déroulantes doivent avoir un id (ou oid ... un truc unique quoi :D) ... tu doit donc déclarer ces listes déroulantes avec comme name l'id de la base de données ...
Messages postés
17
Date d'inscription
vendredi 9 mai 2008
Statut
Membre
Dernière intervention
30 décembre 2010

:-( là ca dépasse mes compétences... Je ne maitrise pas assez.
Peux tu m'en dire un peu plus sur ce que je dois faire au niveau de ma base de donnée ou me donner un exemple de code svt...
Messages postés
232
Date d'inscription
jeudi 30 août 2007
Statut
Membre
Dernière intervention
31 juillet 2009

Et bien dans ta base de données tu as  un identifiant unique sur chaque ligne de ta table :
id | Nom | Prénom

Tu doit ensuite avec un boucle qui te permet d'afficher tout ton tableau :
foreach ($valDeLaBd as $val)
{
    echo $val['nom'] //ceci t'affiche le nom ... fait pareil pour tout tes champs
}

Et ensuite dans ta boucle tu fais afficher le champ dans ta liste déroulante

<select name='".$val['id']."'>
  <option></option>
</select>

Mais c'est difficile de t'expliquer comme ça ... fais voir un peu ton code si tu n'arrive pas
Messages postés
17
Date d'inscription
vendredi 9 mai 2008
Statut
Membre
Dernière intervention
30 décembre 2010

Voilà le code de ma page tableau :

<form name="update" action="update_conf.php" method="POST" class="white">
    ID,
    NOM,
    PRENOM,
    EPREUVES,
    REGLEMENT,
    CERTIF MED.,
    STATUT,
 MISE A JOUR,
 
  ----

    XTERRA,
    ALPI,
    TRAIL,
    CHAL.,
 


<?PHP
$db = mysql_connect('*****', '*****', '*****');
mysql_select_db('inscriptions09',$db);


$sql = "SELECT * FROM inscriptions09 ORDER BY nom";
$req = mysql_query($sql) or die('Impossible de se connecter au serveur
'.$sql.'
'.mysql_error());


while($data = mysql_fetch_array($req))
{
echo '   ----

    ';
echo $data['id'];
echo ',
    ';
echo $data['nom'];
echo ',
    ';
echo $data['prenom'];
echo ',
    ';
echo $data['xt_race'];
echo ',
    ';
echo $data['alpi_race'];
echo ',
    ';
echo $data['trail_race'];
echo ',
    ';
echo $data['challenge'];
echo ',
          <select name="reglement">
     <option selected="selected">';
echo $data['reglement'];
echo '</option>
        <option value="En attente">En attente</option>
        <option value="Incomplet">Incomplet</option>
        <option value="Reçu">OK</option>
      </select>,
       <select name="certificat">
        <option selected="selected">';
echo $data['certificat'];
echo '</option>
        <option value="En attente">En attente</option>
        <option value="Incomplet">Incomplet</option>
        <option value="Reçu">OK</option>
      </select>,
       <select name="Statut">
        <option selected="selected">';
echo $data['Statut'];
echo '</option>
        <option value="En attente">En attente</option>
        <option value="Incomplet">Incomplet</option>
        <option value="Validée">Validée</option>
      </select>,
 ,
 
';


}
mysql_close();  
?>


</form>

et celui de ma page php pour actualisation :

<?PHP
$db = mysql_connect('*****', '*****', '*****');
mysql_select_db('inscriptions09',$db);
$sql = "UPDATE inscriptions09 SET reglement='$reglement', certificat='$certificat', Statut='$Statut' WHERE id='$id'";
mysql_query($sql)
or die('Erreur lors de la connexion à la base de donnée !'.$sql.'
'.mysql_error());


echo("Mise à jour enregistrée.

");
?>

J'ai essayé le code sans la requete WHERE et ca actualise bien les données mais cela met les mêmes valeurs à toutes mes entrées forcément...
Messages postés
232
Date d'inscription
jeudi 30 août 2007
Statut
Membre
Dernière intervention
31 juillet 2009

Alors apparemment ça t'affiche ta page correctement mais ce que je ne comprends pas c'est sur les select ...

Par exemple qu'est ce que ça t'affiche : echo $data['reglement']; ???
Messages postés
17
Date d'inscription
vendredi 9 mai 2008
Statut
Membre
Dernière intervention
30 décembre 2010

Cela m'affiche la valeur actuelle du champs "reglement" dans ma base de donnée.
S'il n'a jamais été modifié sa valeur par défaut est "En attente" et ça m'affiche donc "En attente".
Cela me permet de savoir quelle est la valeur actuelle quand je visionne mon tableau.

En fait tout cela me sert dans le cadre du traitement d'inscriptions à une épreuve sportive.
Les concurrents s'inscrivent en ligne en complétant un formulaire et ensuite ils m'envoient le règlement et des documents administratifs. Ce que j'aimerais c'est pouvoir mettre à jour la base de donnée quand je reçois ces documents...
Messages postés
232
Date d'inscription
jeudi 30 août 2007
Statut
Membre
Dernière intervention
31 juillet 2009

Ne t'inquiete pas j'ai très bien compris ce que tu veux faire et j'ai bien compris que ça affiche la valeur du champ réglement mais c'est quoi cette valeur ... un entier ? une chaine ? un float ?
Messages postés
17
Date d'inscription
vendredi 9 mai 2008
Statut
Membre
Dernière intervention
30 décembre 2010

Pardon...
Reglement, certificat et statut sont des varchar
Seul id est un int en auto_increment que j'ai attribué comme index de la base
Messages postés
232
Date d'inscription
jeudi 30 août 2007
Statut
Membre
Dernière intervention
31 juillet 2009

Ok ... alors plusieurs choses :

Deja dans ton code pourquoi est ce que tu as 2 lignes dans ta première tables ??? (je ne vois pas ce qu'elle affiche en fait ...) Et ensuite pourquoi recré tu une nouvelle table alors que tu pourrais tout y mettre dans la même ...

Ensuite ici (dans toute tes selects) tu as :

echo '<td width="100" align="center">
      <select name="reglement">
     <option selected="selected">';
echo $data['reglement'];
echo '</option>
        <option value="En attente">En attente</option>
        <option value="Incomplet">Incomplet</option>
        <option value="Reçu">OK</option>
      </select>
</td>

Deja que fait le
à la fin ?! Ensuite j'imagine que $data['reglement'] retourne "En attente" ou "Incomplet" ou "OK" car tu ne m'as toujours pas donnnée la réponse

Il faudrait donc faire un truc comme ça :
while($data = mysql_fetch_array($req))
{
echo '<tr>';
echo '<td width="50" align="left">'.$data['id'].'</td>';
echo '<td width="100" align="left">'.$data['nom'].'</td>';
echo '<td width="100" align="left">'.$data['prenom'].'</td>';
echo '<td width="75" align="center">'.$data['xt_race'].'</td>';
echo '<td width="75" align="center">'.$data['alpi_race'].'</td>';
echo '<td width="75" align="center">'.$data['trail_race'].'</td>';
echo '<td width="50" align="center">'$data['challenge'].'</td>';
echo '<td width="100" align="center">
        <select name="reglement">
            <option value="reglement['.$data['id'].']" ';
if ($date['reglement']) == "Reglement") echo 'selected="selected"';
echo '>Reglement</option>
            <option value="attente['.$data['id'].']" ';
if ($date['reglement']) == "En attente") echo 'selected="selected"';
echo '>En attente</option>
            <option value="incomplet['.$data['id'].']" ';
if ($date['reglement']) == "Incomplet") echo 'selected="selected"';
echo '>Incomplet</option>
            <option value="recu['.$data['id'].']" ';
if ($date['reglement']) == "Reçu") echo 'selected="selected"';
echo '>OK</option>
      </select></td>';

Ensuite à toi de t'occuper de certificat et statut ...
Messages postés
17
Date d'inscription
vendredi 9 mai 2008
Statut
Membre
Dernière intervention
30 décembre 2010

Ce que je ne comprend pas c'est qu'à l'étape du tableau tout s'affiche correctement.
Les valeurs qui ont été actualisées pour certaines personnes s'affichent correctement dans mes listes déroulantes.
C'est à l'étape suivante que ça bloque avec la requete UPDATE.
La formulation de mon code n'a pas d'effet sur la base mais je ne dois pas être loin de la bonne formulation puisque si je retire WHERE il y a bien actualisation dans la base (mais pour tout le monde au lieu de seulement la personne qui m'intéresse).
Je pense que c'est uniquement le contenu de ce WHERE qui ne va pas...
Je m'arrache un peu les cheveux avec ça et le pire c'est que je pense que si je ne passais pas par un tableau et que je selectionnais les personnes une par une ca fonctionnerait mais ca me prendrait plus de temps
Messages postés
232
Date d'inscription
jeudi 30 août 2007
Statut
Membre
Dernière intervention
31 juillet 2009

Oui mais je ne pense pas que ce que tu as fait fonctionner rélleement puis toi tu sélectionne toujours règlement :
<td width="100" align="center">
      <select name="reglement">
     <option selected="selected">';
echo $data['reglement'];
echo '</option>
        <option value="En attente">En attente</option>
        <option value="Incomplet">Incomplet</option>
        <option value="Reçu">OK</option>
      </select>
</td>

Ici ça doit planter ton truc ... si tu déroule ta liste alors que par exemple un utilisateur est "En attente" alors "En attente sera sélectionnée mais tu en auras un deuxième dans ta liste.

Je sais que ça plante au niveau de ton Where mais ce que je voudrais c'est que tu comprenne qu'il faut que tes liste déroulantes est chacune un nom unique pour qu'ensuite tu puisse les mettre à jour dans ta base ...
Messages postés
17
Date d'inscription
vendredi 9 mai 2008
Statut
Membre
Dernière intervention
30 décembre 2010

Pour moi ca n'a pas d'importance si ma liste déroulante redonne la valeur qui est déjà "selected".
Cela complique encore le code avec un if juste par soucis de présentation...
Je ne comprends pas l'incidence sur l'actualisation. Au pire j'enlèverai la valeur "selected" pour simplifier mais c'est dommage car je ne saurai plus quelle est la valeur actuelle.
Messages postés
232
Date d'inscription
jeudi 30 août 2007
Statut
Membre
Dernière intervention
31 juillet 2009

Alors la je suis dans le flou ... moi ce que je pensais c'est qu'il fallait que tu puisse changer cette valeur ... mais c'est sur que si ta pas besoin de la changer dans ce cas ça ne te sert à rien d'afficher une liste ..

Pour mettre à jour correctement, il te suffit simplememnt de rajouter un champ hidden en bas de ton formulaire avant le bouton submit qui contient l'identifiant :

et puis ça devrait faire l'affaire .... mais j'tavouerais que je comprend pas l'utilisation de ta liste déroulante. ... c'est pas souci de présentation que le test est fait ... m'enfin ...
Messages postés
17
Date d'inscription
vendredi 9 mai 2008
Statut
Membre
Dernière intervention
30 décembre 2010

Dsl j'ai du mal m'exprimer.
Bien sûr que c'est la valeur sélectionnée dans la liste qui sert à actualiser la base.
Je ne comprends juste pas comment imputer le UPDATE à la seule ligne modifiée.
Je crois que je vais laisser tomber le principe du tableau et faire les update une par une