Если заявление, переменные сессий - PullRequest
1 голос
/ 22 января 2012

Следующий код находится внутри вызова ajax.Я пытаюсь убедиться, что люди не голосуют по вопросам с определенным идентификатором слишком часто, используя сессии.

Поэтому они нажимают кнопку, которая выполняет следующий код php:

  $id=$_GET["id"];


if ((isset($_SESSION["$id"]) && ((time() - $_SESSION["$id"]) > 180)) || (!isset($_SESSION["$id"]))) {
    // last vote was more than 3 minutes ago
    $_SESSION["$id"] = time(); // update/create vote time stamp


    //there is code here to add the vote to the database
}
else{
echo "sorry, you've already voted recently";
}

Так что я создаю переменную сеанса для каждого идентификатора вопроса, который содержит time() их последнего голосованияЯ бы сделал это с файлами cookie, но их можно отключить.

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

Может кто-нибудь увидеть ошибку, которую я сделал?

Ответы [ 4 ]

2 голосов
/ 22 января 2012
  1. использование сессий для предотвращения многократного голосования имеет мало смысла.
  2. сеансы используют куки с теми же недостатками
  3. в отличие от строк, переменные в PHP должны указываться без кавычек.такое ложное использование БУДЕТ однажды вызвать ошибку.
  4. Я не вижу смысла проверять isset($_SESSION[$id]) дважды.
  5. В PHP была ошибка, которая запрещала числовые индексы для массива $ _SESSION.Не знаю, исправлено ли это в настоящее время.
  6. Как было отмечено Саджидом, вы должны вызывать session_start () перед использованием массива $ _SESSION.

теперь для логики.
мне кажется, что код вообще никому не позволит голосовать.так как он не пройдет условие isset($_SESSION[$id]) в первый раз и не позволит установить $_SESSION[$id] и так далее.

Кажется, правильное условие будет

if ( (!isset($_SESSION['vote'][$id]) OR (time() - $_SESSION['vote'][$id]) > 180) ) 
1 голос
/ 22 января 2012

Вам необходимо вызвать session_start () , чтобы начать сеанс перед отправкой заголовков. В противном случае сеансы не будут включены, если не включен параметр ini для автоматического запуска сеансов. Кроме того, ваш сервер должен быть правильно настроен, чтобы иметь возможность хранить файлы сеансов (обычно требуется доступный для записи каталог tmp). Подробнее о сессиях здесь: http://www.php.net/manual/en/ref.session.php

0 голосов
/ 22 января 2012

Возможно, проблема с оператором if. Попробуйте следующее

$id=$_GET["id"];


if (((isset($_SESSION[$id]) && ((time() - $_SESSION[$id]) > 180))) || (!isset($_SESSION[$id]))) {
    // last vote was more than 3 minutes ago
    $_SESSION[$id] = time(); // update/create vote time stamp


    //there is code here to add the vote to the database
}
else{
    echo "sorry, you've already voted recently";
}
0 голосов
/ 22 января 2012

Возможно time () возвращает миллисекунды, и вы должны сравнить с 180000 вместо 180.

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