• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Pytanie PHP/SQL/MYSQL

Object Storage Arubacloud
0 głosów
281 wizyt
pytanie zadane 22 lutego 2019 w SQL, bazy danych przez zerakot Obywatel (1,870 p.)
Witam,

Mam kod(taki niby sklep) i w nim chcę zrobić coś takiego jak na np. Allegro, że po wyszukaniu przedmiotu wszystkie produkty są wyświetlane tak, że każdy jest w innym divie.

 

Jak sformułować zapytanie sql, aby wybierało tylko ten produkt, który nie jest w innym divie?

1 odpowiedź

+1 głos
odpowiedź 22 lutego 2019 przez Arkadiusz Waluk Ekspert (287,950 p.)

W ogóle źle do tego podchodzisz. Baza danych nie rozumie czy coś jest w divie, nie wie czy coś jest wyświetlane gdziekolwiek. Nawet sam PHP nie wie czy coś jest w divie, on po prostu wyświetla tekst, który może być kodem HTML, który sparsuje sobie przeglądarka. Baza po prostu trzyma dane, możesz coś tam dodać, może Ci je zwrócić... Sam musisz pomyśleć jak to rozwiązać. Tak najprościej wydaje się, że trzymać id już wyświetlonych produktów i przy zapytaniu do bazy zaznaczyć, aby id było inne od nich. Ale pewnie można to zoptymalizować i próbować wybrać wszystko jednym zapytaniem. Zależy jak dokładnie masz to zrobione i co trzeba uzyskać.

 

PS tytułuj normalnie tematy na forum, bo ostatnich kilka i niektóre wcześniejsze mówią tylko że jest "problem" (jak w większości tematów tutaj) i wskazują język, który już przecież określa kategoria

komentarz 22 lutego 2019 przez zerakot Obywatel (1,870 p.)
Ok, pomyślę jak rozwiązać ten problem i postaram się lepiej tytuły  dostosowywać.
komentarz 22 lutego 2019 przez zerakot Obywatel (1,870 p.)

@Arkadiusz Waluk,
a czy jest jakiś mechanizm albo cokolwiek co zapobiegałoby powtarzaniu produktów?

Albo sprawdzałoby czy "coś" o danym id jest użyte? Wtedy za pomocą pętli robiło tak w kółko aż nie znajdzie wolnego.

komentarz 22 lutego 2019 przez Arkadiusz Waluk Ekspert (287,950 p.)
Tak jak mówiłem musiałbyś do zapytania dodawać warunek wykluczający dane id. Tylko nie możesz, tak jak mówiłem wcześniej, wybrać tych wszystkich produktów na raz? Wtedy nie będą się powtarzały automatycznie. Jaki jest powód tego, aby wyciągać je pojedynczo?
komentarz 22 lutego 2019 przez zerakot Obywatel (1,870 p.)
Ponieważ chcę zrobić, aby pętla wsadzała do divów po kolei wszystkie moje produkty czyli, że wstawia do div id="1" id o najmniejszej wartości, jaką znalazło i tak aż nie wstawi ostatniego produktu, a chcę, aby się powtarzały ponieważ moja "wyszukiwarka" jeśli wpiszemy "domek" to wyświetli produkt o nazwie domek i jeśli wpiszemy "do" to też wyświetli domek. Więc dlatego pojedynczo, aby mogła to robić pętla
komentarz 22 lutego 2019 przez zerakot Obywatel (1,870 p.)
Chyba, że mogłoby mi te duplikaty wysłać w tablicy. Może ma pan inne propozycje?
komentarz 22 lutego 2019 przez Arkadiusz Waluk Ekspert (287,950 p.)
To w końcu mają się powtarzać duplikaty czy nie? Tak czy siak nadal nie rozumiem. Jeśli będziesz czegoś szukał to jak rozumiem jedną frazą. Czyli wpisując "do" dopasuje "domek" i wyświetli go jednego. Później ktoś edytuje frazę wyszukiwania, zmienia na domek, poprzednie wyniki są czyszczone i podobnie dopasowało "domek" więc go wyświetla. Jeśli masz jedną wyszukiwarkę i w tabeli po jednym danym produkcie to nie wiem czemu i jak miałyby się powtarzać.
komentarz 22 lutego 2019 przez zerakot Obywatel (1,870 p.)
Ale jeśli mam tabelę i np.: domek dla psa oraz domek dla lalek to powinny mi wyskoczyć dwa, i planuję mieć więcej rzeczy o takim samym kawałku nazwy np.: wino białe, wino czerwone. Więc wie pan jak zrobić, aby z bazy były pobierane wszystkie rekordy w formie tabeli lub najlepiej pojedynczo?
komentarz 22 lutego 2019 przez Arkadiusz Waluk Ekspert (287,950 p.)
Dalej nie rozumiem niestety. Masz dwa, więc robisz zapytanie z LIKE %wino%, to zwraca Ci dwa rekordy bez żadnych powtórzeń, następnie bierzesz pętlę, wyświetlasz je jak potrzebujesz i gotowe. Bez jakichś dziwnych kombinacji.
komentarz 22 lutego 2019 przez zerakot Obywatel (1,870 p.)
Tak, ale one na siebie nachodzą i nie wiem jak powsadzać je do oddzielnych zmiennych
komentarz 22 lutego 2019 przez Arkadiusz Waluk Ekspert (287,950 p.)
To trzeba je lepiej ułożyć, kwestia tylko wyświetlenia czy ewentualnie dostosowania frontu. Jaki sens ma takie kombinowanie, wykluczanie, robienie wielu zapytań które tylko obciążą bazę (jakbyś miał wyświetlić 500 produktów to byś zrobił 500 zapytań!?) jak można po prostu naprawić wyświetlanie.
komentarz 22 lutego 2019 przez zerakot Obywatel (1,870 p.)
No właśnie jak je ułożyć? Za pomocą marginesów?
komentarz 22 lutego 2019 przez Arkadiusz Waluk Ekspert (287,950 p.)
Myślę że wypadałoby użyć np. flexboxa, wydzielić ładnie każdy produkt i układać to w jakieś kolumny. Ostatecznie jakaś tabela.
1
komentarz 22 lutego 2019 przez zerakot Obywatel (1,870 p.)
Ok, to dzięki za pomoc
komentarz 23 lutego 2019 przez zerakot Obywatel (1,870 p.)

@Arkadiusz Waluk,

No problem nadal występuje, więc wyślę kod:

<div class="produktwyszukany">
				<div class="zdjecie">
				<?php if($wynik = $mysqli->query($query)) 
				{
					while($row = $wynik->fetch_assoc()) 			
					printf("%s %s\n", "<img src='".$row["zdjecie"]."'/>", $row["pusta"]);
				} ?>
				</div>
				<div class="nazwa">
				<?php if($wynik = $mysqli->query($query)) 
				{
					while($row = $wynik->fetch_assoc()) 			
					printf("%s %s\n", $row["nazwa"], $row["pusta"]);
				} ?>
				</div>
				<div class="kategoria">
				<?php if($wynik = $mysqli->query($query)) 
				{
					while($row = $wynik->fetch_assoc()) 			
					printf("%s %s\n", $row["kategoria"], $row["pusta"]."<br />");
				} ?>
				</div>
				<div class="cena">
				<?php if($wynik = $mysqli->query($query)) 
				{
					while($row = $wynik->fetch_assoc()) 			
					printf("%s %s\n", $row["cena"], $row["pusta"]."zł");
				} ?>
				</div>
</div>

Może to, że w divach jest kod PHP zmienia coś, ponieważ nie mogę ich rozdzielić.

komentarz 23 lutego 2019 przez Arkadiusz Waluk Ekspert (287,950 p.)
Ale po co tu jest tyle pętli? Po co zapytanie jest wykonywane tyle razy? Ja to widzę tak jak mówiłem: jedno zapytanie wyciągające te posty, jedna pętla i tam wyświetlanie jako kolejne elementy odpowiednio układane przez CSS.
komentarz 23 lutego 2019 przez zerakot Obywatel (1,870 p.)
A jak inaczej posadzał bym je do innych divów?
komentarz 23 lutego 2019 przez Arkadiusz Waluk Ekspert (287,950 p.)
Nie bardzo rozumiem jak inaczej i do jakich innych divów. Nie wystarczy jedna pętla, która wyrzuci wszystkie wyniki po kolei?
komentarz 23 lutego 2019 przez zerakot Obywatel (1,870 p.)
No, ale jak później je wystylizuję w CSS jak nie będą w divach?
komentarz 23 lutego 2019 przez Arkadiusz Waluk Ekspert (287,950 p.)
Przecież możesz zrobić pętlę, która wyświetli Ci dowolne divy. Element o klasie produktwyszukany to jest wyświetlanie jednego produktu? To daj pętlę wyżej i niech ta przechodzi po wszystkich rekordach i wyrzuca dla każdego element o tej klasie i wszystko co potrzebne w nim.
komentarz 23 lutego 2019 przez zerakot Obywatel (1,870 p.)
Nie bardzo rozumiem, ta pętla miałaby pobrać wszystkie rekordy z bazy i co z nimi zrobić?
komentarz 23 lutego 2019 przez Arkadiusz Waluk Ekspert (287,950 p.)
Przygotować dla nich kod HTML, który docelowo wyświetlisz? Chyba do tego dążysz, aby wszystko to zostało odpowiednio wyświetlone.
komentarz 23 lutego 2019 przez zerakot Obywatel (1,870 p.)
Ja chcę pobrać informacje z bazy danych i je odpowiednio wystylizować w CSS, ale nie wiem jak ten kod PHP przerobić, abym mógł jego wynik edytować w CSS
komentarz 23 lutego 2019 przez Arkadiusz Waluk Ekspert (287,950 p.)
Wyniku nie edytujesz w CSS, ale to jak się domyślam skrót myślowy. CSS jest nieodłączny od HTML. Musisz ustalić jakąś strukturę tego HTMLa i w PHP taką sobie przygotować, wypisać. CSSem później to wystylizujesz normalnie dołączając arkusz. Wyrzucenie kodu HTML byle jak nie ma przecież sensu, musi to być jakiś zamierzony layout, który doprawi CSS.
komentarz 23 lutego 2019 przez zerakot Obywatel (1,870 p.)
No to jak pobrać wszystkie wartości i wsadzić je pojedynczo do struktury? Może pobiorę je jakoś w formie tablicy i po indeksach tablicy porozdzielam je?
komentarz 23 lutego 2019 przez Arkadiusz Waluk Ekspert (287,950 p.)
No ja ciągle nie rozumiem jaki w tym jest problem i ciągle mam takie samo zdanie: zrobić jedno zapytanie które pobierze wszystkie potrzebne produkty, w pętli przeiterować się po każdym produkcie po kolei i wygenerować dla każdego z nich odpowiedni HTML.
komentarz 23 lutego 2019 przez zerakot Obywatel (1,870 p.)
No teraz rozumiem, że pętla ma generować strukturę
komentarz 24 lutego 2019 przez zerakot Obywatel (1,870 p.)
edycja 24 lutego 2019 przez zerakot

I jak teraz mam zrobić, aby jeśli mam produkty o nazwie np.: woda mineralna i woda gazowana (wyszukam "woda") to jak mam je rozdzielić, aby trafiły do różnych divów, skoro są wyjęte jednym zapytaniem?

Kod:

<div class="produktwyszukany">
				<div class="nazwa">
				<?php if($wynik = $mysqli->query($query)) 
				{
					while($row = $wynik->fetch_assoc()) 			
					printf("%s %s\n", "<img src='".$row["zdjecie"]."'/>", $row["nazwa"]);
					printf("%s %s\n", $row["kategoria"], $row["cena"]);
				} ?>
				</div>
				<div class="kupprodukt">KUP</div>
				<div class="opis" onhover="opis()">OPIS</div>
</div>	

 

komentarz 24 lutego 2019 przez Arkadiusz Waluk Ekspert (287,950 p.)

Zakładając, że $row jest wierszem zawierającym jeden produkt i każdy produkt powinien znaleźć się w całym elemencie o klasie produktwyszukany to bardzo prosto:

<?php
// ...
$wynik = $mysqli->query($query);
while ($row = $wynik->fetch_assoc()) {
    echo '<div class="produktwyszukany">' . $row['nazwa'] . ' ... </div>';
}

Oczywiście musisz to sobie rozbudować o dalszą konieczną strukturę. No i idealnie byłoby nie mieszać logiki z HTML i stosować inne dobre praktyki, ale to chyba nie na teraz temat. Nie wiem czy mi się to wydaje tak proste, czy może źle tłumaczę, czy nie rozumiem co trzeba zrobić i jest to faktycznie tak trudne.

komentarz 24 lutego 2019 przez zerakot Obywatel (1,870 p.)
No to już widzę problem, ponieważ ja nie używałem kropki przy $row, ale przecinki. Dobrze pan tłumaczy, po prostu ja źle zrozumiałem. Dziękuję za pomoc.
komentarz 24 lutego 2019 przez Arkadiusz Waluk Ekspert (287,950 p.)
Jeśli mowa o printf, którego używałeś, to tam być powinny przecinki, bo podajesz kolejne argumenty. Ja po prostu zrobiłem konkatenację stringów i wyświetliłem je przez echo (normalnie jak wspomniałem to powinno być całkowicie inaczej, rozwiązanie na szybko).

Jeżeli to co podałem jest dobrze, to Twoim problemem było robienie pętli gdzieś wewnątrz jednego produktu, a nie pętli generującej całe struktury HTML po jednej dla każdego produktu.

Podobne pytania

0 głosów
2 odpowiedzi 324 wizyt
pytanie zadane 15 lutego 2019 w SQL, bazy danych przez zerakot Obywatel (1,870 p.)
0 głosów
1 odpowiedź 192 wizyt
pytanie zadane 21 lutego 2019 w SQL, bazy danych przez zerakot Obywatel (1,870 p.)
0 głosów
0 odpowiedzi 141 wizyt
pytanie zadane 20 lutego 2019 w SQL, bazy danych przez zerakot Obywatel (1,870 p.)

92,579 zapytań

141,431 odpowiedzi

319,657 komentarzy

61,963 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...