davido Posté 1 Novembre 2006 Posté 1 Novembre 2006 Bonjour à tous ! Je suis confronté à un phénomène étrange... mais peut-être très logique (en tout cas pas pour moi ! ). Voilà, je ch à gérer des images classées dans une base. Si une image correspond à certains critères, elle est sélectionnée pour être affichée. Je lui alloue alors un crédit supplémentaire. Problème : parfois lors des sélections successives de cette image par le script PHP, elle a été créditée plusieurs fois alors que le update n'a été appliqué qu'une fois ! C'est comme si MySQL effectuait le UPDATE 2 ou 3 fois de suite : 1) SELECT * FROM images WHERE ... AND ... AND credit > 0 ORDER BY rand() LIMIT 1 S'il existe un résultat en 1) on passe en 2) : 2) UPDATE images SET credit = credit+1 WHERE num = $num; Résultat : plusieurs appels successifs du script donnent non pas : credit=1, 2, 3, 4, 5... mais : credit=1, 2, 4, 5, 7, 10... On dirait que credit est incrementé même quand la partie 2) du script n'est pas exécutée et que le simple fait de faire le SELECT en 1) même s'il ne renvoit pas une image (ce qui est prévu) agit sur le dernier 'credit' modifié. Une histoire de LOW/HIGH_PRIORITY ?
Harry_20 Posté 1 Novembre 2006 Posté 1 Novembre 2006 Personnellement, Je me demande si le problème ne viendrait pas du script PHP qui serait exécuté plusieurs fois ... Mais pour pouvoir en dire plus, il faudrait plus de précisions sur ton script, sinon ça va être dur je crois
Jeromnimo Posté 2 Novembre 2006 Posté 2 Novembre 2006 bonjour, * quand tu fais credit = credit +1, tu te sers direstement des champs sql ou bien tu recuperes la valuer en php et tu fais l'incrementation en php ? (genre 'UPDATE.....credits ='.$credit++.'...') * tu testes ton script en local ou dans un envirronnement de prod ou eventuellement plusieurs utilisateurs peuvent voir la photo en même temps ?
davido Posté 2 Novembre 2006 Auteur Posté 2 Novembre 2006 (modifié) merci, voici des précisions : - je teste le script sur mon hébergement en conditions de prod mais dans un rep connu de moi seul - que je fasse 'credit=credit+1' en SQL ou bien en PHP genre 'UPDATE.....credit ='.$credit++.'...' l'effet est le même. Le script est appelé effectivement plusieurs fois à la suite mais seule la partie SELECT est exécutée à chaque fois. La partie UPDATE (requête $maj) n'est exécutée que si $visuel_selectionne est vrai. Si je teste 'UPDATE rep_visuels SET credit = credit+1 WHERE num = XX;' dans phpMyAdmin p.ex. plusieurs fois de suite, 'credit' incrémente normalement de 1 en 1. Il semble qu'un SELECT vide entre 2 UPDATE agisse sur le dernier visuel sélectionné... Voici le code pour plus de clareté : <?include_once('config.php');include_once ('cnx_mysql.php');#### Traduction des variables$appelant = $_GET[s];$appel_format = $_GET[f];$zones = $_GET[z];...#### Requete$req_appelant = "SELECT * FROM sites_cmp WHERE num = $appelant";$res_appelant = mysql_query($req_appelant);$row_appelant = mysql_fetch_array($res_appelant);#### Selection d'un visuel$hzd = mt_rand(1,10);$req_visuel = "SELECT * FROM visuels WHERE sites LIKE '$appelant' AND format = $appel_format AND priorite <= $hzd AND credit > 0AND date_fin > UNIX_TIMESTAMP() ORDER BY rand() LIMIT 1";if($res_visuel = mysql_query($req_visuel)){ $row_visuel = mysql_fetch_array($res_visuel); $nbr_visuel = mysql_num_rows($res_visuel); if($nbr_visuel){//Si un visuel est selectionne $visuel_selectionne = true; } } else {//La requete ne passe pas print ("Erreur MySQL!"); }### Traitement des credits if($visuel_selectionne){//Si un visuel a ete trouve $maj = "UPDATE visuels SET credit = credit+1 WHERE num = $row_visuel[num];"; $maj_res = mysql_query($maj);}#### Affichage du visuel//Ensuite on affiche l'image s'il y en a une Modifié 2 Novembre 2006 par davido
Jeromnimo Posté 2 Novembre 2006 Posté 2 Novembre 2006 Okay, merci pour les précisions. Pourquoi dans ta requete UPDATE tu fais le set sur la table 'rep_visuels' alors que dans le SELECT tu travailles sur la table 'visuels' ? c'est deux tables distinctes ?
Portekoi Posté 2 Novembre 2006 Posté 2 Novembre 2006 Bonjour, As tu une balise HTML vide comme ceci : '<img src="" />' Si oui, cela a pour effet de charger deux fois la page. Vérifie donc que tu n'es pas un balise vide sur ta page portekoi
davido Posté 2 Novembre 2006 Auteur Posté 2 Novembre 2006 pardon Jeromnimo j'ai corrigé mon mess pour ne pas avoir 2 tables rep_visuels et visuels, il n'y en a bien qu'une (j'ai copié-collé un bout de code où ce point n'était pas corrigé).
davido Posté 2 Novembre 2006 Auteur Posté 2 Novembre 2006 Merci Portekoi le problème vient bien d'une balise img vide ! Tout occupé à résoudre un faux pbl de requete MySQL j'avais un joli effet de bord... Je ne connaissais pas cette particularité d'une balise vide. Encore merci car j'aurais pu chercher longtemps... Du coup ce topic se retrouve hors sujet puisqu'il ne s'agit pas d'un pbl sql
Portekoi Posté 2 Novembre 2006 Posté 2 Novembre 2006 Pas de soucis, je suis tombé sur ce problème et j'ai cherché longtemps Ton post restera en Sql car c'est plus parlant ainsi
huguette Posté 15 Mai 2007 Posté 15 Mai 2007 Salut Salut, Merci d'avoir laissé ce Post paske j'ai un problème similaire et c'est tellement étrange que je ne pensais pas trouver qqun dans le mm cas que moi... Bref, petite présentation du problème pour que ca paraisse encore plus reloud : j'ai complètement viré l'HTML pour les problèmes d'img vide etc.. Mon script est déclenché par un lien. On clique dessus pour ajouter une personne, sauf que quand je clique dessus ca m'en rajoute 2... Je fonctionne avec EasyPHP sur ma bécanne, rien en ligne etc.. Mon code : $test=1;......if(isset($_GET['ajout']) && $_GET['ajout']==1) //est ce qu'on a cliqué pour un ajout { //Récupération du dernier ID $req="SELECT id FROM qui ORDER BY id DESC"; $rsp=mysql_query($req) or die(mysql_error()); $id_tab=mysql_fetch_array($rsp); $id=$id_tab['id']+1; //REQUETES DE TEST POUR VERIFIER QUE LE SCRIPT EST BIEN CHARGE 2 FOIS //J'OBTIENS BIEN DEUX CHAMPS DANS MA TABLE AVEC DES ID DIFFERENTS $req_Test=mysql_query("SELECT id FROM model ORDER BY id DESC"); $req_Test=mysql_fetch_array($req_Test); if($req_Test['id']==1) { echo('ca boucle'); $test=$test+1; } $req_Test2="INSERT INTO model(id,model) VALUES('$test','$test')"; mysql_query($req_Test2) or die(mysql_error()); $req2="INSERT INTO qui(nom,prenom,fonction,comments,photo,id) VALUES('','','','','','$id')"; mysql_query($req2) or die(mysql_error()); mysql_close(); } Ce qui est assez troublant c'est que je n'ai pas de problème quand je tape l'adresse directement dans le navigateur, du style : ....php?ajout=1, je n'en ai pas non plus si je fais un reload de la page ... C'est très étrange, merci d'votre HELP !!! Ch'a fait un moment que je m'arrache les cheveux ...
Sujets conseillés
Veuillez vous connecter pour commenter
Vous pourrez laisser un commentaire après vous êtes connecté.
Connectez-vous maintenant