MySQL — PHP цикл цикла для извлечения данных из базы данных

Я создаю свой собственный блог с нуля с домашней страницей, которая загружает последние сообщения в порядке времени публикации. Я вызываю сообщения с помощью фронт-контроллера и сохраняю данные в базе данных 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, чтобы можно было изолировать каждую коробку и изменить стиль позже.)

0

Решение

Ваша проблема вызвана оператором возврата в цикле. Вы должны добавить $return = '' в верхней части вашей функции, заменить return от $result .=, а также return $result в конце вашей функции.

Кроме того, счетчик цикла $i сбрасывается в каждой итерации. Переместите начальное назначение из цикла.

РЕДАКТИРОВАТЬ: .= намеренно добавить в $result вместо того, чтобы заменить его другим значением, созданным из следующего набора данных.

1

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

инициировать $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; после цикла

0

Это потому что 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>';
}
0
По вопросам рекламы [email protected]