У меня есть страница, которая показывает сообщения, хранящиеся в базе данных MySQL. Когда сообщение создано, пользователь может выбрать, как долго он будет отображать сообщение, и я пытаюсь понять, как показывать сообщения только в течение определенного периода времени. Вот часть моего кода (который, я надеюсь, показывает логику, которую я пробую).
//Query database
$sql = <<<SQL
SELECT *
FROM `posts`
SQL;
if(!$result = $db_connection->query($sql)){
die('There was an error running the query [' . $db_connection->error . ']');
}
while($row = $result->fetch_assoc()){
//The date the post was made
$date_of_post = $row['date_of_post'];
//The duration of the post in days eg 7.
$duration = $row['duration'];
//Attempting to add duration to date
$newdate = strtotime($duration, $date_of_post);
//Only show posts that are still valid, eg date + duration is less than today's date
if($newdate > now()){
echo '<h2>Post Title</h2>';
echo '<p>Date of Posted:'.$date.'</p>';
}
}
Вы можете использовать where
пункт и date_add
Функция для применения этого фильтра непосредственно в вашем запросе SQL. Просто добавьте duration
дней до date_of_post
значение и сравнить его с NOW()
,
Обратите внимание, потому что вы храните свой duration
значение как varchar вместо int, вам нужно convert
значение длительности до signed int
,
Вот пример с date_add
расширен, чтобы было понятнее понять, что происходит.
select
*
from
posts
where
date_add
(
date_of_post,
INTERVAL convert(duration, SIGNED INT) DAY
) > NOW()
Как примечание, вы всегда должны пытаться фильтровать ваши данные в вашем запросе, а не в вашем скрипте PHP. Не просто выбирайте всю таблицу в ваш скрипт — позвольте SQL выполнять как можно больше работы. СУБД гораздо более эффективна, чем PHP, и вы сэкономите много времени (например, объем данных, передаваемых по сети, и объем ОЗУ, который необходимо использовать для хранения результатов для работы PHP и т. Д.).
Других решений пока нет …