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

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (2): [1] 2 »   

> Описание: дублируются строки при использоании INSERT
HotBird
Отправлено: 25 Февраля, 2011 - 18:47:25
Post Id



Гость


Покинул форум
Сообщений всего: 114
Дата рег-ции: Сент. 2010  


Помог: 2 раз(а)




Всем привет!
На одном из сайтов (написан на PHP) возникла необходимость вести статистику кликов по пунктам меню. Но есть одна проблема. Только в браузере Firefox и только при клике мышкой по пукте меню в таблицу записывается не одна строка а две одинаковые. В Опере и IE всё нормально - всталяется одна строка. Если в Firefox скопировать ссылку на пункт меню, вставить в адресную строку и нажать enter то вставляется одна строка.
Для дополнительной информации в таблицу добавил ещё одно поле и туда записываю микросекунды когда происходит запрос к базе. При дублировании строк в этом поле записывается время с разницей примерно 0,3-0,5 сек , тоисть происходит именно два отдельных запроса INSERT.
Может кто-то уже встречался с такой проблемой ?


-----
Человек, сделавший синтаксический анализатор PHP на одном регулярном выражении, займет достойное место среди гениев.
Качественный хостинг по доступной цене
 
 Top
OrmaJever
Отправлено: 25 Февраля, 2011 - 18:50:27
Post Id



Активный участник


Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010  
Откуда: Чернигов


Помог: 299 раз(а)




а как результаты в базу записываются?


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
DeepVarvar Супермодератор
Отправлено: 25 Февраля, 2011 - 18:53:29
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




Код дайте..
 
 Top
HotBird
Отправлено: 25 Февраля, 2011 - 19:00:49
Post Id



Гость


Покинул форум
Сообщений всего: 114
Дата рег-ции: Сент. 2010  


Помог: 2 раз(а)




PHP:
скопировать код в буфер обмена
  1. $query="INSERT INTO `clicks` SET
  2.                         `time`='".microtime()."',
  3.                         `folder`=(SELECT folder FROM menu_items WHERE id_folder=".$id_folder." LIMIT 0,1),
  4.                         `sub_folder`=(SELECT sub_folder FROM menu_items WHERE id_sub_folder=".$id_sub_folder." LIMIT 0,1),
  5.                         `section`=(SELECT section FROM menu_items WHERE id_section=".$id_section." LIMIT 0,1),
  6.                         `id_cat`='".$id_cat."',
  7.                         `id_folder`='".$id_folder."',
  8.                         `id_sub_folder`='".$id_sub_folder."',
  9.                         `id_section`='".$id_section."'";
  10.         mysql_query($query,$link) or die (mysql_error());


-----
Человек, сделавший синтаксический анализатор PHP на одном регулярном выражении, займет достойное место среди гениев.
Качественный хостинг по доступной цене
 
 Top
OrmaJever
Отправлено: 25 Февраля, 2011 - 19:14:39
Post Id



Активный участник


Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010  
Откуда: Чернигов


Помог: 299 раз(а)




Ну может фф отправляет 2 запроса на страницу вот оно2 раза и доабвляет. Нужно зделать проверку на время например.


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
HotBird
Отправлено: 25 Февраля, 2011 - 19:16:53
Post Id



Гость


Покинул форум
Сообщений всего: 114
Дата рег-ции: Сент. 2010  


Помог: 2 раз(а)




Даже если добавить проверку на время, то где гарантия что другой пользователь в ту же секунду не нажмёт на тот же пункт ?
(Добавление)
пункты меню оформлены в виде обычной ссылки <a href=""></a>

(Отредактировано автором: 25 Февраля, 2011 - 19:19:54)



-----
Человек, сделавший синтаксический анализатор PHP на одном регулярном выражении, займет достойное место среди гениев.
Качественный хостинг по доступной цене
 
 Top
OrmaJever
Отправлено: 25 Февраля, 2011 - 20:00:29
Post Id



Активный участник


Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010  
Откуда: Чернигов


Помог: 299 раз(а)




HotBird пишет:
Даже если добавить проверку на время, то где гарантия что другой пользователь в ту же секунду не нажмёт на тот же пункт ?

Ну можно зделать проверку на сесиях. Это также будет мини антидосс, Каждый пользователь может обновить страницу не раньше через через 500-800мс.
HotBird пишет:
пункты меню оформлены в виде обычной ссылки <a href=""></a>

Я понимаю, просто возможно бразуер вначале посылает свой запрос проверить есть ли страница, отвечает ли сервер, а затем может берёт её ещё раз. Посмотрите в логах апача.

(Отредактировано автором: 25 Февраля, 2011 - 20:01:19)



-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
ALEN
Отправлено: 25 Февраля, 2011 - 20:20:32
Post Id



Участник


Покинул форум
Сообщений всего: 1459
Дата рег-ции: Авг. 2008  
Откуда: Крым


Помог: 11 раз(а)




HotBird
А ты не хочешь перехватывать запросы и перенаправлять, ПС спокойно относятся вроде к редиректам на те же страницы.

Например:
Клиент жмет по ссылке, в самом начале кода проверяем совпадение реферальной ссылки с текущей, если они равны, то не защитывай. Просто загружай страницу.
Если они не равны, то делаешь соответствующую запись и отправляешь header("Location: на_этот_же_URL");
 
 Top
Champion Супермодератор
Отправлено: 25 Февраля, 2011 - 20:56:34
Post Id



Активный участник


Покинул форум
Сообщений всего: 4350
Дата рег-ции: Авг. 2008  
Откуда: Москва


Помог: 57 раз(а)




На firefox можно поставить firebug и посмотреть, почему он шлет 2 запроса. Вообще не должно такого быть.
 
 Top
ALEN
Отправлено: 25 Февраля, 2011 - 21:23:19
Post Id



Участник


Покинул форум
Сообщений всего: 1459
Дата рег-ции: Авг. 2008  
Откуда: Крым


Помог: 11 раз(а)




Champion
Я больше склонен к тому, что траблы в коде и фаерфокс тут не причем
 
 Top
HotBird
Отправлено: 25 Февраля, 2011 - 23:39:51
Post Id



Гость


Покинул форум
Сообщений всего: 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 с вызовом функции и передачей ей в качестве параметра ссылки для перехода. Это сделано для того чтобы пользователь не заморачивался прицеливаясь именно на ссылку а мог кликнув по ячейке перейти по нужной ссылке. Так вот получается что если кликать по ссылке то срабатывает два перехода одновременно один по джаваскрипту другой по клику на ссылку, поскольку ссылка находится внутри ячейки, и клик поссылке так же считается кликом по ячейке.

Надо завтра подумать как переделать.

(Отредактировано автором: 26 Февраля, 2011 - 00:21:13)



-----
Человек, сделавший синтаксический анализатор PHP на одном регулярном выражении, займет достойное место среди гениев.
Качественный хостинг по доступной цене
 
 Top
Champion Супермодератор
Отправлено: 26 Февраля, 2011 - 09:19:15
Post Id



Активный участник


Покинул форум
Сообщений всего: 4350
Дата рег-ции: Авг. 2008  
Откуда: Москва


Помог: 57 раз(а)




Круто Осатвь у ссылки href='#' и onclick у ячейки.
 
 Top
HotBird
Отправлено: 26 Февраля, 2011 - 11:29:59
Post Id



Гость


Покинул форум
Сообщений всего: 114
Дата рег-ции: Сент. 2010  


Помог: 2 раз(а)




Повтавил в конце ссылки после параметров #. Теперь при нажатии на ту ссылку на которй мы уже находимся не происходит обновление страницы - это конечно полезно, пожалуй так и оставлю. Но основной проблемы это не решило, при нажатии на другой пункт меню всёравно происходит два запроса.
Думаю тут как то надо по другому организовать джаваскрипт.


-----
Человек, сделавший синтаксический анализатор PHP на одном регулярном выражении, займет достойное место среди гениев.
Качественный хостинг по доступной цене
 
 Top
ALEN
Отправлено: 26 Февраля, 2011 - 14:31:19
Post Id



Участник


Покинул форум
Сообщений всего: 1459
Дата рег-ции: Авг. 2008  
Откуда: Крым


Помог: 11 раз(а)




HotBird
Как бы, PHP - выполняется на стороне сервера. Это не html чтоб в каждом браузере было по разному. Чем тебе не нравится способ организации твоей задачи моим примером??

ALEN пишет:
Клиент жмет по ссылке, в самом начале кода проверяем совпадение реферальной ссылки с текущей, если они равны, то не защитывай. Просто загружай страницу.
Если они не равны, то делаешь соответствующую запись и отправляешь header("Location: на_этот_же_URL");
 
 Top
HotBird
Отправлено: 26 Февраля, 2011 - 17:55:47
Post Id



Гость


Покинул форум
Сообщений всего: 114
Дата рег-ции: Сент. 2010  


Помог: 2 раз(а)




ALEN пишет:
Чем тебе не нравится способ организации твоей задачи моим примером??

Спасибо, за подсказку, но этот метод не подходит.
1. Он не решает основной проблемы, два запроса всёравно будут отправлятся.
2. Увеличит нагрузку на сервер в следствии частого перенапрвления на самого себя.
3. Допустим отправился первый запрос, сработало условие что реф. ссылка с текущей не равны, сделал запись, перенаправился на самого себя. В это время приходит другой запрос который не знает о существовании первого и сценарий повторяется. В результате вместо двух запросов сервер обработает четыре.

Как бы мне намного лучше получается исправить свой джава скрипт чтобы по-нормальному отправлялся один запрос.


-----
Человек, сделавший синтаксический анализатор PHP на одном регулярном выражении, займет достойное место среди гениев.
Качественный хостинг по доступной цене
 
 Top
Страниц (2): [1] 2 »
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« SQL и Архитектура БД »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB