2

私のPHPは貧弱ですが、改善するために最善を尽くしています!!

テキスト ファイル リストからランダムな html ページをロードする、非常に単純な php スクリプトをコーディングしようとしています。

人々が html ページを表示すると、random.php ファイルにリンクし、別のページが読み込まれます... これは永遠に続く可能性があります。

定期的にページを追加するので、テキスト ファイル リストを使用しています。私の問題は、私のコードには繰り返しの訪問を防ぐ場所がないことです!! 現在、私は約8個のリンクしか持っていません.1回以上、同じリンクが「ランダムに」3回続けて表示されました:(繰り返しを防ぐためにこれに追加できる簡単なものがあることを願っています.すべてのリンクが表示された後、リセットされます。ありがとうございます :)

    <body>

    <?php
    $urlist=file("randomlinks.txt");
    $nl=count($urlist);
    $np=rand(0,$nl-1);
    $url=trim($urlist[$np]);
    header("Location: $url");
    exit;
    ?>

    </body>
4

3 に答える 3

2

ユーザーはテキスト ファイル内のリンクの順序がわからないため、リンクを順番に読むと「ランダム」に見えます (最初にファイルを作成するときにそれらをシャッフルできます)。

だからあなたはできる:

  • 最後に見たリンクのインデックスをセッションに保存する
  • リンク インデックスをシステム時間にリンクします。これは繰り返しを防ぐものではありませんが、正確に適切な時間の後に「更新」を押さない限り、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");

もう 1 つの方法は、最後に表示された 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']));

1、2、3、4、5 の 5 つの URL がある場合、次のようになります。

1 5 3 4 2 1 4 2 5 3 1 2 3 5 4 1 4 3 2 5 1 4 ...

...リストはN-1ランダムです:-)、すべてのリンクは同じ頻度で表示され、同じリンクは上記の「4」(...4 1 4.. .); もしそうなら、少なくとも$nl訪問のために二度とそれを見ることはありません。

また

  1. Header()タグ内から使用しないでください<BODY>。まるごと取り除き<BODY>ます。
  2. スクリプトの自然な終わりにいる場合は、使用する必要はありませんexit()。スクリプトは自動的に終了します。
于 2012-09-04T22:24:37.467 に答える
1

私が考えることができる最も簡単な方法は、クッキーを使用することです。

インターネットには、次のようなチュートリアルがたくさんあります: 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 */
?>
于 2012-09-04T22:16:52.533 に答える
1

これを行うには、PHP セッションを使用します。この例を見てください。

使用可能なページの配列をセッション変数に格納します。ページを取得するたびに、そのページを配列から削除します。配列が空になったら、元のソースから再度リセットします。

コードは次のようになります。

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"));
于 2012-09-04T22:42:52.023 に答える