PHP PHP ile filtreleme yapma

abstractman

Decapat
Katılım
30 Ocak 2022
Mesajlar
100
Çözümler
2
Daha fazla  
Cinsiyet
Erkek
İlk önce veri tabanı tablolarımı anlatmak istiyorum bir e-ticaret sitesi yapıyorum ve sayfada filtreleme yapmak için PHP kullanıyorum.
İşte tablolarım "urunler_tbl": Urunıd / saticiıd / urunadi /fiyat / urunaciklama / renk / kategoriıd / stok "urnozellik_tbl": Uoıd / ozellikıd / /urunıd
"ozellik_tbl": Ozıd / ozadi / kategori /deger
Şimdi şöyle ilk olarak en basitinden sadece marka ve renk filtreliyordum bunlar da zaten urunler tablomda var ama şimdi özellik filtrelemem gerekiyor ve benim özelliklerim çoka çok tablo ile oluşturuldu basitçe kodlarımı atayım.

PHP:
// Satıcıları veritabanından çekme (Sadece Kategori_ID'si 1 olan ürünlerin satıcıları)
$sql = "SELECT s_ID, s_Ad FROM Saticilar_Tbl WHERE s_ID IN (SELECT DISTINCT SaticiID FROM Urunler_tbl WHERE KategoriID = 1)";
$result = $conn->query($sql);

// Ürünleri getirme fonksiyonu.
function getProducts($conn, $selectedSellers, $selectedColors, $selectedCategory) {
 // Satıcılar için SQL sorgusu.
 $sellerSql = "";
 if (!empty($selectedSellers)) {
 $sellerSql = " SaticiID IN (".implode(',', $selectedSellers).") ";
 }

 // Renkler için SQL sorgusu.
 $colorSql = "";
 if (!empty($selectedColors)) {
 if (!empty($sellerSql)) {
 $colorSql .= " AND ";
 }
 $colorSql .= " renk IN (".implode(',', $selectedColors).") ";
 }

 // Kategori için SQL sorgusu.
 $categorySql = "";
 if (!empty($selectedCategory)) {
 if (!empty($sellerSql) || !empty($colorSql)) {
 $categorySql .= " AND ";
 }
 $categorySql .= " KategoriID = '".$selectedCategory."' ";
 }

 // Ürünleri getirme SQL sorgusu.
 $productSql = "SELECT * FROM Urunler_tbl";
 if (!empty($sellerSql) || !empty($colorSql) || !empty($categorySql)) {
 $productSql .= " WHERE";
 if (!empty($sellerSql)) {
 $productSql .= $sellerSql;
 }
 if (!empty($colorSql)) {
 $productSql .= $colorSql;
 }
 if (!empty($categorySql)) {
 $productSql .= $categorySql;
 }
 }

 // Ürünlerin renklerini göster.
 $colors = array();
 $colorSql = "SELECT * FROM Renk_tbl";
 $colorResult = $conn->query($colorSql);
 if ($colorResult->num_rows > 0) {
 while($colorRow = $colorResult->fetch_assoc()) {
 $colors[$colorRow["RenkID"]] = $colorRow["RenkAdi"];
 }
 }

 // Ürünleri getirme.
 $productResult = $conn->query($productSql);
 if ($productResult->num_rows > 0) {
 echo "<div class='container mt-5'>";
 echo "<div class='row'>"; // Kartları saran row elementi.
 while($productRow = $productResult->fetch_assoc()) {
 echo "<div class='col-md-6'>";
 echo "<div class='card mb-3'>";
 echo "<div class='card-body'>";
 echo "<h5 class='card-title'>" . $productRow['UrunAdi'] . "</h5>";
 echo "<p class='card-text'>" . substr($productRow['UrunAciklama'], 0, 50) . "...</p>"; // Açıklamayı belirli bir karakter limitine kısalt.
 echo "<p class='card-text'><strong>Fiyat: </strong>" . $productRow['fiyat'] . "</p>";
 // Ürünün rengini göster.
 if (isset($colors[$productRow['renk']])) {
 echo "<p class='card-text'><strong>Renk: </strong>" . $colors[$productRow['renk']] . "</p>";
 } else {
 echo "<p class='card-text'><strong>Renk: </strong>Bilinmeyen Renk</p>";
 }
 echo "</div>";
 echo "</div>";
 echo "</div>";
 }
 echo "</div>"; // Row elementini kapat.
 echo "</div>"; // Container elementini kapat.
 } else {
 echo "<p class='mt-3'>Seçilen kriterlere uygun ürün bulunamadı.</p>";
 }
}

Bu kod marka ve renk filtreliyor şimdi aşağıya form kodlarımıda bırakıyorum.

Kod:
<!DOCTYPE html>
<html lang="tr">
<head>
 <meta charset="UTF-8">
 <meta name="viewport" content="width=device-width, initial-scale=1.0">
 <title>Marka ve Renk Seçimi</title>
 <!-- Bootstrap CSS dosyası -->
 <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css">
 <style>
 .seller-list {
 list-style: none;
 padding: 0;
 }
 .card-text {
 white-space: nowrap;
 overflow: hidden;
 text-overflow: ellipsis;
 }
 /* Filtre paneli stil */
 .filter-panel {
 padding: 15px;
 margin-top: 50px;
 }
 .seller-list input[type="checkbox"],
 .list-group-item input[type="checkbox"] {
 width: 15px;
 height: 15px;
 margin-right: 5px;
 vertical-align: middle;
 }
 /* Kartlar stil */
 .product-card {
 margin-bottom: 10%;
 }
 .product-card .card {
 height: 100%;
 }
 .product-card .card-body {
 height: 100%;
 display: flex;
 flex-direction: column;
 }
 .card {
 transition: transform 0.2s ease;
 }
 .card:hover {
 transform: scale(1.05);
 }
 </style>
</head>
<body>

<?php include 'header.php'; // Header dosyasını çağırarak sayfanın başında navbar'ı oluştur ?>

<div class="container-fluid mt-3">
 <div class="row">
 <!-- filtre paneli -->
 <div class="col-md-4">
 <div class="filter-panel">

 <h2 class="mt-4">Markalar </h2>
 <form method="POST">
 <ul class="list-group seller-list">
 <!-- PHP kodu ile satıcıları listeleme -->
 <?php
 if ($result->num_rows > 0) {
 while($row = $result->fetch_assoc()) {
 echo "<li class='list-group-item'><input type='checkbox' name='selected_sellers[]' value='" . $row["s_ID"] . "'>" . $row["s_Ad"] . "</li>";
 }
 } else {
 echo "<li class='list-group-item'>Satıcı bulunamadı.</li>";
 }
 ?>
 </ul>
 <h2 class="mt-4">Renkler</h2>
 <ul class="list-group renk-list">
 <!-- Renklerin listelenmesi -->
 <?php
 $colorSql = "SELECT * FROM Renk_tbl";
 $colorResult = $conn->query($colorSql);
 if ($colorResult->num_rows > 0) {
 while($colorRow = $colorResult->fetch_assoc()) {
 echo "<li class='list-group-item'><input type='checkbox' name='selected_colors[]' value='" . $colorRow["RenkID"] . "'>" . $colorRow["RenkAdi"] . "</li>";
 }
 }
 ?>
 </ul>
 <br>
 <h2>Ürün Özellikleri</h2>
 <ul class="list-group">
 <?php
 $sql = "SELECT * FROM Ozellik_tbl where kategori = 1";
 $result = $conn->query($sql);

 // Özellikleri gruplayarak listeleme.
 $groupedProperties = array();
 if ($result->num_rows > 0) {
 while($row = $result->fetch_assoc()) {
 $propertyName = $row["OzAdi"];
 $propertyValue = $row["deger"];

 // Grup adına göre özellikleri gruplama.
 if (!isset($groupedProperties[$propertyName])) {
 $groupedProperties[$propertyName] = array();
 }
 $groupedProperties[$propertyName][] = array(
 "id" => $row["OzID"],
 "value" => $propertyValue
 );
 }

 // Grupları listeleme.
 foreach ($groupedProperties as $groupName => $properties) {
 echo '<li class="list-group-item">';
 echo '<h5>' . $groupName . '</h5>';

 foreach ($properties as $property) {
 echo '<input type="checkbox" name="selected_features[]" value="' . $property["id"] . '">';
 echo $property["value"] . '<br>';
 }

 echo '</li>';
 }
 } else {
 echo '<li class="list-group-item">Özellik bulunamadı.</li>';
 }

 ?>
 </ul>

 <!-- Uygula butonu -->
 <button type="submit" class="btn btn-primary mt-3" name="apply_btn">Uygula</button>
 </form>
 </div>
 </div>
 <!-- Ürün kartları -->
 <div class="col-md-7">
 <div class="container mt-5">
 <div class="row">
 <?php
 // Form gönderilmiş mi kontrol et.
 if(isset($_POST['apply_btn'])) {
 $selectedSellers = !empty($_POST['selected_sellers']) ? $_POST['selected_sellers'] : [];
 $selectedColors = !empty($_POST['selected_colors']) ? $_POST['selected_colors'] : [];
 $selectedCategory = isset($_POST['selected_category']) ? $_POST['selected_category'] : '';
 getProducts($conn, $selectedSellers, $selectedColors, $selectedCategory);
 } else {
 // Hiçbir filtre uygulanmadığında tüm ürünleri listele.
 getProducts($conn, [], [], '');
 }
 ?>
 </div>
 </div>
 </div>
 </div>
</div>

<!-- Bootstrap JS dosyası (jQuery ve Popper.js dahil) -->
<script src="https://code.jquery.com/jquery-3.5.1.slim.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/@popperjs/[email protected]/dist/umd/popper.min.js"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/js/bootstrap.min.js"></script>

</body>
</html>

Ben ise son kısım olan ürünlerin özelliklerinin de filtrelenmesini istiyorum ama uzun süredir uğraşmama rağmen başaramadım biraz karışık anlattım sitemin görselini de bırakayım anlamak kolay olsun. ( ek olarak ürün özellikleri kısmı da "Ozellikler_tbl" sinden geliyor ).
 

Dosya Ekleri

  • ss.png
    ss.png
    32,4 KB · Görüntüleme: 16
Son düzenleme:
Join konularını çalıştım ama şuan bu dediğim şeyi yapamıyorum yoksa neden yardım isteyeyim

Fonksiyonunuza $selectedFeatures adında bir array parametresi ekleyip, aşağıdaki kodu "Kategori için SQL sorgusu" bölümünden sonra ekler misin?
PHP:
 // Özellikler için SQL sorgusu.
    $featureSql = "";
    if (!empty($selectedFeatures)) {
        $featureCount = count($selectedFeatures);
        $featureSql = " AND UrunID IN (
            SELECT UrunID FROM urnozellik_tbl
            WHERE OzellikID IN (".implode(',', $selectedFeatures).")
            GROUP BY UrunID
            HAVING COUNT(DISTINCT OzellikID) = $featureCount
        )";
    }
 
dediğinizi yaptım malesef yine çalışmadı
PHP:
 <?php
 // Form gönderilmiş mi kontrol et.
 if(isset($_POST['apply_btn'])) {
 $selectedSellers = !empty($_POST['selected_sellers']) ? $_POST['selected_sellers'] : [];
 $selectedColors = !empty($_POST['selected_colors']) ? $_POST['selected_colors'] : [];
 $selectedCategory = isset($_POST['selected_category']) ? $_POST['selected_category'] : '';
 getProducts($conn, $selectedSellers, $selectedColors, $selectedCategory,$selectedFeatures
);
 } else {
 // Hiçbir filtre uygulanmadığında tüm ürünleri listele.
 getProducts($conn, [], [], '');
 }
 ?>
acaba burda da eklemem gereken bişey var mı fonksiyonu çağırmak için yine $selectedFeatures ekledim ama sanırım buraya bişeyler daha eklemeliyim

size dediklerimi ekledikten sonra şuan filtreleme kısmen çalıştı ama sanırım bi hata var yani bazen seçtiğim özellikteki ürünler gelirken bazen gelmiyor örneğin 128GB hafızaya sahip 2 ürün varken gelmiyor ama 64 GB hafızayı seçtiğimde o özelliğe ait olan 1 adet telefon geliyor
 
Son düzenleme:

Yeni konular

Geri
Yukarı