[php/mysql] Eviter un probleme dont je ne sais nommer

Eviter un probleme dont je ne sais nommer [php/mysql] - PHP - Programmation

Marsh Posté le 27-08-2008 à 08:40:38    

Salut,  
 
etant donné que je me vois mal expliquer mon souci avec des mots clairs, j'essaye de faire un exemple tout con,
 
ci dessous un code qui poserait le probleme:
 
 

Code :
  1. <?//connection d'un visiteur
  2. //recuperation du compteur de visite
  3. $compteur=(SELECT compteur FROM base)
  4. //Incremente compteur de visite
  5. UPDATE base SET compteur=compteur +1
  6. //Si $compteur==1000 affiche yoohoo dla ballz
  7. if ($compteur==1000)
  8. echo "Dla Ballzz mec !";
  9. ?>


Le probleme que j'imagine, c'est si deux types se connectent en meme temps, ils auront tous les deux le messages... alors que seul le 1000eme visiteur aura droit au super "yoohoo dla ballz" !
 
 
Je vois les etapes du probleme comme ci dessous
 
en rouge la session du visiteur 1, en bleu la session du visiteur 2:
 
-Visiteur 1 se connecte
-$compteur=(select compteur from base)
-Visiteur 2 se connecte
-$compteur=(select compteur from base)
-Update base SET compteur=compteur+1
-Update base SET compteur=compteur+1
-Si $compteur=1000 alors afficher yoohoo supair dla balle!
-Si $compteur=1000 alors afficher yoohoo supair dla balle!

En fait le visiteur 2 s'intercale au moment ou le compteur va etre incrementé par la session du visiteur 1.
Comment on peut eviter ca ?


Message édité par Profil supprimé le 27-08-2008 à 08:54:49
Reply

Marsh Posté le 27-08-2008 à 08:40:38   

Reply

Marsh Posté le 27-08-2008 à 09:39:42    

ce que je ferai :  
declarer id comme un champ en autoincrement , dans une table de suivi , avec la structure : id, ip , ....
 
inserer des nouvelles lignes a chaque nouveau visiteur
 
utiliser mysql_insert_id() pour recuperer l'id généré

Reply

Marsh Posté le 27-08-2008 à 09:41:15    

Je pense (mais je ne suis pas sur) qu'il y a peu de chances pour qu'un visiteur B se connecte pile poil entre le "select compteur from..." et le "update base set..." du visiteur A
 
Ou alors il est TRES vif


Message édité par Marty_McFly le 27-08-2008 à 09:42:15

---------------
arg(z) = pi /2 donc z = i, moi je prends pas
Reply

Marsh Posté le 27-08-2008 à 09:43:19    

Avec Oracle on peut locker un enregistrement avec SELECT FOR UPDATE. Je ne sais pas si ça existe aussi avec MySQL.

Reply

Marsh Posté le 27-08-2008 à 10:33:12    

flo850 a écrit :

ce que je ferai :  
declarer id comme un champ en autoincrement , dans une table de suivi , avec la structure : id, ip , ....
 
inserer des nouvelles lignes a chaque nouveau visiteur
 
utiliser mysql_insert_id() pour recuperer l'id généré


Ca devrais le faire ! Merci

Reply

Marsh Posté le 27-08-2008 à 12:39:27    

User un fichier texte ? .. sur lequel tu écris ta variable de visiteurs  
ou mieux, toucher ce fichier de ton nombre de visiteurs ( peux etre utile pour placer un curseur de lecture dans un gros fichier ) :D


---------------
Photos Panoramiques Montagnes Haute Savoie
Reply

Marsh Posté le 27-08-2008 à 12:51:36    

non, c'est vraiment pas une bonne idée les accès concurrent a un fichier

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed