Victor Hugo
Victor Hugo

Reputation: 35

How to filter posts [products] that belong to a specific category

I need to filter the products on my website in different categories. For example, if you select the category "DRINKS", it will show me the products that belong to that category.

To explain myself better.

I need the publications [products] of my website to be filtered by categories, for example when selecting a category say "DRINKS" only the publications [products] that belong to that category are shown.

DATABASE [IMAGES]

CATEGORIES

database categories image

POSTS [PRODUCTS]

database post [product] image

For example, when selecting the "Drinks" category, only the products marked with this category are shown, in this case "Product"

This is my code currently:

Code showing products within categories.php [index]

<?php include($_SERVER['DOCUMENT_ROOT'].'/app/controllers/products.php');
include('app/includes/categories.php');
$categorias = selectAll('categories');
$capitulos = selectAll('products');

<div class="productos-list">
    
<?php foreach ($productos as $key => $producto): ?>           
<ul>
    <a href="/ver/productos.php?id=<?php echo $producto['id']?>">
    <li class="producto-name"><?php echo $producto['name']?></li>
    </a>
</ul>
<?php endforeach; ?> 
    </div>

PRODUCTS.PHP

<?php 

include($_SERVER['DOCUMENT_ROOT'].'/app/database/db.php');
include($_SERVER['DOCUMENT_ROOT'].'/app/helpers/validatePost.php');

$table = 'posts';
$categorias = selectAll('categorias');

$errors = array();
$id = '';
$title = '';
$productos = '';
$categoria_id = '';

$productos = selectAll($table);


if (isset($_POST['add-post'])) {
    $_POST['topic_id']=serialize($_POST['topic_id']);
    $errors = validatePost($_POST);
    
    if (!empty($_FILES['image']['name'])) {
        $image_name = time() . '_' . $_FILES['image']['name'];
        $destination = "../../images/" . $image_name;
        
        $result = move_uploaded_file($_FILES['image']['tmp_name'], $destination);
        
        if ($result){
            $_POST['image'] = $image_name;
        } else {
            array_push($errors, "¡Algo fallo al subir la imagen!");
        }
        
        
    } else {
      array_push($errors, "¡Necesitas subir una imagen!");
    }
    
    if (count($errors) === 0){
        unset($_POST['add-post']);
        $post_id = create($table, $_POST);
        $_SESSION['message'] = '¡Post creado correctamente!';
        $_SESSION['type'] = 'success';
        header('location: ../../admin/posts/index.php');
        exit();
    } else {
        $id = $_POST['id'];
        $title = $_POST['title'];
        $topic = $_POST['categoria_id'];
    }
}

if (isset($_GET['id'])){
    $id = $_GET['id'];
    $post = selectOne($table, ['id' => $id]);
}

if (isset($_GET['del_id'])){
    $id = $_GET['del_id'];    
    $count = delete($table, $id);
    $_SESSION['message'] = '¡Post eliminado correctamente!';
    $_SESSION['type'] = 'success';
    header('location: ../../admin/posts/index.php');
    exit();
}

if (isset($_POST['update-post'])){
    $errors = validateEdit($_POST); 
    
    if (count($errors) === 0){
        $id = $_POST['id'];
        unset($_POST['update-post'], $_POST['id']);
        $post_id = update($table, $id, $_POST);
        $_SESSION['message'] = '¡Post actualizado correctamente!';
        $_SESSION['type'] = 'success';
        header('location: ../../admin/topics/index.php');
        exit();        
    } else {
        $id = $_POST['id'];
        $title = $_POST['title'];
        $topic = $_POST['categoria_id'];
}
} 
?>     

CATEGORIES.PHP

<?php 

include($_SERVER['DOCUMENT_ROOT'].'/app/database/db.php');
include($_SERVER['DOCUMENT_ROOT'].'/app/helpers/validateCategoria.php');

$table = 'categorias';

$errors = array();
$id = '';
$name = '';
$title = '';
$productos = '';
$categoria_id = '';

$categorias = selectAll($table);


if (isset($_POST['add-post'])) {
    $errors = validateCategoria($_POST);
    
    if (count($errors) === 0){
        unset($_POST['add-post']);
        $post_id = create($table, $_POST);
        $_SESSION['message'] = '¡Categoria creada correctamente!';
        $_SESSION['type'] = 'success';
        header('location: ../../admin/categorias/index.php');
        exit();
    } else {
        $id = $_POST['id'];
        $name = $_POST['name'];
    }
}

if (isset($_GET['id'])){
    $id = $_GET['id'];
    $post = selectOne($table, ['id' => $id]);
}

if (isset($_GET['del_id'])){
    $id = $_GET['del_id'];    
    $count = delete($table, $id);
    $_SESSION['message'] = '¡Categoria eliminada correctamente!';
    $_SESSION['type'] = 'success';
    header('location: ../../admin/categorias/index.php');
    exit();
}

if (isset($_POST['update-post'])){
    $errors = validateEdit($_POST); 
    
    if (count($errors) === 0){
        $id = $_POST['id'];
        unset($_POST['update-post'], $_POST['id']);
        $post_id = update($table, $id, $_POST);
        $_SESSION['message'] = '¡Categoria actualizada correctamente!';
        $_SESSION['type'] = 'success';
        header('location: ../../admin/categorias/index.php');
        exit();        
    } else {
        $id = $_POST['id'];
        $name = $_POST['name'];

}
} 
?>  

                             

DB.PHP

<?php

session_start();
require('connect.php');

function dd($value)
{
    echo "<pre>", print_r($value, true), "</pre>";
    die();
}


function executeQuery($sql, $data)
{
    global $conn;
    mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
    $stmt = $conn->prepare($sql);
    $values = array_values($data);
    $types = str_repeat('s', count($values));
    $stmt->bind_param($types, ...$values);
    $stmt->execute();
    return $stmt;
}


function selectAll($table, $conditions = [])
{
    global $conn;
    $sql = "SELECT * FROM $table";
    if (empty($conditions)) {
        $sql = $sql . " ORDER BY id DESC";
        $stmt = $conn->prepare($sql);
        $stmt->execute();
        $records = $stmt->get_result()->fetch_all(MYSQLI_ASSOC);
        return $records;    
    } else {
        // $sql = "SELECT * FROM $table WHERE username='ElVictox' AND admin=1";
        
        $i = 0;
        foreach ($conditions as $key => $value) {
            if ($i === 0){
                $sql = $sql . " WHERE $key=?";
                
            } else {
                $sql = $sql . " AND $key=?"; 
            }
            $i++;
        }
        
        $stmt = $conn->prepare($sql);
        $values = array_values($conditions);
        $types = str_repeat('s', count($values));
        $stmt->bind_param($types, $values);
        $stmt->execute();
        $records = $stmt->get_result()->fetch_all(MYSQLI_ASSOC);
        return $records;
    }
}



function selectOne($table, $conditions)
{
    global $conn;
    $sql = "SELECT * FROM $table ";

        $i = 0;
                foreach ($conditions as $key => $value) {
            if ($i === 0){
                $sql = $sql . " WHERE $key=?";
                
            } else {
               $sql = $sql . " AND $key=?"; 
            }
            $i++;
        }
        $sql = $sql . " LIMIT 1";
        $stmt = executeQuery($sql, $conditions);
        $records = $stmt->get_result()->fetch_assoc();
        return $records;
    }

function create($table, $data)
{
    global $conn;
    $sql = "INSERT INTO $table SET ";
      
    $i = 0;
    foreach ($data as $key => $value) {
            if ($i === 0){
                $sql = $sql . " $key=?";
                
            } else {
                $sql = $sql . ", $key=?"; 
            }
            $i++;
        }
    $stmt = executeQuery($sql, $data);
    $id = $stmt->insert_id;
    return $id;
    
}

function update($table, $id, $data)
{
    global $conn;
    $sql = "UPDATE $table SET ";
      
    $i = 0;
    foreach ($data as $key => $value) {
            if ($i === 0){
                $sql = $sql . " $key=?";
                
            } else {
                $sql = $sql . ", $key=?"; 
            }
            $i++;
        }
    
    $sql = $sql . " WHERE id=?";
    $data['id'] = $id;
    $stmt = executeQuery($sql, $data);
    return $stmt->affected_rows;
    
}


function delete($table, $id)
{
    global $conn;
    $sql = "DELETE FROM $table WHERE id=?";
      
    $stmt = executeQuery($sql, ['id' => $id]);
    return $stmt->affected_rows;
    
}

EDIT: I don't have errors to show the products in the category, what I want to do is show them specifically in their category. For example, I select the category "Drinks" and I want it to show me only the drink products.

Currently it happens to me that all products are shown in all categories, for example in the "Drinks" category all products are shown, including those that do not belong to it.

Upvotes: 2

Views: 868

Answers (1)

You need to use a join using. example with mysqli

file1.php

<?php
        $db = new mysqli(ip,username,password,db);
        $query = $db->prepare("SELECT * FROM products INNER JOIN categorias ON product.categoria_id = categorias.id WHERE categorias.name = ?");
        $query->bind_param("s",$categoria);
        $query->execute();
        $coll = $query->get_result();
        $query->store_result();
        $elements = [];
        while ($row = $coll->fetch_assoc()){
           $elements[] = $row; // products where categorias.name = $categoria
        }
?>

index.php

  <?php 
include "file1.php";

foreach ($elements as $element){
echo $element["name"];
}
?>

Upvotes: 1

Related Questions