twofolls95
@twofolls95
musician

Как реализовать вывод статей блога по категориям?

Приветствую! Я хочу реализовать вывод записей в блоге по категориям при клике на список категорий в меню. Я создал две таблицы:
5d51585d0b969709586170.png
5d51588bb0e76206791762.png
и набросал код, но в итоге он не пашет, var_dump показывает следующее:
5d51569a3f4a5397043848.png
При клике на любую из категорий, результат вывода функции var_dump не меняется. Подскажите пожалуйста в чём проблема, где я накосячил? Заранее благодарю.
Исходный код:
- Вывод категорий в меню и осуществление GET-запроса по id категории:
<?php foreach($category as $categ){ ?>
                    <li><a href="category.php?category_id=<?php echo $categ['id']?>"><?php echo $categ['title']; ?></a><li>
                    <?php } ?>

- function.php
//Выборка из таблицы "Категории"
$category = mysqli_query($connect, "SELECT * FROM category");
$categ = mysqli_fetch_assoc($category);

//Выборка из таблицы "Посты"
$posts = mysqli_query($connect, "SELECT * FROM posts");
$post = mysqli_fetch_assoc($posts);

function get_post_by_category($category_id){
global $connect;
global $post;
$sql = "SELECT * FROM category WHERE id =".$post['category_id'];
$result = mysqli_query($connect, $sql);
$post = mysqli_fetch_assoc($result);
return $post; 
}


- category.php
<?php

require_once 'header.php';

$category_id = $_GET['category_id'];
$post = get_post_by_category($category_id);

?>



<div class="container">
	<div class="alert alert-danger">      
	</div>
</div>

<?php var_dump($post); ?>
<div class="container">
	<div class="row">
		<div class="col-md-9">
			<div class="page-header">
				<h1>Все записи:</h1>
			</div>
			<?php foreach($posts as $post){ ?>
				<div class="row">
					<div class="col-md-3">
						<div class="thumbnail">
							<img src="<?php echo $post['image']; ?>" alt="">
						</div>
					</div>
					<div class="col-md-9">
						<h4><a href="post.php?post_id=<?=$post['id']?>"><?php echo $post['title']; ?></a></h4>
						<p>
							<?php echo mb_substr($post['text'], 0, 200) . '...'; ?>
						</p>
						<p><a class="btn-info btn-sm" href="post.php?post_id=<?=$post['id']?>">Читать полностью</a></p>
						<br/>
						<ul class="list-inline">
							<li><i class="glyphicon glyphicon-list"></i> Категория:  | </li>
							<li><i class="glyphicon glyphicon-calendar"></i> <?php echo $post['datetime']; ?> | </li>
							<li><i class="glyphicon glyphicon-comment"></i> by <a href="#">3 comments</a> | </li>
						</ul>
					</div>
				</div>
				<hr>
			<?php } ?>
		</div>
		<?php require_once 'sidebar.php'; ?>
	</div>
</div>
  • Вопрос задан
  • 110 просмотров
Пригласить эксперта
Ответы на вопрос 2
@kester
SW Dev
Вот от этого лучше избавиться:
//Выборка из таблицы "Категории"
$category = mysqli_query($connect, "SELECT * FROM category");
$categ = mysqli_fetch_assoc($category);

//Выборка из таблицы "Посты"
$posts = mysqli_query($connect, "SELECT * FROM posts");
$post = mysqli_fetch_assoc($posts);

выполняй те запросы, которые тебе необходимы и в тех местах, где они необходимы.

- function.php
<?php
// передавай соединение в параметре, избегай использования global-ов
function get_post_by_category(\mysqli $db, $category_id)
{
    // правильный запрос. нам надо все посты конкретной категории
    // $category_id приводим к int, чтобы обезопасить себя от sql-инъекций
    $sql = "SELECT * FROM posts WHERE category_id = " . (int)$category_id;
    $result = $db->query($connect, $sql);

    // у нас несколько результатов, читаем их в цикле и собираем в переменную $posts
    $posts = [];
    while ($row = $result->fetch_assoc()) {
        $posts[] = $row;
    }

    return $posts;
}


- category.php
<?php
require_once 'header.php';

$category_id = $_GET['category_id'];

// тут была вторая ошибка: $post вместо $posts
// не забываем передать $connect
$posts = get_post_by_category($connect, $category_id);

?>
// ну и тд., далее без изменений
Ответ написан
anton_reut
@anton_reut
Начинающий веб-разработчик
Как-то сложно. Не увидел у тебя JOIN таблиц, тебе нужно объединить таблицы и потом выборка по категории, я делаю так:

if(isset($_GET['category'])){
	
	$category = $_GET['category'];

	$sql='SELECT items.id, name, description, price, date, image, address, categoryname, category_id 
	FROM items 
	
	INNER JOIN category 
	ON category_id = category.id
	
	WHERE  category.id = ' . $category . '
	
	ORDER BY id ASC';
	$result=$pdo->query($sql);
	
	while($row=$result->fetch())
	{
		$items[]=array(
		'id'=>$row['id'],
		'name'=>$row['name'],
		'description'=>$row['description'],
		'price'=>$row['price'],
		'date'=>$row['date'],
		'image'=>$row['image'],
		'address'=>$row['address'],
		'categoryname'=>$row['categoryname'],
		'category_id'=>$row['category_id']
		);
	}
}
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы