mysql — показывать данные только за определенную продолжительность с переполнением стека

У меня есть страница, которая показывает сообщения, хранящиеся в базе данных 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>';
}
}

0

Решение

Вы можете использовать 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 и т. Д.).

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]