Я создаю свой собственный блог с нуля с домашней страницей, которая загружает последние сообщения в порядке времени публикации. Я вызываю сообщения с помощью фронт-контроллера и сохраняю данные в базе данных MySQL. Сам веб-сайт великолепен, и все сообщения прекрасно загружаются без проблем. Проблема в том, чтобы заставить домашнюю страницу работать.
Я создал несколько функций PHP для домашней страницы. Обычно они упорядочивают записи (строки базы данных) по идентификатору в порядке убывания, поскольку это поле автоинкремента, и вызывают их данные. А затем показать самый последний пост как своего рода «избранный пост» прямо вверху, выбрав данные из самой верхней строки в базе данных, которая является последним постом.
И это прекрасно работает — когда я повторяю результат, он показывает последний пост, как я хочу.
Ниже я хочу два бокса рядом для двух постов перед первым. Поэтому я сделал эту функцию, чтобы вызвать их:
function fetch_rest_posts_1($conn) {
$stuff = $conn->query("SELECT * FROM table WHERE is_post = 1 ORDER BY id DESC LIMIT 1,2");
while ($row = $stuff->fetch_array()) {
$i=1;
return '<div id="post_'.$i.'" style="width:308px;height:215px;padding:5px">
<h2>'.$row['title'].'</h2>
<p>'.date('d/m/Y',strtotime($row['published_date'])).' by '.$row['author'].' | <a href="http://www.domainname.com/'.$row['uri'].'#disqus_thread"></a></p>
<p>'.$row['meta_description'].'</p>
</div>';
$i++;
} // style="white-space:nowrap;width:100%;overflow:hidden;text-overflow:ellipsis"
}
И он действительно отлично работает, когда я отражаю результат, показывает все, что хочу, но показывает только один div, а не два. Когда я беру SQL-запрос и напрямую вводю его в phpMyAdmin, он дает мне две строки. Я сделал что-то не так?
(Я поместил туда автоматически увеличивающееся значение $ i, чтобы можно было изолировать каждую коробку и изменить стиль позже.)
Ваша проблема вызвана оператором возврата в цикле. Вы должны добавить $return = ''
в верхней части вашей функции, заменить return
от $result .=
, а также return $result
в конце вашей функции.
Кроме того, счетчик цикла $i
сбрасывается в каждой итерации. Переместите начальное назначение из цикла.
РЕДАКТИРОВАТЬ: .=
намеренно добавить в $result
вместо того, чтобы заменить его другим значением, созданным из следующего набора данных.
инициировать $i
вне цикла и использования echo()
вместо return()
return()
разрывает петлю
или использовать
$result .= '<div id="post_'.$i.'" style="width:308px;height:215px;padding:5px">
<h2>'.$row['title'].'</h2>
<p>'.date('d/m/Y',strtotime($row['published_date'])).' by '.$row['author'].' | <a href="http://www.domainname.com/'.$row['uri'].'#disqus_thread"></a></p>
<p>'.$row['meta_description'].'</p>
</div>';
а также return $result;
после цикла
Это потому что return остановит выполнение функции попробуйте этот подход:
function fetch_rest_posts_1($conn) {
$stuff = $conn->query("SELECT * FROM table WHERE is_post = 1 ORDER BY id DESC LIMIT 1,2");
$post = array();
while ($row = $stuff->fetch_array()) {
$post[] = $row;
}
return $post;
}
Итак, цель функции — просто получить данные, чтобы вы могли позже распечатать их:
$row = fetch_rest_posts_1($conn);
for($i = 0; count(row); $i++){
echo '<div id="post_'.$i.'" style="width:308px;height:215px;padding:5px">
<h2>'.$row[$i]['title'].'</h2>
<p>'.date('d/m/Y',strtotime($row['published_date'])).' by '.$row[$i]['author'].' | <a href="http://www.domainname.com/'.$row[$i]['uri'].'#disqus_thread"></a></p>
<p>'.$row[$i]['meta_description'].'</p>
</div>';
}