Помощь Php / MySQL - случайный ежедневный выбор? - PullRequest
6 голосов
/ 27 января 2010

Я пытаюсь получить выбор из моей БД, который будет длиться один день (ежедневный выбор). Я использую следующий код:

$query = 'SELECT * FROM table ORDER BY rand() LIMIT 1

Но, как вы можете видеть, он дает мне только случайный выбор из таблицы, и каждый раз, когда я обновляю страницу, он получает новый случайный выбор. Как я могу сделать выбор на целый день?

Заранее спасибо <3 </p>


Я пытаюсь это:

$query = "SELECT * FROM table ORDER BY rand(" . date("Ymd") . ") LIMIT 1";

Но я получаю следующую ошибку: mysql_fetch_assoc (): предоставленный аргумент не является допустимым ресурсом результата MySQL. Это та часть, которая сломалась:

$results = mysql_query($query); 

while($line = mysql_fetch_assoc($results)) 

Так ... это должно выглядеть так, верно? (Я имею в виду, выбирая ежедневный случайный выбор?)

$dailyPick = 'SELECT * FROM table ORDER BY rand() LIMIT 1'; 

$cacheKey = 'dailyPick'. date('dmY'); 
if($cache->has($cacheKey)) { 
    $dailyPick = $cache->get($cacheKey); 
} else { 
    // hit database 
    $dailyPick = $cache->save($cacheKey); 
} 

Я пытаюсь это сейчас:

$dailyPick = 'SELECT * FROM table ORDER BY rand() LIMIT 1';  

$cacheKey = 'dailyPick'. date('dmY');  
if($cache->has($cacheKey)) {  
    $dailyPick = $cache->get($cacheKey);  
} else {  
    // hit database  
    $dailyPick = $cache->save($cacheKey);  
}  

Однако я ошибаюсь, что я использую функцию has для необъекта.

Ответы [ 4 ]

15 голосов
/ 27 января 2010

Если вы установите SEED для ранда в целочисленное значение, которое меняется ежедневно, это решит вашу проблему

$query = "SELECT * FROM table ORDER BY rand(" . date("Ymd") . ") LIMIT 1";

Сделал бы трюк.

5 голосов
/ 27 января 2010

Разумным способом сделать это было бы автоматическое создание выбора контента дня с помощью задания cron , которое было настроено на запуск один раз в день.

Таким образом, задание cron выполнит предоставленный вами SQL-запрос и сохранит соответствующий контент в простой таблице файлов / баз данных и т. Д. (Или, возможно, просто сохранит выбранный идентификатор в другой таблице для будущих целей поиска).

2 голосов
/ 27 января 2010

Вы можете попробовать что-то вроде этого:

$total = 'SELECT COUNT(*) FROM table;';
$query = 'SELECT * FROM table ORDER BY id ASC LIMIT 1 OFFSET ' . (date('Ymd') % $total) . ';';
0 голосов
/ 27 января 2010

Я думаю, вам нужно обновить случайно выбранную запись с полем "сегодня" = 1 ..

Примерно так:

// ------------
// Run this 3 commands once a day

// Reset all records
mysql_query("UPDATE `table` SET `today` = 0");

// Pick one
$sql = mysql_query("SELECT `id` FROM `table` ORDER BY RAND() LIMIT 1");
$id = mysql_result($sql, 0, 'id');

// Update the record
mysql_query("UPDATE `table` SET `today` = 1 WHERE `id` = {$id}");

// ------------

// Now you can find again your "random found record":
$query = mysql_query("SELECT * FROM `table` WHERE `today` = 1");
...