Проблема с обновлением поля MySQL с помощью PHP

У меня есть запрос:

Варианты UPDATE SET голосов = голосов + 1 WHERE choice_id = '$ user_choice'

Но когда я выполняю его в своем скрипте, поле голосов обновляется дважды, поэтому голоса будут идти от 4 до 6, а не до 5. Кажется, что его дважды вызывают, потому что я повторяю материал, чтобы проверить это и только получить одно эхо. Есть ли способ получить это, поэтому PHP будет выполнять этот запрос только один раз за страницу «Обновить»?

EDIT : Спасибо за ответы, я использую обычный MySQL, не MySQLi или PDO. Еще одна вещь, которую я обнаружил, заключается в том, что при выполнении запроса она работает, когда вы начинаете с 0 и обновляете до 1, но затем после этого она идет 3, 5, 7, …

Еще один вариант: если вы используете firefox вообще и имеете установленную firbug, вам нужно отключить кеш. По какой-то причине firbug приводит к двум вызовам дБ. Взял недели, чтобы понять это, где я работаю, поскольку QA получает всевозможные странные результаты при тестировании. он был единственным с firebug.

В PHP существует несколько интерфейсов SQL для многих разных брендов базы данных. Вы не указали код PHP, который вы используете для выполнения запроса, и не указали, какую марку базы данных вы используете.

В некоторых SQL-интерфейсах в PHP создание инструкции неявно выполняет SQL. Тогда у вас есть возможность получить результаты (если это была инструкция SELECT). Если ваше утверждение было SELECT или DELETE, вполне вероятно, что никакого вреда не было сделано, хотя нет необходимости выполнять инструкцию дважды. Если ваше заявление было INSERT или UPDATE, вы можете обнаружить, что оно вступило в силу дважды.

Например, используя PDO:

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

Этот ответ является излишним, но вы можете убедиться, что он выполняется дважды, включив двоичные журналы в вашем mysql (помните, overkill!). Затем вы можете использовать инструмент mysqllog для просмотра этих файлов и посмотреть, был ли запрос выполнен дважды.

Все считают, что где-то в вашем коде его дважды спрашивают 🙂 Я использую такой запрос, и он работает отлично. Другое дело, у меня есть класс-оболочка для моего объекта PEAR_DB. В случае запроса он может выводить запросы (и временные метки + трассировку стека), которые использовались при рендеринге текущей страницы. Я использую его для поиска повторяющихся запросов (например, ваших) и медленных обновлений.

Сначала вам нужно сделать правильный запрос:

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

Этот запрос должен работать должным образом. Может быть, вы получили ошибку в PHP-коде, и этот запрос выполняется два раза?

Вам просто нужно поставить скобки вокруг votes + 1 таких как:

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

Я мог бы также поставить LIMIT 1 в конце.

Кроме того, попытались запустить запрос за пределами вашего PHP, например, через PHPMyAdmin? Кроме того, попробуйте повторить ваш SQL в целом, прежде чем запускать его … вы можете просто найти ошибку.

Я просто создал таблицу базы данных для проверки этого запроса, я должен сказать, что он работает отлично на моей стороне.

choices UPDATE SET votes = (голосов +1) WHERE choice_id = '1'

Я думаю, что код, который будет выполняться дважды в вашем приложении, вы можете попробовать и распечатать sql при его запуске. Вы также можете запустить выведенный SQL-запрос из базы данных.

В заключение, оператор sql прекрасно выполняет двойные сценарии приложений.

Я просто догадываюсь, но, возможно, этот код выполняется один раз для каждого ресурса, используемого на странице? Поэтому, если у вас есть изображение или iframe, который использует один и тот же код, оба ресурса выполняют его один раз, в результате чего поле обновляется дважды.

У меня было это только на прошлой неделе в моем обработчике сеансов на основе PDO, мой счетчик тестов срабатывал дважды, потому что логотип сайта также обслуживался php, и я обновлял счетчик тестов в файле auto_prepend_file.