我有这段代码来检查用户是否在过去一小时内创建了一个帐户:
$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 :(得分:1)
你的问题可能是这个,$ _SERVER [REMOTE_ADDR]
您将其直接嵌入双引号字符串中。如果要在双引号字符串中访问数组,则需要将变量数组访问放在一对花括号中。
更正后的字符串:
“SELECT * FROM accounts WHERE registration_ip ='{$ _SERVER ['REMOTE_ADDR']}'并创建>”。(time() - 3600)
另外,总是引用索引,你使用了REMOTE_ADDR而不是'REMOTE_ADDR'或“REMOTE_ADDR”
希望这有帮助。
答案 1 :(得分:1)
我现在把这些空间搞得很好
registration_ip='$_SERVER[REMOTE_ADDR]'
答案 2 :(得分:0)
通过删除registration_ip = '$_SERVER[REMOTE_ADDR]'
子句来测试它。
答案 3 :(得分:0)
此外,您的SQL查询AND created > ".(time() - 3600));
无法获得最后一小时。
你想要这样的东西:
SELECT ... WHERE ...
AND created > DATE_SUB(now(), INTERVAL 1 HOUR)
答案 4 :(得分: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');
答案 5 :(得分:0)
亚达的回答是正确的。我要做的唯一其他评论是你使用mysql_real_escape转义$ _SERVER [REMOTE_ADDR]来防止SQL注入,因为变量被覆盖的可能性很小
答案 6 :(得分:0)
您需要在嵌入到PHP的SQL中使用{}。我认为这应该有效。我总是这样做,因为我发现它节省了我的时间调试,因为它似乎经常弹出。
$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;