Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> PHP - checkbox, mysql, wyświetlanie danych
Omin
post
Post #1





Grupa: Zarejestrowani
Postów: 21
Pomógł: 0
Dołączył: 18.08.2014

Ostrzeżenie: (0%)
-----


Witam wink.gif
Potrzebuje waszej pomocy. Chodzi o to, że chciałbym wyświetlić dane z bazy (dane zaznaczone w checkbox).

  1. <input type="checkbox" name="specjalizacje[]" value="Fitness"> Fitness<br>
  2. <input type="checkbox" name="specjalizacje[]" value="Trening ogólnorozwojowy"> Trening ogólnorozwojowy


Mam te 2 pola i chciałbym zrobić tak, że zaznaczając 2 wyszukało by mi z bazy danych pola, które w nazwie mają Fitness i Trening ogólnorozwojowy.
Pozdrawiam
Go to the top of the page
+Quote Post
Tomplus
post
Post #2





Grupa: Zarejestrowani
Postów: 1 879
Pomógł: 230
Dołączył: 20.03.2005
Skąd: Będzin

Ostrzeżenie: (0%)
-----


Od biedy można stworzyć takie zapytanie.

SELECT * FROM `tabela_treningu`WHERE specjalizacje IN ('".$specjalizacje[0]."', '".$specjalizacje[1]."');
Go to the top of the page
+Quote Post
Omin
post
Post #3





Grupa: Zarejestrowani
Postów: 21
Pomógł: 0
Dołączył: 18.08.2014

Ostrzeżenie: (0%)
-----


Chcę stworzyć wyszukiwarkę po specjalizacjach danych osób i u mnie to wygląda ta:

w bazie danych mam 3 tabele:
-Osoby (ID, imie,nazwisko,lokalizacja)
-Specjalizacje (ID_specjalizacji,nazwa)
-TabelaŁącząca(ID,ID_specjalizacji)

TabelaŁącząca łączy tabele Osoby oraz Specjalizacje.
Chciałbym by użytkownik, który zaznacza pole typu checkbox (np. Fitness, trening ogólnorozwojowy) i klikając przycisk "Szukaj" wyszukiwał osób które w bazie danych mają w nazwie Specjalizacji właśnie te nazwy.

Moje pytanie dotyczy zapytania. Robiąc zapytanie takie:
  1. SELECT * FROM Osoby INNER JOIN Tabelalaczaca ON Osoby.ID=Tabelalaczaca.ID INNER JOIN Specjalizacje ON Tabelalaczaca.ID_specjalizacji=Specjalizacje.ID_specjalizacji WHERE nazwa IN ('Fitness','Trening ogólnorozwojowy' )

Pokazuje mi 2 rekordy (ta sama osoba lecz z różną nazwą speclajizacji - bo 1 osoba może mieć ich kilka)
Pytanie brzmi w jaki sposób zrobić tak by rekordy się nie duplikowały lecz by pokazało np. jeden rekord który ma dwie wartości z pól checkbox?

Pozdrawiam wink.gif
Go to the top of the page
+Quote Post
Tomplus
post
Post #4





Grupa: Zarejestrowani
Postów: 1 879
Pomógł: 230
Dołączył: 20.03.2005
Skąd: Będzin

Ostrzeżenie: (0%)
-----


to zamiast IN użyj po prostu AND

(nazwaLIKE '".$specjalizacje[0]."' AND nazwa LIKE '".$specjalizacje[1]."')

Go to the top of the page
+Quote Post
trueblue
post
Post #5





Grupa: Zarejestrowani
Postów: 6 806
Pomógł: 1828
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


Użyj GROUP BY na id osoby.
AND tu nic nie pomoże - nie wybierze żadnego rekordu.


--------------------
Go to the top of the page
+Quote Post
Omin
post
Post #6





Grupa: Zarejestrowani
Postów: 21
Pomógł: 0
Dołączył: 18.08.2014

Ostrzeżenie: (0%)
-----


Group by pomogło wink.gif
Napotkałem kolejny problem... Jako że wyszukuje poprzez ustawienie lokalizacji oraz specjalizacji rekordy nie są pokazywane w przypadku zaznaczenia tylko lokalizacji.

  1. SELECT `name`,`info`,`lokalizacja`,`silownia`,`nazwa` FROM `persons` INNER JOIN laczenie_sp ON persons.ID=laczenie_sp.ID INNER JOIN specjalizacje ON laczenie_sp.ID_specjalizacji=specjalizacje.ID_specjalizacji WHERE `lokalizacja` = '$lokalizacja' OR `nazwa` IN ('$specjalizacje[0]','$specjalizacje[1]') GROUP BY persons.ID


Macie jakieś pomysły? Zmieniając AND na OR w klauzuli WHERE dochodze tylko do tego, że pokazuje mi rekord spełniające jedno wymaganie LUB drugie.
Nie wiem... może jakieś podzapytanie

Pozdrawiam
Go to the top of the page
+Quote Post
trueblue
post
Post #7





Grupa: Zarejestrowani
Postów: 6 806
Pomógł: 1828
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


Buduj dynamicznie parametry dla klauzuli WHERE.
Nie tylko w tym przypadku rozwiąże to Twój problem, ale w przypadku kiedy dojdą nowe specjalizacje (będziesz wtedy dodawał je ręcznie w klauzuli WHERE?)


--------------------
Go to the top of the page
+Quote Post
Omin
post
Post #8





Grupa: Zarejestrowani
Postów: 21
Pomógł: 0
Dołączył: 18.08.2014

Ostrzeżenie: (0%)
-----


W jaki sposób mam budować te dynamiczne parametry?
Jakbyś mógł podpowiedzieć jak w necie to wyszukać to bym o tym poczytał wink.gif
Go to the top of the page
+Quote Post
trueblue
post
Post #9





Grupa: Zarejestrowani
Postów: 6 806
Pomógł: 1828
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


https://www.google.com/search?q=php+sql+in+clause+checkboxes


--------------------
Go to the top of the page
+Quote Post
Omin
post
Post #10





Grupa: Zarejestrowani
Postów: 21
Pomógł: 0
Dołączył: 18.08.2014

Ostrzeżenie: (0%)
-----


Dziękuję, może jakoś uda mi się to ogarnąć wink.gif


Udało mi się zrobić dynamicznie checkboxy w taki sposób:

  1.  
  2. $sprawdzenie_specjalizacji = mysqli_query($db,"SELECT * FROM `specjalizacje`");
  3.  
  4. while ($specjalizacje_info = mysqli_fetch_array($sprawdzenie_specjalizacji)) {
  5. $specjalizacje_tablica[] = $specjalizacje_info;
  6. }
  7.  
  8. foreach ($specjalizacje_tablica as $key => $value) {
  9.  
  10. echo '<input type="checkbox" name="specjalizacje[]" value="'.$value['ID_specjalizacji'].'">'.$value['nazwa'].'<br>';
  11. }
  12.  


Moglibyście podpowiedzieć jak wysłać teraz dane do bazy danych? Póki co zrobiłem tak, że sprawdzam ID ostatniej osoby która się zapisuje tym oto zapytaniem:
  1. SELECT `ID` FROM `persons` ORDER BY `ID` DESC LIMIT 1


i teraz chciałbym wysłać specjalizacje do tabeli która łączy osoby ze specjalizacjami. Nie wiem jak zrobić to by wysłało np do osoby o ID 8 specjalizacje o ID 1,2,3 w osobnych rekordach.
W tabeli pola wyglądają tak:

ID_osoby | ID_specjalizacji


Chciałbym by po wyborze specjalizacji wyglądało to mniej więcej tak:


ID_osoby | ID_specjalizacji
1 ------------------ 1
1 ------------------ 2
1 ------------------ 3

Pozdrawiam




--------------------------------------------------

Poradziłem już sobie z problemem wink.gif

Zliczyłem ilość zaznaczonych specjalizacji, dałem to w pętle for i śmiga wink.gif

Ten post edytował Omin 5.03.2017, 13:20:20
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 19.08.2025 - 07:31