Проблема с обновлением поля MySQL с помощью PHP - PullRequest
2 голосов
/ 27 октября 2008

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

ОБНОВЛЕНИЯ выбора УСТАНОВИТЬ голосов = голосов + 1 ГДЕ choice_id = '$ user_choice'

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

РЕДАКТИРОВАТЬ : Спасибо за ответы, я использую обычный MySQL, без MySQLi или PDO. Еще одна вещь, которую я обнаружил, заключается в том, что при выполнении запроса он работает, когда вы начинаете с 0 и обновляете до 1, но после этого он идет 3, 5, 7, ...

Ответы [ 7 ]

4 голосов
/ 27 октября 2008

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

3 голосов
/ 27 октября 2008

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

В некоторых интерфейсах SQL в PHP создание оператора неявно выполняет SQL. Тогда у вас есть возможность получить результаты (если это был оператор SELECT). Если ваш оператор был SELECT или DELETE, скорее всего, никакого вреда не было, хотя выполнять оператор дважды не нужно. Однако если ваше заявление было УКАЗАНИЕМ или ОБНОВЛЕНИЕМ, вы можете обнаружить, что оно вступило в силу дважды.

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

$pdo = new PDO(...options...);
$stmt = $pdo->query('UPDATE ...'); // executes once
$stmt->execute(); // executes a second time
1 голос
/ 27 октября 2008

Может потребоваться заключить в скобки votes + 1, например:

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

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

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

1 голос
/ 27 октября 2008

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

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

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

1 голос
/ 27 октября 2008

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

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

0 голосов
/ 28 октября 2008

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

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

0 голосов
/ 28 октября 2008

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

ОБНОВЛЕНИЕ choices SET votes = (голосов +1) ГДЕ choice_id = '1'

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...