Aller au contenu

UPDATE à répétitions


davido

Sujets conseillés

Bonjour à tous !

Je suis confronté à un phénomène étrange... mais peut-être très logique (en tout cas pas pour moi ! :wacko: ).

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 ?

Lien vers le commentaire
Partager sur d’autres sites

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 :unsure:

Lien vers le commentaire
Partager sur d’autres sites

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 ?

Lien vers le commentaire
Partager sur d’autres sites

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 > 0
AND 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é par davido
Lien vers le commentaire
Partager sur d’autres sites

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 ?

Lien vers le commentaire
Partager sur d’autres sites

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

Lien vers le commentaire
Partager sur d’autres sites

pardon Jeromnimo :wub: 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é).

Lien vers le commentaire
Partager sur d’autres sites

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... :flower:

Du coup ce topic se retrouve hors sujet puisqu'il ne s'agit pas d'un pbl sql ;)

Lien vers le commentaire
Partager sur d’autres sites

  • 6 months later...

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 :blush: : 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 ... :wacko:

C'est très étrange, merci d'votre HELP !!! :) Ch'a fait un moment que je m'arrache les cheveux ...

Lien vers le commentaire
Partager sur d’autres sites

Veuillez vous connecter pour commenter

Vous pourrez laisser un commentaire après vous êtes connecté.



Connectez-vous maintenant
×
×
  • Créer...