Update выполняется дважды

foter

Новичок
Update выполняется дважды

Есть таблица, хранящая параметры отображения рекламы. Поле advertising_show_current типа int содержит счетчик показов баннера.

При вызове из командной строки sql:

UPDATE advertising SET advertising_show_current=advertising_show_current+1;

все работает корректно.

Но как только начинаю вызывать из скрипта php:

mysql_query( "UPDATE advertising SET advertising_show_current=advertising_show_current+1" );

к значению поля прибавляется не 1, а 2 (если вместо 1, добавлять 5, то добавится 10)... т.е. комманда выполняется как бы 2 раза.


Может кто сталкивался с подобным полтергейстом? Помогите. :confused:
 

zerkms

TDD infected
Команда форума
значит запрос выполняется дважды. вариантов может быть тонна.
для начала - загляни в лог запросов апача и убедись, что и вправду пришло 2 http-запроса от клиента.
 

foter

Новичок
В логах вот что пишет:

127.0.0.1 - - [24/Apr/2009:12:21:40 +0300] "GET /123.php HTTP/1.1" 200 5
127.0.0.1 - - [24/Apr/2009:12:21:41 +0300] "GET /favicon.ico HTTP/1.1" 404 5
 

zerkms

TDD infected
Команда форума
foter
если http-запрос, в результате которого выполняется этот скрипт, один - значит просто у тебя дважды выполняется этот участок кода. как он у тебя оформлен - никто не знает.
phpfaq.ru/debug <--- панацея.
 

foter

Новичок
специально создал файл, в котором только две строки: эта и подключение к бд перед ней.
 

Фанат

oncle terrible
Команда форума
foter
так вот же тебе ве в логах написано.
зачем ты выполняешь код вставки в базу при любом запросе сервера?
 

foter

Новичок
Что-то я туплю конкретно.

У меня есть файл 123.php

<?php
mysql_connect("localhost", "root", "");
mysql_select_db("dbname");

mysql_query( "UPDATE advertising SET advertising_show_current=advertising_show_current+1" );

?>

в браузере набираю: http://sitename/123.php


*****, каким образом он выпоняется 2 раза? Или что ты имел ввиду "выполняешь код при любом запросе сервера"?
 

zerkms

TDD infected
Команда форума
у тебя в браузере значит установлено какое-то расширение, которое его и вправду запрашивает дважды

telnet localhost 80


GET /123.php HTTP/1.1
Host: localhost
<enter><enter>

и смотри в базу
 

prolis

Новичок
а 404 ошибка кем обрабатывается, не index.php, в котором остались строки с апдейтом?
 

foter

Новичок
Автор оригинала: prolis
а 404 ошибка кем обрабатывается, не index.php, в котором остались строки с апдейтом?
Хм, убрал index.php, оставив только 123.php - стало нормально работать
 

zerkms

TDD infected
Команда форума
*****
после того как человек сказал, что запрашивает единственный файл с именем 123.php - нет.
я почему-то подумал, что файл единственный в директории. по крайней мере я для чистоты эксперимента всегда всё лишнее отовсюду сношу.
 

foter

Новичок
Спасибо всем, кто помог разобраться с проблемой (по крайней мере я теперь понимаю, от-куда у нее ноги растут).

-~{}~ 24.04.09 18:41:

А теперь "вторая часть марлезонского балета".

Все тот же "UPDATE advertising SET advertising_show_current=advertising_show_current+1;" но уже в index.php, а также человекопонятные урлы, реализованные по механизму "HTTP/1.1 200 OK".

В обычных условиях все работает нормально: при обнаружении несуществующей страницы происходит перенаправление на index.php (ErrorDocument 404 /index.php).
index.php выводит содержимое страницы и прибавляет 1 к счетчику показов баннера (update).

Но что происходит, если сервер вдруг не находит какой-либо файл (картинку например). По команде http://sitename/123 - сервер выдает index.php. Далее передает все картинки, но... дойдя до несуществующей (что приводит к ошибке 404) - опят перекидывает на index.php.
Таким образом счетчик показов увеличивается уже не на 1, а на 1+(количество ненайденных файлов).

Что делать?
 

admLoki

Новичок
Поднять повыше участок с хендлингом 404 ошибки. Либо предоставить хендлинг отдельному скрипту, например, 404.php.
 

weregod

unserializer
foter
выяснить, как отличить index.php, запрошенный как index.php, от index.php, запрошенный как 123 и ему подобных
 
Сверху