3

たくさんの引用を含むデータベースがあり、"Quote of the Day"ページを作成したいと考えています。基本的な考え方は、データベースからすべての引用を取得し、これを配列に配置して、配列内のランダムなインデックス番号で引用をエコーすることです。

これは、実装する必要のある基本的な考え方であり、もちろんこれまで説明してきました。問題は、ページが更新されるたびに新しい引用がポップアップすることです。これは私が望むものではありません。

私はページが(または別の時間にのみ)引用を更新することを望んでいますが、それはポイントではありません.0:00

誰かが私を正しい方向に向けることができますか?

4

8 に答える 8

5

これは非常に複雑に聞こえます。このようなことを行う通常の方法は次のようになります

  • 見積もりをデータベースに保存します。各行に日付を与える
  • リクエストごとに、データベースから当日の見積もりを取得して表示します。

データベースで日付を指定したくない場合は、スクリプトで開始日 (たとえば、今日の日付など) をハードコーディングし、それに応じて見積もりを取得することもできます。つまり、今日、最初の日付を取得します。データベースの行; 明日、2番目など。

于 2012-08-12T16:11:50.033 に答える
4

最終的なコードは次のようになります。データベース内の各見積もりには、表示する日 (0 ~ 365) として「日」フィールドがあります。

<?php
$query = $pdo->prepare("SELECT * FROM `quotes` WHERE `day` = ?");
$query->execute(date("z", strtotime("today")));

$row = $query->fetch();
echo $row['quote'];
?>
于 2012-08-12T16:15:13.923 に答える
3

日付を RNG シードとして使用すると、毎日更新されます :)

ここにいくつかのコードがあります:

mt_srand(date('dmY')); //Sets mt_rand seed to date.
$displayno = mt_rand(0, $total_quotes); //Generates random number with that seed, and the amount of quotes.
display_quote($displayno); //Pre-defined function that gets quote from database, and displays it.

編集:私がテストしたとき、これは完全に機能しました。(http://pi.berboe.co.uk/stacks.php は実用的な例です。毎日 1 回、0 から 200 の間の乱数を選択します。)

これは、$total_quotes が以前に設定されていることを前提としており、見積もりデータベース内のエントリの量です。

于 2012-08-12T16:12:11.680 に答える
3

これは一見したように簡単ではないかもしれません。

365 件の見積もりがあり、この数が変わらないとしましょう。簡単に言えば、毎日 1 件を使用できます。したがって、必要なのは、その年の日付を取得するアルゴリズムだけです。これは、データベースから引き出す行の ID になります。たとえば、2 月 1 日はデータベースの 32 日です -> その見積もりに行きます。

2000 件の見積もりがあり、その数が変わる可能性があるとしましょう -> どのように処理しますか? あなたのアプローチは何ですか?年に2回見積書を提示することはできますか? 365 を超える場合、すべての見積もりはどのように表示されますか?

アップデート:

//get number of quotes from DB
SELECT COUNT(*) AS cnt FROM quotes

$day_in_year=date('z')+1; //-> this will give you the number of days in a year, for today
于 2012-08-12T16:13:20.097 に答える
2

これは私がそれをする方法です:

まず、データベースで引用符の数を取得できると仮定します。これを。と呼びますnumber_of_quotes

次に、PHP microtime()関数のようなものを使用して、を取得し、os timestampそれを除算することができます

(1000 /* for converting microseconds to milliseconds */ * 
1000 /* milliseconds to seconds */ * 
3600 /* seconds to hours */ * 
24 /* hours to days */)

これまでの経過日数を取得するために、これをと呼びますnumber_of_days_passed

number_of_days_passed % (number_of_quotes + 1)最後に、quotesテーブルから行をフェッチできます。

于 2012-08-12T16:23:14.810 に答える
2

もう1つの解決策は、markすでに表示されている引用符です。このようにして、1 日の間に 1 つの同じ見積もりを選択する方法のみを決定する必要があります。

Next見積もりは、その日の初めにランダムに選択して、todays見積もりとしてマークすることができます。このタスクは を使用して実行でき、(日中)CRONとマークされた見積もりを選択するだけで済みますtodays

于 2012-08-12T16:57:27.413 に答える
2

すべての答えをありがとう。私が探していた答えは、残念ながら与えられませんでした。

これが私が問題を解消した方法です:

quote という名前の新しいテーブルを作成しました。

それには 1 つの行がありました: その日の最後の見積もりが更新された日付と見積もりそのものです。日付がサーバーの日付と一致しなかった場合、新しい見積もりを生成し、新しい見積もりと新しい日付でテーブルを更新しました。現在の日付と一致した場合は、見積もりを取得して表示しました。

かなり簡単な解決策ですが、私にとっては非常に独創的でした。

于 2012-08-12T20:51:09.003 に答える
1

今日の 00:00 UNIX 時間を取得し、コードに $variable として保存します。

$id = (time() - $variable) % (24 * 60 * 60);
"SELECT * FROM `quotes` WHERE `id` = {$id}"
于 2012-08-12T16:18:57.697 に答える