Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737 Форумы портала PHP.SU :: Firefox и MySQL INSERT
Покинул форум
Сообщений всего: 114
Дата рег-ции: Сент. 2010
Помог: 2 раз(а)
Всем привет!
На одном из сайтов (написан на PHP) возникла необходимость вести статистику кликов по пунктам меню. Но есть одна проблема. Только в браузере Firefox и только при клике мышкой по пукте меню в таблицу записывается не одна строка а две одинаковые. В Опере и IE всё нормально - всталяется одна строка. Если в Firefox скопировать ссылку на пункт меню, вставить в адресную строку и нажать enter то вставляется одна строка.
Для дополнительной информации в таблицу добавил ещё одно поле и туда записываю микросекунды когда происходит запрос к базе. При дублировании строк в этом поле записывается время с разницей примерно 0,3-0,5 сек , тоисть происходит именно два отдельных запроса INSERT.
Может кто-то уже встречался с такой проблемой ?
----- Человек, сделавший синтаксический анализатор PHP на одном регулярном выражении, займет достойное место среди гениев. Качественный хостинг по доступной цене
OrmaJever
Отправлено: 25 Февраля, 2011 - 18:50:27
Активный участник
Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010 Откуда: Чернигов
Помог: 299 раз(а)
а как результаты в базу записываются?
----- Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
DeepVarvar
Отправлено: 25 Февраля, 2011 - 18:53:29
Активный участник
Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008 Откуда: Альфа Центавра
----- Человек, сделавший синтаксический анализатор PHP на одном регулярном выражении, займет достойное место среди гениев. Качественный хостинг по доступной цене
OrmaJever
Отправлено: 25 Февраля, 2011 - 19:14:39
Активный участник
Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010 Откуда: Чернигов
Помог: 299 раз(а)
Ну может фф отправляет 2 запроса на страницу вот оно2 раза и доабвляет. Нужно зделать проверку на время например.
----- Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
HotBird
Отправлено: 25 Февраля, 2011 - 19:16:53
Гость
Покинул форум
Сообщений всего: 114
Дата рег-ции: Сент. 2010
Помог: 2 раз(а)
Даже если добавить проверку на время, то где гарантия что другой пользователь в ту же секунду не нажмёт на тот же пункт ? (Добавление)
пункты меню оформлены в виде обычной ссылки <a href=""></a>
----- Человек, сделавший синтаксический анализатор PHP на одном регулярном выражении, займет достойное место среди гениев. Качественный хостинг по доступной цене
OrmaJever
Отправлено: 25 Февраля, 2011 - 20:00:29
Активный участник
Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010 Откуда: Чернигов
Помог: 299 раз(а)
HotBird пишет:
Даже если добавить проверку на время, то где гарантия что другой пользователь в ту же секунду не нажмёт на тот же пункт ?
Ну можно зделать проверку на сесиях. Это также будет мини антидосс, Каждый пользователь может обновить страницу не раньше через через 500-800мс.
HotBird пишет:
пункты меню оформлены в виде обычной ссылки <a href=""></a>
Я понимаю, просто возможно бразуер вначале посылает свой запрос проверить есть ли страница, отвечает ли сервер, а затем может берёт её ещё раз. Посмотрите в логах апача.
----- Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
ALEN
Отправлено: 25 Февраля, 2011 - 20:20:32
Участник
Покинул форум
Сообщений всего: 1459
Дата рег-ции: Авг. 2008 Откуда: Крым
Помог: 11 раз(а)
HotBird
А ты не хочешь перехватывать запросы и перенаправлять, ПС спокойно относятся вроде к редиректам на те же страницы.
Например:
Клиент жмет по ссылке, в самом начале кода проверяем совпадение реферальной ссылки с текущей, если они равны, то не защитывай. Просто загружай страницу.
Если они не равны, то делаешь соответствующую запись и отправляешь header("Location: на_этот_же_URL");
Champion
Отправлено: 25 Февраля, 2011 - 20:56:34
Активный участник
Покинул форум
Сообщений всего: 4350
Дата рег-ции: Авг. 2008 Откуда: Москва
Помог: 57 раз(а)
На firefox можно поставить firebug и посмотреть, почему он шлет 2 запроса. Вообще не должно такого быть.
ALEN
Отправлено: 25 Февраля, 2011 - 21:23:19
Участник
Покинул форум
Сообщений всего: 1459
Дата рег-ции: Авг. 2008 Откуда: Крым
Помог: 11 раз(а)
Champion
Я больше склонен к тому, что траблы в коде и фаерфокс тут не причем
HotBird
Отправлено: 25 Февраля, 2011 - 23:39:51
Гость
Покинул форум
Сообщений всего: 114
Дата рег-ции: Сент. 2010
Помог: 2 раз(а)
Проверил на тёх компютерах, всюду такой же результат с фаерфоксом.
Champion пишет:
На firefox можно поставить firebug и посмотреть, почему он шлет 2 запроса. Вообще не должно такого быть.
Да согласен что не может быть, но есть
Фаербаг у меня установлен и пользуюсь им часто, но как-то не обратил внимания на вкладку "Сеть" где явно видно что при клике по ссылке браузер посылает такие запросы:
URL | Статус | Домен | Размер | Время GET index.php?параметры | Aborted | mydomen.com | ? | 15ms
GET index.php?параметры | 200OK | mydomen.com | 8,4 KB | 250ms
Дальше загрузка джаваскриптов
Загрузка стилей
Загрузка картинок
Вы правы, он действительно посылает два запроса первый из которых почему-то Aborted, но обращение к странице произошло и как результат запись в базу произошла. Но почему фаерфокс это делает именно при клике мышкой по ссылке? Пробовал на нескольких других случайных сайтах, такого двойного запроса нет.
На моих двух других сайтах такого тоже не наблюдается.
Дальше начинаю соглашатся с ALEN что действительно причина получается в моём коде.
Но как узнать почему именно происходит этот первый запрос?
У меня подозрение на три причины:
1. HTML-код
2. Джава скрипты
3. Заголовки Last-Modified и Expires, возможно их надо использовать? (они у меня вообще не передаются)
(Добавление)
УРА!
Методом исключения нашёл причину. Виновата оказалась одна функция джаваскрипта. Дело в том что у меня пункты меню выводятся в ячейках таблицы внутри которой ссылка на опредилённую страницу, на каждую ячейку повешано событие onClick с вызовом функции и передачей ей в качестве параметра ссылки для перехода. Это сделано для того чтобы пользователь не заморачивался прицеливаясь именно на ссылку а мог кликнув по ячейке перейти по нужной ссылке. Так вот получается что если кликать по ссылке то срабатывает два перехода одновременно один по джаваскрипту другой по клику на ссылку, поскольку ссылка находится внутри ячейки, и клик поссылке так же считается кликом по ячейке.
----- Человек, сделавший синтаксический анализатор PHP на одном регулярном выражении, займет достойное место среди гениев. Качественный хостинг по доступной цене
Champion
Отправлено: 26 Февраля, 2011 - 09:19:15
Активный участник
Покинул форум
Сообщений всего: 4350
Дата рег-ции: Авг. 2008 Откуда: Москва
Помог: 57 раз(а)
Осатвь у ссылки href='#' и onclick у ячейки.
HotBird
Отправлено: 26 Февраля, 2011 - 11:29:59
Гость
Покинул форум
Сообщений всего: 114
Дата рег-ции: Сент. 2010
Помог: 2 раз(а)
Повтавил в конце ссылки после параметров #. Теперь при нажатии на ту ссылку на которй мы уже находимся не происходит обновление страницы - это конечно полезно, пожалуй так и оставлю. Но основной проблемы это не решило, при нажатии на другой пункт меню всёравно происходит два запроса.
Думаю тут как то надо по другому организовать джаваскрипт.
----- Человек, сделавший синтаксический анализатор PHP на одном регулярном выражении, займет достойное место среди гениев. Качественный хостинг по доступной цене
ALEN
Отправлено: 26 Февраля, 2011 - 14:31:19
Участник
Покинул форум
Сообщений всего: 1459
Дата рег-ции: Авг. 2008 Откуда: Крым
Помог: 11 раз(а)
HotBird
Как бы, PHP - выполняется на стороне сервера. Это не html чтоб в каждом браузере было по разному. Чем тебе не нравится способ организации твоей задачи моим примером??
ALEN пишет:
Клиент жмет по ссылке, в самом начале кода проверяем совпадение реферальной ссылки с текущей, если они равны, то не защитывай. Просто загружай страницу.
Если они не равны, то делаешь соответствующую запись и отправляешь header("Location: на_этот_же_URL");
HotBird
Отправлено: 26 Февраля, 2011 - 17:55:47
Гость
Покинул форум
Сообщений всего: 114
Дата рег-ции: Сент. 2010
Помог: 2 раз(а)
ALEN пишет:
Чем тебе не нравится способ организации твоей задачи моим примером??
Спасибо, за подсказку, но этот метод не подходит.
1. Он не решает основной проблемы, два запроса всёравно будут отправлятся.
2. Увеличит нагрузку на сервер в следствии частого перенапрвления на самого себя.
3. Допустим отправился первый запрос, сработало условие что реф. ссылка с текущей не равны, сделал запись, перенаправился на самого себя. В это время приходит другой запрос который не знает о существовании первого и сценарий повторяется. В результате вместо двух запросов сервер обработает четыре.
Как бы мне намного лучше получается исправить свой джава скрипт чтобы по-нормальному отправлялся один запрос.
----- Человек, сделавший синтаксический анализатор PHP на одном регулярном выражении, займет достойное место среди гениев. Качественный хостинг по доступной цене
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.