Se connecter avec
S'enregistrer | Connectez-vous
Votre question

Alerte doublons + update

Tags :
  • MySQL
  • Programmation
Dernière réponse : dans Programmation
Partagez
19 Février 2009 11:16:58

Bonjour :) 

J'aimerai vérifier que mon champs "date" n'est pas déjà dans la base sinon ça retourne une erreur mais pas seulement.
J'aimerai en plus effectuer une modification dans la base, si la personne confirme qu'elle souhaite écraser le contenu précédent.

Je suis pour le moment que sur la partie "vérification" du champs qui ne fonctionne pas bien sur :p . Je vous joints mon code pour information j'ai une boucle "for" qui me permet d'ajouter autant d'entré que d'utilisateurs car mon formulaire renvoie un listing d'utilisateur qui se trouve dans ma BDD.
J'espère être clair :x

En gras le code de vérification


<?php
if(isset($_POST['valider']))
{

$indice = $_POST['numIndice'];
$valider = $_POST['valider'];
$date = $_POST['date'];

function user_exists($date)
{
$sql = 'SELECT date FROM presence WHERE date = \'' . addslashes($date) . '\' LIMIT 1';
$res = mysql_query($sql) or die (mysql_error());
return (mysql_num_rows($res) == 1);
}


if(empty($_POST["date"]))
{
echo "Attention un des champs n'est pas correctement remplit.<a href='accueil.php'>Verifier</a>.";
}


else
{
if (user_exists($date))
{
echo('date deja enregistrer!<br />');
}
else
{



if ( $indice > 0 ) {

for ( $i=0; $i < $indice; $i++ )
{

$nservice=$_POST['nservice'.$i];
$agent=$_POST['agent'.$i];
$nchrono=$_POST['nchrono'.$i];
$etat=$_POST['etat'.$i];
$login=$_POST['login'.$i];

$requete ="INSERT INTO presence (id,nservice,date,agent,nchrono,etat,login) values ('','$nservice','$date','$agent','$nchrono','$etat','$login')";

mysql_query($requete);

}

mysql_close();
echo "La date à bien été prise en charge pour les ".$indice." agent";

}

}
else
echo "Merci de bien remplir le formulaire";
?>

vous pouvez retourner au <a href="accueil.php">menu principal</a>

Merci de votre aide future

Autres pages sur : alerte doublons update

a c 231 L Programmation
20 Février 2009 02:26:18

Hmm... de mémoire date est un mot réservé en SQL.
Essaie de mettre des ` ` (Alt Gr+7) autour de date quand tu l'utilises dans des noms de colonnes
Exemple: 'SELECT `date` FROM presence...'
20 Février 2009 09:29:35

Maintenant j'ai cette erreur :/ 

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '.2009' at line 1
Contenus similaires
20 Février 2009 10:04:12

C'est bon en faite jai mis des guillemet au lieu d'accolade avant le addslashes.


Par contre maintenant quand j'essaye de mettre la même date il m'informe que cette date est déjà enregistrer (donc ma boucle fonctionne) mais il m'ajoute quand même la date :x
a c 231 L Programmation
20 Février 2009 20:03:57

Hmm.. je viens de copier ton code dans ton précédent post, il y a l'air d'y avoir quelques éléments manquant vu qu'il manque deux }

Sinon, un conseil, c'est pour ton retour de la fonction :
return (mysql_num_rows($res) == 1)
remplace le par :
return (mysql_num_rows($res) >= 1)

Comme ça, au cas où il y a déjà 2 fois la même date pour une raison X ou Y, tu ne l'auras pas encore d'autres fois ;) 

Fais voir tout ton code pour voir où est le problème, et met ton code entre les balises [*code][/code] (sans l'étoile)
24 Février 2009 10:44:26

Alors voila mon code désolé du retard :x

Mon formulaire de saisie dans la BDD
  1. <?php require_once('connexion.php'); ?>
  2. <?php
  3. $query_users = "SELECT * FROM utilisateurs,agent WHERE utilisateurs.nservice = '1' AND agent.nservice = '1'"; // Tri la table agent sur le champs Nservice
  4. $users = mysql_query($query_users, $dbprotect) or die(mysql_error());
  5. $indice = 0;
  6. ?>
  7.  
  8. <form action="crea.php" method="post">
  9.  
  10. Entrez la Date <input readonly type="text" name="date" value="">
  11. <input type="button" value="Calendrier" onClick="displayCalendar(document.forms[0].date,'dd.mm.yyyy',this)">
  12. <?php
  13.  
  14. while( $result = mysql_fetch_object( $users ) )
  15. {
  16. ?>
  17. <table width="495" border="1">
  18. <tr>
  19. <td>Agent:</td>
  20. <td><input type="text" size="20" name="agent<?php echo $indice;?>" value="<?php echo ($result->nom);?> <?php echo ($result->prenom);?>"> <select name="etat<?php echo $indice;?>">
  21. <option>Présent</option>
  22. <option>Congès Annuels</option>
  23. <option>Congès Exceptionnel</option>
  24. <option>Mission</option>
  25. <option>Récupération</option>
  26. </select></td>
  27. </tr>
  28. <input type="hidden" name="nchrono<?php echo $indice;?>" value="<?php echo ($result->nchrono);?>">
  29. <input type="hidden" name="login<?php echo $indice;?>" value="<?php echo ($result->login);?>">
  30. <input type="hidden" name="nservice<?php echo $indice;?>" value="<?php echo ($result->nservice);?>">
  31. <?php
  32. $indice++;
  33. }
  34. ?>
  35. <input type="hidden" name="numIndice" value="<?php echo $indice;?>"/>
  36. </table>
  37. <input type="submit" value="valider" name="valider">
  38. </form>
  39. <a href="consultation.php">Consulter/Modifier</a>
  40. <?php } // fin de l'affichage conditionnel?>



mon fichier de traitement
  1. <?php require_once('connexion.php'); ?>
  2.  
  3.  
  4. <?php
  5. if(isset($_POST['valider']))
  6. {
  7.  
  8. $indice = $_POST['numIndice'];
  9. $valider = $_POST['valider'];
  10. $date = $_POST['date'];
  11.  
  12. function user_exists($date)
  13. {
  14. $sql = 'SELECT `date` FROM presence WHERE date = \'' . addslashes($date) . '\' LIMIT 1';
  15. $res = mysql_query($sql) or die ($sql.'<br />'.mysql_error());
  16. return (mysql_num_rows($res) >= 1);
  17. }
  18.  
  19.  
  20. if (user_exists($date))
  21. {
  22. echo('date deja enregistrer!<br />');
  23. echo('voulez vous vraiement continuer?<br />');
  24. }
  25. else
  26. {
  27. if ( $indice > 0 ) {
  28. for ( $i=0; $i < $indice; $i++ )
  29. {
  30.  
  31. $nservice=$_POST['nservice'.$i];
  32. $agent=$_POST['agent'.$i];
  33. $nchrono=$_POST['nchrono'.$i];
  34. $etat=$_POST['etat'.$i];
  35. $login=$_POST['login'.$i];
  36.  
  37. $requete ="INSERT INTO presence (id,nservice,date,agent,nchrono,etat,login) values ('','$nservice','$date','$agent','$nchrono','$etat','$login')";
  38.  
  39. mysql_query($requete);
  40.  
  41. }
  42.  
  43. mysql_close();
  44. echo "La date à bien été prise en charge pour les ".$indice." agent";
  45.  
  46. }
  47.  
  48. }
  49. else
  50. echo "Merci de bien remplir le formulaire";
  51.  
  52. }
  53.  
  54. ?>
  55. vous pouvez retourner au <a href="accueil.php">menu principal</a>
a c 231 L Programmation
24 Février 2009 20:33:37

Ah pardon, j'avais pas fait attention que tu avais un LIMIT 1 dans ta requête SQL, donc tu pouvais laisser return (mysql_num_rows($res) == 1)

Par contre, tu n'as mis les `` qu'à un seul endroit dans ta requête SQL, mais les sur les deux "date".

Ensuite il y a l'air d'y avoir un soucis avec ton else final...
Ton else doit être associé à ton if(isset($_POST['valider'])), or là, il est avant la fermeture de ton if.

quelque chose comme ça devrait le faire :
  1. <?php require_once('connexion.php'); ?>
  2. <?php
  3. if(isset($_POST['valider']))
  4. {
  5. $indice = $_POST['numIndice'];
  6. $valider = $_POST['valider'];
  7. $date = $_POST['date'];
  8.  
  9. function user_exists($date)
  10. {
  11. $sql = 'SELECT `date` FROM presence WHERE `date` = \'' . addslashes($date) . '\' LIMIT 1';
  12. $res = mysql_query($sql) or die ($sql.'<br />'.mysql_error());
  13. return (mysql_num_rows($res) == 1);
  14. }
  15.  
  16. if (user_exists($date))
  17. {
  18. echo('date deja enregistrer!<br />');
  19. echo('voulez vous vraiement continuer?<br />');
  20. }
  21. else
  22. {
  23. if ( $indice > 0 ) {
  24. for ( $i=0; $i < $indice; $i++ )
  25. {
  26. $nservice=$_POST['nservice'.$i];
  27. $agent=$_POST['agent'.$i];
  28. $nchrono=$_POST['nchrono'.$i];
  29. $etat=$_POST['etat'.$i];
  30. $login=$_POST['login'.$i];
  31. $requete ="INSERT INTO presence (id,nservice,date,agent,nchrono,etat,login) values ('','$nservice','$date','$agent','$nchrono','$etat','$login')";
  32. mysql_query($requete);
  33. }
  34. mysql_close();
  35. echo "La date à bien été prise en charge pour les ".$indice." agent";
  36. }
  37. }
  38. }
  39. else
  40. echo "Merci de bien remplir le formulaire";
  41. ?>
  42. vous pouvez retourner au <a href="accueil.php">menu principal</a>
25 Février 2009 11:19:47

J'ai bien le message comme quoi j'ai déjà un enregistrement mais j'ai rien dans ma BDD, rien ne s'ajoute.

pour info:
$sql = 'SELECT `date` FROM presence WHERE date = \'' . addslashes($date) . '\' LIMIT 1';


Je suis obligé d'enlever les ``du deuxième date car sinon j'ai une erreur
a c 231 L Programmation
25 Février 2009 13:48:15

et bien fais toi une petite fonction qui exécute cette requête SQL et regarde le résultat qu'elle te retourne...
Tu verras peut être d'où vient le soucis.
25 Février 2009 16:36:05

Jcomprend pas l'intérêt d'une fonction
a c 231 L Programmation
25 Février 2009 20:03:39

bah une fonction ou pas...
c'était juste pour te faire faire une requête SQL, tu récupères le résultat de la requête, tu le mets dans un tableau, et tu regardes les données qui sont récupérées.

Comme ça tu verras ce qui est vraiment retourné quand tu fais un SELECT date FROM presence WHERE date = $date

C'est plus clair ?

Parce que s'il te dit qu'il trouve une ligne alors qu'il n'y en a pas, il faudrait voir quelle est la ligne qu'il retourne, ça t'aidera à savoir ce qui plante.
26 Février 2009 11:02:36

En faite ça marche très bien je regardais la mauvaise bdd :x jvais arrêter le café au rhum :p .
Je te remercie la partie vérification fonctionne très bien :) .


Maintenant je vais m'attaquer à la partie UPDATE :/ 

Pour traiter l'UPDATE.
Quand j'ai le message:
echo('voulez vous vraiement continuer?<br />');

Je pensais mettre un href sur continuer avec une page PHP par exemple "update.php" et la je met mon traitement. Tu as une meilleur solution?
26 Février 2009 11:45:43

J'ai commencé à faire ça mais j'ai une erreur à la ligne 32. Ma requete est en toute logique bonne et je pense avoir également besoin de ma boucle for.

  1. <?php require_once('connexion.php'); ?>
  2. <?php
  3. if(isset($_POST['valider']))
  4. {
  5.  
  6. $indice = $_POST['numIndice'];
  7. $valider = $_POST['valider'];
  8. $date = $_POST['date'];
  9.  
  10. if ( $indice > 0 ) {
  11. for ( $i=0; $i < $indice; $i++ )
  12. {
  13. $nservice=$_POST['nservice'.$i];
  14. $agent=$_POST['agent'.$i];
  15. $nchrono=$_POST['nchrono'.$i];
  16. $etat=$_POST['etat'.$i];
  17. $login=$_POST['login'.$i];
  18. $sql ="UPDATE presence SET
  19. date='$date',
  20. nservice='$nservice',
  21. agent='$agent',
  22. nchrono='$nchrono',
  23. etat='$etat',
  24. login='$login'";
  25. mysql_query($requete);
  26. }
  27. echo "Mise à jour effectué";
  28. }
  29. else
  30. echo "La mise $agrave; rencontr$eacute un problème";
  31. ?>
  32. Vous pouvez retourner au <a href="accueil.php">menu principal</a>
a c 231 L Programmation
26 Février 2009 13:55:01

Salut,

La plupart du temps, quand tu as des erreurs à la dernière ligne de ton code, c'est qu'il te manque une parenthèse, une accolade ou quelque chose comme ça ;) 
Et là, il te manque une accolade fermante.
Tu en ouvres 3 :
- (if(isset(...))
- if($indice ...)
- for (...)

Mais tu en fermes que 2.
26 Février 2009 14:31:26

Merci beaucoup :)  mais pour le moment ma boucle ne fonctionne pas puisque j'ai le message du else :/ 
a c 231 L Programmation
27 Février 2009 00:03:27

C'est parce que si tu as fait un lien href comme tu me le disais au dessus, tu n'as plus de données $_POST vu que tu as changé de page.
Il faut rebalancer les données $_POST pour les avoir à la page suivante.
27 Février 2009 09:38:45

Ok donc je dois remettre le formulaire
a c 231 L Programmation
27 Février 2009 20:23:50

Soit ça, soit tu as une méthode il me semble pour repasser toutes les valeurs $_POST jusqu'à la page suivante.
Fais des recherches sur ton moteur de recherche préféré pour trouver ça.
2 Mars 2009 10:12:12

ou sinon mettre mon update dans la page créa mais faut que je cherche "sur mon moteur de recherche préféré" comment passer par l'update seulement si la personne confirme le souhaite d'écraser le contenu précédent
2 Mars 2009 11:52:46

Une des solutions, serai que j'écrive dans mon URL les valeurs mais les exemples son très simplifier et ne corresponde pas du tout a mon code qui reprend des éléments de la BDD ainsi qu'une variable numIndice

Si je procède comme si dessous ça risque de ne pas marcher
  1. ...monfichier.asp?param1=valeur1&param2=valeur2...


D'après se que j'ai compris je devrai mettre ça
  1. <a href="update.php?agent<?php echo $indice;?>=<?php echo ($result->nom);?> <?php echo ($result->prenom);?>">suivant</a>"<br />');
a c 231 L Programmation
2 Mars 2009 22:16:30

Ici : http://ca2.php.net/manual/fr/reserved.variables.post.ph...
Sa fonction transforme toutes tes variables $_POST en QueryString (donc en ?param1=valeur1¶m2=valeur2...

Tu peux aussi regarder la remarque du 2ème commentaire qui s'applique à ce que tu fais.

Sinon, tu peux stocker les valeurs en session et donc les récupérer depuis la page suivante. Mais il faudra pour ça récupérer les valeurs de $_SESSION et pas $_POST.

(Désolé mais ça fait plus d'un an que j'ai pas fait de PHP, c'est pas tout frais)
3 Mars 2009 10:47:37

Pour mon niveau les session sont plus simple.

J'ai tout remplacé par les session sur ma page créa ça fonctionne mais pas sur update :/ 

crea.php
  1. <?php
  2. if(isset($_POST['valider']))
  3. {
  4.  
  5. $_SESSION['indice'] = $_POST['numIndice'];
  6. $_SESSION['valider'] = $_POST['valider'];
  7. $_SESSION['date'] = $_POST['date'];
  8.  
  9. function user_exists($date)
  10. {
  11. $sql = 'SELECT `date` FROM presence WHERE date = \'' . addslashes($date) . '\' LIMIT 1';
  12. $res = mysql_query($sql) or die ($sql.'<br />'.mysql_error());
  13. return (mysql_num_rows($res) == 1);
  14. }
  15.  
  16.  
  17. if (user_exists($date))
  18. {
  19. echo('La date que vous avez saisie est déjà enregistrer!<br />');
  20. echo('Si vous souhaitez écraser le contenu précédent veuillez cliquer sur le lien "<a href="update.php">suivant</a>"<br />');
  21. }
  22. else
  23. {
  24. if ( $indice > 0 ) {
  25. for ( $i=0; $i < $indice; $i++ )
  26. {
  27. $_SESSION['nservice'] = $_POST['nservice'.$i];
  28. $_SESSION['agent'] = $_POST['agent'.$i];
  29. $_SESSION['nchrono'] = $_POST['nchrono'.$i];
  30. $_SESSION['etat'] = $_POST['etat'.$i];
  31. $_SESSION['login'] = $_POST['login'.$i];
  32.  
  33. $requete ="INSERT INTO presence (id,nservice,date,agent,nchrono,etat,login) values ('','$nservice','$date','$agent','$nchrono','$etat','$login')";
  34.  
  35. mysql_query($requete);
  36. }
  37. mysql_close();
  38. echo "La date à bien été prise en charge pour les ".$indice." agent ";
  39. }
  40. }
  41. }
  42. else
  43. echo "Merci de bien remplir le formulaire";
  44. ?>


update.php
  1. <?php
  2. if(isset($_POST['valider']))
  3. {
  4.  
  5. $_SESSION['indice'] = $_POST['numIndice'];
  6. $_SESSION['valider'] = $_POST['valider'];
  7. $_SESSION['date'] = $_POST['date'];
  8.  
  9. if ( $indice > 0 ) {
  10. for ( $i=0; $i < $indice; $i++ )
  11. {
  12. $_SESSION['nservice'] = $_POST['nservice'.$i];
  13. $_SESSION['agent'] = $_POST['agent'.$i];
  14. $_SESSION['nchrono'] = $_POST['nchrono'.$i];
  15. $_SESSION['etat'] = $_POST['etat'.$i];
  16. $_SESSION['login'] = $_POST['login'.$i];
  17. $requete ="UPDATE presence SET
  18. date='$date',
  19. nservice='$nservice',
  20. agent='$agent',
  21. nchrono='$nchrono',
  22. etat='$etat',
  23. login='$login'";
  24. mysql_query($requete);
  25. }
  26. }
  27. echo "Mise à jour effectué<br>";
  28.  
  29. }
  30. else
  31. echo "La mise &agrave jour à rencontr&eacute un problème<br>";
  32. ?>
a c 231 L Programmation
4 Mars 2009 00:24:00

Salut,

Bah le soucis sur ta page update, c'est que tu n'as pas de tableau $_POST, tu as juste des valeurs qui sont en session.

Donc, tu oublies ce que tu as en $_POST et tu te focalises que sur ce que tu as en $_SESSION, donc toutes tes initialisations de $_SESSION ne servent à rien dans cette page, vu que tu les as déjà en session.

Ensuite, dans ta page d'insertion, tu fais ça :
  1. $_SESSION['nservice'] = $_POST['nservice'.$i];
  2. $_SESSION['agent'] = $_POST['agent'.$i];
  3. $_SESSION['nchrono'] = $_POST['nchrono'.$i];
  4. $_SESSION['etat'] = $_POST['etat'.$i];
  5. $_SESSION['login'] = $_POST['login'.$i];
  6. $requete ="INSERT INTO presence (id,nservice,date,agent,nchrono,etat,login) values ('','$nservice','$date','$agent','$nchrono','$etat','$login')";
  7. mysql_query($requete);


Dans ta configuration actuelle, il y a quelque chose qui est activée pour que ta variable $date soit égale à $_POST['date'], mais ce n'est pas forcément le cas...
Tu définies des variables en session, réutilise les quand tu fais ton insert.

Et pour finir, il faudra que tu te renseignes sur les injections SQL et sur leur protection si tu ne veux pas que l'on puisse supprimer toute ta base en utilisant tes requêtes INSERT ou UPDATE... ;) 
Tom's guide dans le monde
  • Allemagne
  • Italie
  • Irlande
  • Royaume Uni
  • Etats Unis
Suivre Tom's Guide
Inscrivez-vous à la Newsletter
  • ajouter à twitter
  • ajouter à facebook
  • ajouter un flux RSS