2012-05-01 13 views
1

私はそれから1行を選び、それをユーザーに見せたいテーブルがあります。毎週私はウェブサイトが自動的に別の行をランダムに選択させたいと思っています。だから、基本的に毎回ユーザーがページにアクセスするたびに新しい結果を得たいと思う。私は今、このコードを使用しています :毎週sqlから新しい結果を取得

$res = mysql_query("SELECT COUNT(*) FROM fruit"); 
$row = mysql_fetch_array($res); 
$offset = rand(0, $row[0]-1); 
/* the first three lines to pick a row randomly from the table */ 
$res = mysql_query("SELECT * FROM fruit LIMIT $offset, 1"); 
$row = mysql_fetch_assoc($res); 

をこのコードは、新しい結果を得るたび、ユーザーがページを訪問し、すべての後にリフレッシュ別のランダムな行を選択します。私はそれを毎週更新したいと思っており、その結果はすべてのユーザーにとって同じです。彼らはそれを行うPHPコマンドですか?もしそうなら、どのように機能するのですか?

答えて

2

次のように私の提案は次のようになります。

  • ストアランダム結果idtimestampは、永続ストレージ(ファイル、DBテーブル、等)の他のいくつかの一種です。
  • cronジョブまたはその他の自動化タスクを設定して、より上のレコードを更新します。。そのようなソリューションにアクセスできない場合は、各ページの読み込み時にコードを実行し、timestamp列をチェックすることができます。しかし、それはかなり非効率的です。
+0

これはあまりにも私の推薦だろう。 CRONの仕事を読み上げれば、答えが出ます! –

1

はいあります。 phpのdate関数を使い、fwriteを使って毎週と対応する行をファイルに書き出します。次に、if文を使用して、新しい週であるかどうかを確認し、新しいランダム行を取得する場合はファイルに書き込み、そうでない場合はその週のものと同じものを返します。

0

クロムジョブが最適です。スクリプトweeklynumber.phpを既に作成したものと同じように作成して、エントリを生成します。その後、あなたのコンソールに行き、crontab -eを使ってcrontabファイルを開きます。

ここでは、あなたは

0 0 * * 0 php /path/to/weeklynumber.php 

これは0:00毎週日曜日に、php /path/to/weeklynumber.phpが実行されることを意味追加することができます。

しかし、これは皆さんがUNIXを使用しており、cronジョブの作成にアクセスできることを前提としています。そうでない場合、別の解決策があります:週番号と年をハッシュし、それを使って週番号を生成します。

// Get the current week and year 
$week = date('Wy'); 
// Get the MD5 hash of this 
$hash = md5($week); 
// Get the amount of records in the table 
$count = mysql_result(mysql_query("SELECT COUNT(*) FROM fruit"),0); 
// Convert the MD5 hash to an integer 
$num = base_convert($hash, 16, 10); 
// Use the last 6 digits of the number and take modulus $count 
$num = substr($num,-6) % $count; 

上記は、テーブルのレコードの量が変更されない限り機能します。

最後に、現在の方法にちょっと注意してください。代わりに、行を数えるPHPから乱数を取得し、その数を返すために、あなたのDBMSを尋ねると、それはすべての単一のクエリを行うことができます

SELECT * FROM fruit ORDER BY RAND() LIMIT 1 
+0

RAND()はビッグテーブルには適していません – shnisaka

+0

また、あなたが行ったことはすべて1つのクエリで行うことができます: 'SELECT * FROM fruit ORDER BY RAND(DATE_FORMAT(CURDATE()、 ' '%')+ 0)Limit 1' – shnisaka

+0

これは本当です。大きなテーブルでは 'RAND()'は悪いですが、 'COUNT()'もそうです。 – kba

関連する問題