Reputation: 35
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
POSTS [PRODUCTS]
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
Reputation: 602
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