所以,我制作了一个PHP页面/链接检查器,如果上次访问/重定向的某些分钟没有通过,则不允许用户访问/重定向到页面。
问题是,即使用户已在1分钟前完成并且计时器为7分钟(例如),用户也会被重定向到页面。计时器以分钟为单位设置为MySQL。
无法弄清楚代码中的错误
这是第一页:
<?php
session_start();
$sql = "SELECT * FROM table_records";
$result = mysql_query($sql);
$records = array();
while ($row = mysql_fetch_assoc($result)) {
$records[] = $row;
}
foreach ($records as $record) {
$now = new DateTime();
if (!array_key_exists($record, $_SESSION['records']) || ($now->getTimestamp()-$_SESSION['records'][$record]) <= 600) {
echo "<td><center>".$record['id']."</center></td>";
echo "<td><center>".$record['name']."</center></td>";
echo "<td><center>".$record['link']."</center></td>";
echo "<td><center>".$record['delay']."</center></td>";`
} else {
// link disabled
}
}
?>
这是用户被重定向到的页面,用于检查计时器,以及将它们重定向到链接。
$waiting_time = $delay * 60; //calculate delay time in seconds
if (!array_key_exists($id, $_SESSION['records'])) {
$_SESSION['records'][$id] = $now->getTimestamp();
header("Location: $link");
exit();
} elseif (array_key_exists($id, $_SESSION['records']) && ($now->getTimestamp()-$_SESSION['records'][$id]) >= $waiting_time) {
echo "Looks like you already visited this page";
} elseif (array_key_exists($id, $_SESSION['records']) && ($now->getTimestamp()-$_SESSION['records'][$id]) < $waiting_time) {
$_SESSION['records'][$id] = $now->getTimestamp();
header("Location: $link");
exit();
}
问题是,即使用户已经访问过,用户也会被重定向到$ link,并且延迟时间也没有通过。
代码有什么问题?
答案 0 :(得分:0)
DRY,您可以更轻松地编写if / elseif语句:
if (array_key_exists($id, $_SESSION['records']) && ($now->getTimestamp()-$_SESSION['records'][$id]) < $waiting_time) {
echo "Looks like you already visited this page";
} else {
$_SESSION['records'][$id] = $now->getTimestamp();
header("Location: $link");
exit();
}
现在,如果你看一下,你会发现有两件事要先检查:
$_SESSION['records']
是否为空(可能会在第二页上没有初始化会话?) - var_dump ($_SESSION['records'])
- 那里有什么?($now->getTimestamp()-$_SESSION['records'][$id])
的结果是什么以及$waiting_time
变量中的内容 - var_dump it 在转储代码之后和重定向之前忘记给exit()
忘记,或者只是评论location ()
行,否则你什么也看不见
第三种可能性(如果您没有看到var_dump打印输出就知道这种情况)是您的浏览器记得301重定向,当您第二次到同一地址时,它会自动重定向而不会调用您的脚本 - 重新启动浏览器或尝试不同的浏览器。