Запретить пользователям повторное нажатие на ссылки - PullRequest
2 голосов
/ 20 июля 2011

Когда вы нажимаете на данную ссылку, она загружает страницу, которая выполняет вызов хранимой процедуры. Если вызов хранимой процедуры занимает больше нескольких секунд, люди снова начинают щелкать ссылку. Если они нажимают на ссылку дюжину раз, я вижу дюжину запросов, запущенных в базе данных. Последний запрос является единственным, который возвращает что-либо пользователю, но остальные 11 выполняются до завершения при использовании ресурсов.

Каков наилучший способ предотвратить это? Есть ли способ остановить это на уровне базы данных или это проблема интерфейса? Это результат того, как я устанавливаю соединения с базой данных с помощью PHP?

Ответы [ 3 ]

7 голосов
/ 20 июля 2011

Лично я бы решил проблему с интерфейсом - причина, по которой пользователи нажимают несколько раз, заключается не в том, что пользователи ошибаются, а в том, что ваш сайт ничего не сообщает о том, что он пытается сделать. Рассмотрите возможность установки ссылки на отключенный onclick, возможно, отображая какую-то загрузочную анимацию, а затем повторно включите ссылку, как только вы получите обратный вызов с данными. Таким образом, пользовательский интерфейс всегда отображает внутреннее состояние, а также не позволяет пользователям ставить в очередь кучу запросов!

1 голос
/ 20 июля 2011

используйте что-то вроде jQuery BlockUI Plugin , чтобы заблокировать страницу во время обработки запроса.Это дает вашим пользователям уверенность в том, что что-то происходит, и предотвращает их повторный щелчок.

1 голос
/ 20 июля 2011

Одним из решений может быть отключение ссылки на время выполнения запроса. Вы можете сделать это с помощью некоторого локального JavaScript, который обновляет текущую страницу или переключиться на другую страницу, на которой вообще нет ссылки - все зависит от дизайна вашего сайта.

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

if (!callingProcedure)
{
    callingProcedure = true;
    call procedure
}

Затем, когда процедура возвращает сброс callingProcedure в false.

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

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