我的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>
最佳答案
由于用户不知道链接在文本文件中的顺序,因此如果您按顺序阅读所述链接,它们会显得“随机”(并且您可以在首次创建文件时打乱它们的顺序)。
所以你可以:
- 在 session 中保存最后看到的链接的索引
- 将链接索引链接到系统时间。这并不能防止重复,但可以保证没有两个链接是相同的,除非您在正确的时间后点击“刷新”。
方法一:
$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 变量 - 以免过早再次获取它们。
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 次删除时重新出现,就像上面的“4”(...4 1 4...);如果是这样,您至少在$nl
内再也见不到它了访问。
还有
- 您不应该使用
Header()
从内部<BODY>
标签。删除<BODY>
总共。 - 您不需要使用
exit()
如果您处于脚本的自然结尾:脚本将自行退出。
关于PHP随机链接不重复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12272050/