我需要帮助修复此代码

时间:2015-07-17 16:08:04

标签: php mysql session

所以,我制作了一个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,并且延迟时间也没有通过。

代码有什么问题?

1 个答案:

答案 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();
}

现在,如果你看一下,你会发现有两件事要先检查:

  1. $_SESSION['records']是否为空(可能会在第二页上没有初始化会话?) - var_dump ($_SESSION['records']) - 那里有什么?
  2. ($now->getTimestamp()-$_SESSION['records'][$id])的结果是什么以及$waiting_time变量中的内容 - var_dump it
  3. 在转储代码之后和重定向之前忘记给exit()忘记,或者只是评论location ()行,否则你什么也看不见

    第三种可能性(如果您没有看到var_dump打印输出就知道这种情况)是您的浏览器记得301重定向,当您第二次到同一地址时,它会自动重定向而不会调用您的脚本 - 重新启动浏览器或尝试不同的浏览器。