[ nemchus @ 16.01.2016. 14:53 ] @
Pokušavam da filtriram podatke koje dobijam iz baze. Za filtriranje koristim niz koji se na klijentskoj strani puni id-jima čekiranih polja. Uspeo sam da sredim da se filtriram po jednom parametru ali ne znam kako da filtriram po 3 parametra.
Ovo dole je ono do čega sam ja uspeo da dođem:

Code:

<?php

  include ("database.php");
  $pdo = database::connect();
  $brands = ["modern", "classic"];
  $qMarks = str_repeat('?,', count($brands) - 1) . '?';
  $statement = $pdo->prepare("SELECT naziv, cena, slika, boja_naziv, brand_naziv, format_naziv
                            FROM produkti LEFT JOIN boja_kon ON produkti_id = produkti.id
                            LEFT JOIN format ON format_id = format.id
                            LEFT JOIN brand ON brand_id = brand.id
                            LEFT JOIN boja ON boja_id = boja.id WHERE brand_naziv IN ($qMarks)");
  $statement -> execute($brands);
  $results = $statement -> fetchAll(PDO::FETCH_ASSOC);
  $json = json_encode($results);
  echo($json);

// $_GET['brand_id']
?>



A ovo mi je otprilike potrebno:
Code:


  $statement = $pdo->prepare("SELECT naziv, cena, slika, boja_naziv, brand_naziv, format_naziv
                            FROM produkti LEFT JOIN boja_kon ON produkti_id = produkti.id
                            LEFT JOIN format ON format_id = format.id
                            LEFT JOIN brand ON brand_id = brand.id
                            LEFT JOIN boja ON boja_id = boja.id WHERE brand_naziv IN ($qMarks) AND format_naziv IN (//niz sa formatima) AND boja_naziv IN (//niz sa bojama)");



Da li je ovo uopšte pravi pristup? Funkcionalnost koju želim da postignem je otprilike slična ovoj: https://www.weddingpaperdivas....ntage--wedding_invitations.htm
[ jablan @ 16.01.2016. 15:00 ] @
Kao što vidiš, situacija se dosta komplikuje, što više kriterijuma selekcije imaš. Problem je što su tebi kriterijumi hardkodirani dizajnom baze podataka. Umesto toga, trebalo bi da imaš jednu tabelu kriterijuma, jednu tabelu mogućih vrednosti svih kriterijuma i jednu tabelu koja vezuje proizvode sa vrednostima kriterijuma.

BTW, nisam znao da taj PHP-ov PDO ne dozvoljava da pripremljenom upitu proslediš ceo niz. Npr, ja u Railsu mogu da uradim nešto ovako:
Code:

Model.where('id IN (?)', [array of values])

bez potrebe da konstruišem string sa N upitnika.
[ nemchus @ 16.01.2016. 18:45 ] @
Vidiš, nisam razmišljao o tome da je problem na nivou baze. Možda bi to trebalo da pogledam kako bi to izlegadalo sa dodatnim tabelama i kako bi to moglo da se predstavi u sql query-ju...A što se tiče PHP-a, to mi je najbliži jezik za back-end, i tu se koliko-toliko snalazim iako sam više orijentisan ka front-end-u. Nisam baš siguran da li će promena u bazi da mi reši ovaj problem sa pripremljenim upitima, jer ću ponovo morati da koristim nizove.
Tipa....WHERE filter_boja IN ($filterboja) AND WHERE filter_format IN ($filterformat)...
Možda sam i pogrešno shvatio...


[Ovu poruku je menjao nemchus dana 16.01.2016. u 20:06 GMT+1]
[ jablan @ 17.01.2016. 08:28 ] @
Moraćeš da koristiš nizove ali ćeš imati fiksan number JOIN-ova i samo jedan set kriterijuma:

Code:

SELECT * FROM proizvodi p
LEFT JOIN kriterijumi_proizvoda kp ON p.id = kp.proizvod_id
LEFT JOIN kriterijumi k ON kp.kriterijum_id = k.id /* crna, a4, toshiba */
LEFT JOIN tipovi_kriterijuma tk ON k.tip_kriterijuma_id = tk.id /* boja, format, marka */
WHERE k.id IN (123, 456, 789)


Otprilike.
[ nemchus @ 17.01.2016. 15:19 ] @
Sad mi je jasnije Koliko sam te razumeo, tabelu kriterijumi proizvoda povezujem sa tabelama koje predstavljaju atribute (boja, format, brand) ili to uopšte nema veze?

Pretpostavljam da u ovakav dizajn baze mogu da ubacim tvoju ideju?
http://prntscr.com/9r8u4z

Vidim da je u ovom delu WHERE....IN (123, 456, 789), niz brojeva. Koliko sam te razumeo, prva vrednost bi predstavljala id brand-a, druga bi predstavljala id formata a treća bi predstavljala id boje? Šta npr. ako je upitu prosledim samo jednu čekiranu vrednost (recimo prvi checkbox) na klijentskoj strani i upit bude ovakav WHERE....IN (1) gde bi 1 bio recimo brand toshiba? Na osnovu ovoga bih hteo da mi izbaci samo toshiba produkte bez obzira na boju i format... Ili korisnik npr. čekira toshiba i msi, kada su u pitanju brendovi, crvenu, belu i bež, kada su u pitanju boje i recimo, a4 format. Onda bi se recimo upit završavao ovakvim podacima WHERE....IN(127634)....
Moguće da sam pogrešno razumeo...

[Ovu poruku je menjao nemchus dana 17.01.2016. u 16:40 GMT+1]

[Ovu poruku je menjao nemchus dana 17.01.2016. u 16:40 GMT+1]