2010-01-15 3 views
1

У меня есть этот кусок кода, чтобы проверить, если пользователь уже создал учетную запись в последний час:проверить, если пользователь зарегистрирован в течение последнего часа

$result = mysql_query("SELECT * FROM accounts WHERE registration_ip = '$_SERVER[REMOTE_ADDR]' AND created > ".(time() - 3600)); 

if (mysql_num_rows($result) > 0) 
    exit('Blablal') 

Это не выход, как я хочу это сделать, я может сделать, сколько учетных записей я хочу.

Вы видите какую-либо поговорку? Мои таблицы и поля db верны.

+0

Что SQL вы используете для вставки строк в таблицу? –

+0

Почему? ничего страшного нет. он правильно вставляет учетные записи INSERT INTO (имя, пароль, registration_ip, созданный) VALUES ('$ username', '$ password', '$ ip_address', ".time().") – leon

ответ

0

Протестируйте его, удалив пункт registration_ip = '$_SERVER[REMOTE_ADDR]'.

0

Вопрос: Неточно ли ваш запрос sql AND created > ".(time() - 3600)); подходит для получения последнего часа. Вы хотите что-то вроде этого:

SELECT ... WHERE ... 
AND created > DATE_SUB(now(), INTERVAL 1 HOUR) 
+0

im сохранение моих дат как временные метки unix .. . – leon

0

Я испытал это на месте, и для меня, он ведет себя так, как ожидалось. Я бы сказал, что проблема не в вашем запросе, а в другом месте. Проверьте свои данные и убедитесь, что они вставлены, как ожидалось.

Кроме того, вы можете использовать SELECT COUNT для подсчета столбцов вместо SELECT * - это должно быть быстрее.


    $result = mysql_query("SELECT COUNT(*) FROM accounts WHERE registration_ip = '$_SERVER[REMOTE_ADDR]' AND created > ".(time() - 3600)); 

    $count = mysql_fetch_array($result); 
    if ($count[0] > 0) exit('BLAH'); 
0

Ответ Yada правильный. Единственный комментарий, который я сделал бы то, что вы убегаете $ _SERVER [REMOTE_ADDR] с помощью mysql_real_escape для защиты от SQL инъекции в шансе, что переменная получает переопределен

1

Ваша проблема, вероятно, это, $ _SERVER [REMOTE_ADDR]

Вы внедряете это непосредственно в строку с двумя кавычками. Когда вы хотите получить доступ к массиву в строке с двумя кавычками, вам нужно поместить доступ к массиву переменных в пару фигурных скобок.

Исправленная строка:

"SELECT * FROM счета WHERE registration_ip = '{$ _SERVER [' REMOTE_ADDR ']}' AND создано>" (время() - 3600)

Кроме того, во все дни цитаты. индексы, вы использовали REMOTE_ADDR вместо «REMOTE_ADDR» или «REMOTE_ADDR»

Надеюсь, это поможет.

+0

Вы можете встроить массив в строку без использования фигурных скобок.Кроме того, при ссылке на массив в анализируемой строке без фигурных скобок включение индекса в кавычки необязательно. См. Http://us3.php.net/manual/en/language.types.string.php#language.types.string.parsing - проверьте первый пример синтаксического анализа массива. – emmychan

0

Вам нужно использовать {} вокруг того, что вы встраиваете в SQL, который является PHP. Я думаю, что это должно сработать. Я всегда это делаю, поскольку нашел, что это экономит время отладки, поскольку оно, кажется, выскакивает несколько часто.

$result = mysql_query("SELECT COUNT(*) FROM accounts WHERE registration_ip = '{$_SERVER[REMOTE_ADDR]}' AND created > ".({time()} - 3600)); 

Если это не сработает, сохраните запрос в переменной, эхо на странице, чтобы увидеть, что он отправляет.

$sql = "SELECT COUNT(*) FROM accounts WHERE registration_ip = '{$_SERVER[REMOTE_ADDR]}' AND created > ".({time()} - 3600)"; 

echo $sql; 
1

я просто взял пробелы из прекрасно работает в настоящее время

registration_ip='$_SERVER[REMOTE_ADDR]' 
Смежные вопросы