我的PHP很差,但我正在努力改进!
我正在尝试编写一个非常简单的PHP脚本,从文本文件列表中加载一个随机的html页面。
一旦人们查看了html页面,他们会链接回random.php文件并加载另一个页面......这可以永远继续下去。
我正在使用文本文件列表,因为我会定期添加更多页面。我的问题是我的代码中没有防止重复访问的地方!现在我只有大约8个链接,并且不止一次我有相同的链接'随机'连续3次出现:(希望有一些简单的东西我可以添加到此以防止重复,如果所有链接都已被查看,然后重置。非常感谢:)
<body>
<?php
$urlist=file("randomlinks.txt");
$nl=count($urlist);
$np=rand(0,$nl-1);
$url=trim($urlist[$np]);
header("Location: $url");
exit;
?>
</body>
答案 0 :(得分:2)
由于用户不知道链接在文本文件中的顺序是什么,如果您按顺序读取所述链接,它们看起来会“随机”(并且您可以在首次创建文件时将它们随机播放)。
所以你可以:
方法1:
$urlist=file("randomlinks.txt");
$nl=count($urlist);
session_start();
if (!isset($_SESSION['link'])) // If link is not in session
$_SESSION['link'] = 0; // Start from 0 (the first)
$np = $_SESSION['link']++; // Next time will use next
$_SESSION['link'] %= $nl; // Start over if nl exceeded
$url=trim($urlist[$np]);
Header("Location: $url");
方法2:
...
$nl=count($urlist);
$np = time() % $nl; // Get number of seconds since the Epoch,
// extract modulo $nl obtaining a number that
// cycles between 0 and $nl-1, every $nl seconds
$url=trim($urlist[$np]);
Header("Location: $url");
另一种方法是记住看到的最后N个链接 - 但为此,你需要一个会话变量 - 以免过早地再次获取它们。
session_start();
if (!isset($_SESSION['urlist'])) // Do we know the user?
$_SESSION['urlist'] = array(); // No, start with empty list
if (empty($_SESSION['urlist'])) // Is the list empty?
{
$_SESSION['urlist'] = file("randomlinks.txt"); // Fill it.
$safe = array_pop($_SESSION['urlist']);
shuffle($_SESSION['urlist']); // Shuffle the list
array_push($_SESSION['urlist'], $safe);
}
$url = trim(array_pop($_SESSION['urlist']));
如果你有五个URL 1,2,3,4和5,你可能会得到:
1 5 3 4 2 1 4 2 5 3 1 2 3 5 4 1 4 3 2 5 1 4 ...
...列表是N-1随机:-),所有链接的频率相同,并且同一链接最多可以在2-remove处重新出现,如上面的“4”(... 4 1 4 ...);如果确实如此,至少$nl
次访问,您再也不会再看到它了。
同时强>
Header()
标记内使用<BODY>
。完全删除<BODY>
。exit()
:脚本将自行退出。答案 1 :(得分:1)
我能想到的最简单的方法就是使用cookie。
互联网上有很多教程,如下所示: http://www.w3schools.com/php/php_cookies.asp
例如:
<?php
if (isset($_COOKIE["vistList"]))
$visited = split(","$_COOKIE["visitList"]);
foreach ($visited as &$value) {
if ($value == /* new site url */) {
//Find a new one
}
}
else
$expire=time()+60*60*24*30;
setcookie("vistList", "List-of-visited-URLs, separated-by-commas", $expire);
?>
我没有机会测试这段代码,但希望它可以给你一些想法。
如评论中所述,使用php会话可以完成同样的事情:
<?php
session_start();
if (isset($_SESSION["vistList"]))
$visited = split(","$_SESSION["visitList"]);
foreach ($visited as &$value) {
if ($value == /* new site url */) {
//Find a new one
}
}
else
$_SESSION['vistList']=/* new site URL */
?>
答案 2 :(得分:1)
我会使用PHP会话来执行此操作。看看this example。
在会话变量中存储可用页面数组。每次获得页面时,都会从阵列中删除该页面。当数组为空时,您将从原始源重新重置它。
以下是您的代码的外观:
session_start();
if (empty($_SESSION["pages"]))
$_SESSION["pages"] = file("randomlinks.txt");
$nl = count($_SESSION["pages"]);
$np = mt_rand(0, $nl-1);
// get the page, remove it from the array, and shift all higher elements down:
list($url) = array_splice($_SESSION["pages"], $page, 1);
die(header("Location: $url"));