Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP]wyświetlanie danych z tabeli na podstawie kilku kryteriów
Forum PHP.pl > Forum > Przedszkole
kosior11
Witam!

Męczę się z tym od jakiegoś czasu. Mam dwa kryteria kategorie i lokalizacje. Nie mam problemu z wybraniem danych na podstawie jednego kryterium czyli np. kategorii albo lokalizacji.

  1. $query = "(SELECT id,...,kategoria,podkategoria,lokalizacja FROM tabela where kategoria='".$_GET['kat']."') ORDER BY dane DESC";


kategorie, lokalizacje i podkategorie pobieram z adresu strony.

Problem mi sprawia to żeby pobrać dane na podstawie dwóch kryteriów, czyli np. najpierw wybrać z menu kategorie żeby wyświetlić dane z tej kategorii i później wybrać lokalizacje żeby wyświetlone dane z kategorii odnosiły się do wybranej lokalizacji.

adres dla lokalizacji wyglądał by tak: kategoria.php?kat=kategoria1,lok=lokalizacja

Próbowałem:
  1. SELECT ... where kategoria='".$_GET['kat']."' AND lokalizacja='".$_GET['lok']."'

ale wtedy muszą być oba kryteria spełnione

Jak zrobić, żeby skrypt działa zarówno z jednym z tych kryteriów jak i z dwoma?

Pozdrawiam
eviance
siemka

łączenie np. "or"

  1. SELECT ... WHERE kategoria='".$_GET['kat']."' OR lokalizacja='".$_GET['lok']."'
kosior11
Dzięki za odpisanie ale niestety nie wyświetla mi danych według lokalizacji, jest pustka.

mam adres: ....kat=kategoria1,lok=lokalizacja3

zapytanie wygląda następująco:
  1. $query = "(SELECT id,...,kategoria,lokalizacja FROM tabela where kategoria='".$_GET['kat']."' OR lokalizacja='".$_GET['lok']."') ORDER BY dane DESC";


kategorie są wyświetlane dobrze ale jak próbuje filtrować dane według lokalizacji to nie ma żadnych danych wyświetlonych.
eviance
nie wiem co masz na przodzie ale


masz 2 zmienne

pierw bym sprawdził czy w $_get są zmiene

alertem lub confirm_return

dalej bym układał pod mysql

i co ostano się naciąłem to warunek or w () po where dodaj

Luka

BaN
Cytat(kosior11 @ 19.06.2012, 21:26:47 ) *
... adres dla lokalizacji wyglądał by tak: kategoria.php?kat=kategoria1,lok=lokalizacja ...


Jeśli nie masz ustawionych jakiś reguł dla htaccess oraz nie zmieniałeś separatora parametrów przekazywanych przez $_GET, to z takiego fragmentu adresu będziesz miał ustawioną jedną zmienną $_GET['kat'] równą oczywiście 'kategoria1,lok=lokalizacja'

Parametry w adresie zwykle oddziela się znakiem & (ampersand) o ile tego nie zmieniłeś, zatem adres powinien mieć format:
Kod
kategoria.php?kat=kategoria1&lok=lokalizacja


Dodatkowo moim zdaniem należałoby sprawdzić przed wykonaniem zapytania czy coś jest podane w zmiennych oraz stosować funkcję mysql_real_escape_string


kosior11
Doszedłem do błędu który sprawiał, że nie wyświetlało nic w lokalizacji a problem tkwił w adresie, zamieniłem:
kategoria.php?kat=kategoria1,lok=lokalizacja
na:
kategoria.php?kat=kategoria1&lok=lokalizacja

Niestety rozwiązanie z OR nie jest odpowiednie
  1. SELECT ... WHERE kategoria='".$_GET['kat']."' OR lokalizacja='".$_GET['lok']."'

bowiem np. w kategorii 1 wyświetlane są również dane z innych kategorii ale o podanej lokalizacji, a mi chodzi o to, żeby były wyświetlane dane tylko z wybranej kategorii i wybranej lokalizacji, chodzi o zawężenie wyświetlenia do kolejnego kryterium.

Czy mógłbym to tak rozwiązać:

  1. SELECT ... WHERE kategoria='".$_GET['kat']."' AND (lokalizacja='".$_GET['lok']."' OR lokalizacja='')


lokalizacja='' miałoby oznaczać że w ogóle nie występuje w adresie.

Kombinuje w ten sposób, bo jak np. wybiorę sama kategorię to wtedy mi nic nie wyświetla bo adres wygląda tak: kategoria.php?kat=kategoria1
a jak wybiore kategorie i lokalizacje to tak: kategoria.php?kat=kategoria1&lok=lokalizacja2
BaN
  1. if (isset($_GET['kat']) && (strlen($_GET['kat']) > 0)) {
  2. $query = "SELECT ... WHERE kategoria='" . mysql_real_escape_string($_GET['kat']) . "'";
  3. if (isset($_GET['lok']) && (strlen($_GET['lok']) > 0)) {
  4. $query .= " AND lokalizacja='" . mysql_real_escape_string($_GET['lok']) . "'";
  5. }
  6. $query .= ' ORDER BY dane DESC';
  7. }
kosior11
Wielkie dzięki za pomoc w rozwiązaniu działa jak chciałem!

Pozdrawiam!

Witam!

Ktoś wie co w tym kodzie jest nie tak?

  1. if (isset($_GET['kat']) && (strlen($_GET['kat']) = 0)) {
  2. $query = "SELECT id,...,kategoria,podkategoria,lokalizacja, FROM tabela";
  3. if (isset($_GET['kat']) && (strlen($_GET['kat']) > 0)) {
  4. $query = " WHERE kategoria='" . mysql_real_escape_string($_GET['kat']) . "'"; }
  5. if (isset($_GET['lok']) && (strlen($_GET['lok']) > 0)) {
  6. $query .= " AND lokalizacja='" . mysql_real_escape_string($_GET['lok']) . "'";
  7. }
  8. $query .= ' ORDER BY rodzaj_konta DESC, dane DESC';
  9. }


Kod przedstawiony przez Bana działa poprawnie, ale chciałem go trochę zmodyfikować i już nie działa.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.