2008-10-26 8 views
1

J'ai une requête:problème avec la mise à jour un champ MySQL avec PHP

choix UPDATE SET votes = votes + 1 avec choice_id = 'user_choice de $'

Mais quand je l'exécuter dans mon script, les votes Le champ est mis à jour deux fois, donc les votes passeront de 4 à 6 au lieu de 5. Il ne semble pas qu'il soit appelé deux fois parce que je fais écho à des choses pour les tester et seulement un écho. Existe-t-il un moyen de l'avoir pour que PHP n'exécute cette requête qu'une seule fois par page "refresh"?

EDIT: Merci pour les réponses, j'utilise MySQL standard, pas de MySQLi ou PDO. Une autre chose que j'ai trouvée est que lorsque vous faites la requête, cela fonctionne quand vous démarrez avec 0 et mettez à jour à 1, mais après cela il va 3, 5, 7, ...

+0

Merci pour les réponses, j'utilise MySQL standard, pas de MySQLi ou PDO. Une autre chose que j'ai trouvée est que lorsque vous faites la requête, cela fonctionne quand vous démarrez avec 0 et mettez à jour à 1, mais après cela il va 3, 5, 7, ... –

+0

Vous devez vraiment fournir le code réel pour n'importe qui pour vous aider à le déboguer. –

+0

Ack to Scott: Impossible de déboguer sans le code. – BlaM

Répondre

2

Il existe plusieurs interfaces SQL pour beaucoup différentes marques de base de données en PHP. Vous n'avez pas montré le code PHP que vous utilisez pour exécuter la requête, et vous n'avez pas non plus identifié la marque de base de données que vous utilisez.

Dans certaines interfaces SQL de PHP, la création de l'instruction exécute implicitement le code SQL. Ensuite, vous avez la possibilité d'aller chercher les résultats (s'il s'agissait d'une instruction SELECT). Si votre instruction était un SELECT ou un DELETE, il est probable qu'aucun mal n'ait été fait, bien qu'il ne soit pas nécessaire d'exécuter l'instruction deux fois. Si votre déclaration était un INSERT ou UPDATE, cependant, vous pouvez trouver qu'il a pris effet deux fois.

Par exemple, en utilisant AOP:

$pdo = new PDO(...options...); 
$stmt = $pdo->query('UPDATE ...'); // executes once 
$stmt->execute(); // executes a second time 
1

Cette réponse est un surpuissant, mais vous pouvez vous assurer qu'il est exécuté deux fois, en permettant aux journaux binaires dans votre mysql (rappelez-vous, surpuissant!). Vous pouvez ensuite utiliser l'outil mysqllog pour voir ces fichiers et voir si la requête a été exécutée deux fois. Tout le monde croit quelque part dans votre code qu'il est interrogé deux fois :) J'utilise une telle requête et ça fonctionne parfaitement. Une autre chose, j'ai une classe wrapper pour mon objet PEAR_DB. Si demandé, il peut afficher les requêtes (et timestamps + stack trace) utilisées lors du rendu de la page en cours. Je l'utilise pour trouver des requêtes en double (comme les vôtres) et des mises à jour lentes.

1

Vous devez d'abord faire la requête appropriée:

UPDATE `choices` SET `votes` = `votes` + 1 WHERE `choice_id` = '$user_choice' 

Cette requête doit fonctionner correctement. Peut-être que vous avez une erreur dans le code PHP et cette requête s'exécute deux fois?

1

Vous aurez juste besoin de mettre des crochets autour de la votes + 1 tels que:

UPDATE choices SET votes = (votes + 1) WHERE choice_id = '$user_choice'; 

Je pourrais aussi mettre un LIMIT 1 à la fin.

De même, avez-vous essayé d'exécuter la requête en dehors de votre PHP, comme via PHPMyAdmin? Aussi, essayez de renvoyer votre SQL en entier avant de l'exécuter ... vous pouvez juste trouver une erreur.

3

Une autre option est, si vous utilisez firefox et que vous avez installé firbug, vous devez désactiver votre cache. Pour une raison quelconque, firbug génère deux appels au dB. J'ai pris des semaines pour comprendre ça là où je travaillais car l'assurance qualité obtenait toutes sortes de résultats étranges lors des tests. il était le seul avec un firebug.

0

Je viens de créer une table de base de données pour tester cette requête, je dois dire qu'elle fonctionne bien de mon côté.

MISE À JOUR choices SET votes = (votes +1) OÙ choice_id = '1'

Je pense que le code exécuté deux fois mon être dans votre application, vous pouvez essayer d'imprimer le sql comme il est en cours d'exécution. Vous pouvez également exécuter l'instruction sql en sortie nativement dans votre base de données. Pour conclure, l'instruction SQL est correcte, doublez simplement vos scripts d'application.

0

Je devine juste ici mais peut-être que ce code est exécuté une fois pour chaque ressource utilisée sur une page? Ainsi, si vous avez une image ou un iframe qui utilise le même code, les deux ressources l'exécutent une fois, ce qui entraîne la mise à jour du champ deux fois. J'ai eu ceci juste la semaine dernière dans mon gestionnaire de session basé sur PDO, mon compteur de test tirait deux fois parce que le logo du site est également servi par php et je mettais à jour le compteur de test dans le fichier auto_prepend_file.

Questions connexes