Skocz do zawartości

PHP+SQL - Pętla w pętli...


dielektryk

Rekomendowane odpowiedzi

Mam 2 tabele w bazie - Kategorie i Podkategorie

Zrobiłem "książkowo" pętle do pobierania kategorii, a w niej drugą pętle do pobierania podkategorii.

//Pobieranie kategorii
while ($row = mysql_fetch_array($zapytanie1)) {

 //Pobieranie podkategorii
while ($row2 = mysql_fetch_array($zapytani2)) {

// Wyświetlenie danych na ekranie
echo ....
}
}

Wszystko działa jak należy, wyświetlają się na ekranie Kategorie z rozwiniętymi podkategoriami i odnośnikami do nich.

Pojawił się problem, w miarę dodawania kolejnych rekordów skrypt strasznie zwalnia.

Na stronie podręcznika PHP na Wikipedii znalazłem informację, że nie należy robić pętli w pętli, że należy wyciągać informacje w 2-3 zapytaniach.... ale przykład jest w php obiektowym którego nie znam :)

Czy może ktoś podsunąć proste rozwiązanie (php proceduralny)?

Pytanie drugie.

Jak obronić się przed SQL Injection?

Czy możecie polecić w sieci jakiś dobry artykuł na ten temat?

Strony które przeczytałem to zlepki tych samych zdań bez konkretnych przykładów.

Kurs SEP w Twoim mieście. Gdy zdobędziesz uprawnienia SEP praca dla elektryka sama Cię znajdzie.
Odnośnik do komentarza
Udostępnij na innych stronach

Zrobiłem "książkowo" pętle do pobierania kategorii, a w niej drugą pętle do pobierania podkategorii.

Nie wierzę, żeby było to opisane w jakiekolwiek książce.

Zrobiłeś to bo tak ci się wydawało, że będzie dobrze, tymczasem wrzucanie zapytań do pętli to skrajny przykład niewydajności.

Czy może ktoś podsunąć proste rozwiązanie (php proceduralny)?

Tak jednym zapytaniem:

SELECT po podkategoriach z JOIN kategorie głównych i ORDER BY po głównych.

Pytanie drugie.

Jak obronić się przed SQL Injection

Nie wsadzać do zapytań parametrów z GET lub POST lub wsadzać je w pełni świadomie (np po sprawdzeniu danych).

Odnośnik do komentarza
Udostępnij na innych stronach

Zrobiłem "książkowo" pętle do pobierania kategorii, a w niej drugą pętle do pobierania podkategorii.

Nie wierzę, żeby było to opisane w jakiekolwiek książce.

Zrobiłeś to bo tak ci się wydawało, że będzie dobrze, tymczasem wrzucanie zapytań do pętli to skrajny przykład niewydajności.

Przykłady książkowe:

1. "PHP5, Apache i MySQL Od Podstaw" wyd. Helion - strona 130

2. "PHP, MySQL i Apache dla każdego" wyd. Helion - strona 405

Kurs SEP w Twoim mieście. Gdy zdobędziesz uprawnienia SEP praca dla elektryka sama Cię znajdzie.
Odnośnik do komentarza
Udostępnij na innych stronach

Czasami przykłady książkowe służą do objaśnienia działania jakiejś funkcji/metody itp. co nie znaczy że tak należy robić.

Niestety nie mam żadnej z książek które podałeś aby napisać co autor miał na myśli. A kod wyrwany z kontekstu nie za wiele mi mówi.

Ogólne zasady mówią o tym żeby myśleć przy pisaniu, czasami im mnie zapytań tym lepiej chyba że to jest z jakiś względów niemożliwe niewskazane.

Coś takiego jak lista kategorii da sie jednym zapytaniem wyciągnąć

Odnośnik do komentarza
Udostępnij na innych stronach

Polecam poczytać sobie o łączeniu tabel. JOIN'y lub nawet najprostsze porównanie po kluczach w WHERE.

Jak nie dasz rady daj schemat tych dwóch tabel, napisz co chcesz dokładnie wyciągnąć a ja albo ktoś inny pomożemy Ci rozwiązać Twój problem.

Co do SQL Injection to sprawdzaj zmienne przed "włożeniem" ich do zapytania. Np. jak ma być to liczba to niech będzie to liczba.

Odnośnik do komentarza
Udostępnij na innych stronach

Chcę zbudować tablice ogłoszeniową z ofertami pracy, szkoleń, kursów, Sprzedam, Kupię, Zamienie.....

Po wejściu na stronę główną wyświetlają się kategorie (Dam Prace, Szukam Pracy, Szkolenia, Sprzedam, Kupie) i pod każdą z kategorii 5 ostatnich ogłoszeń z danej kategorii.

Baza (gwiazdka* - to założone indeksy):

1) Tabela 'Kategorie'

(IdKat* | NazwaKategorii)

1 | Szukam Pracy

2 | Dam Pracę

3 | Motoryzacja

4 | Sprzedam

5 | Kupię

2) Tabela 'Podkategorie'

(IdPodKat | IdKat* | Ogłoszenia)

1 | 1 | "Szukam pracy nr1"

2 | 1 | "Szukam pracy nr2"

3 | 4 | "Sprzedam nr1"

4 | 2 | "Zatrudnię nr1"

5 | 1 | "Szukam pracy nr3"

6 | 5 | "Kupię nr1"

W tej chwili mam 2 pętle.

W pierwszej pętli wyciągam kolejno Kategorie, a w drugiej ostatnie 5 ogłoszeń z danej kategorii.

Zapytanie do bazy z drugiej pętli:

SELECT IdPodKat, Ogloszenie FROM Podkategorie, Kategorie WHERE Kategorie.IdKat = PodKategorie.IdKat ORDER BY IdPodKat DESC LIMIT 5;

Podejrzewam, że problem ma banalne rozwiązanie, a ja z tego zrobiłem potworka programowego.

(oczywiście w bazie są zapisani użytkownicy, data ogłoszenia, data ważności... chodzi mi o idee, a nie całą bazę danych)

Kurs SEP w Twoim mieście. Gdy zdobędziesz uprawnienia SEP praca dla elektryka sama Cię znajdzie.
Odnośnik do komentarza
Udostępnij na innych stronach

A nie lepiej to zrobić tak:

1) Tabela 'Kategorie'

category_id

name

description

type_id

parent_id

dodatkowe_pole...

?

Wiązanie po category_id i parent_id.

Wlatujesz rekurencyjnie w to i wyciągasz dowolne dane.

"select * from kategorie where parent_id='".addslahes($parent_id)."' order by ....;";

Jeżeli potrzeba żeby był typ kategorii jakiś szczególny to dajesz dodatkowo:

type_id (np. int)

i w osobnej tabeli:

category_type

id_type

name

type_descr...

wtedy dajesz np.:

"select k.cos from kategorie as k left join category_type as c on (c.type_id=k.type_id) where k.parent_id..... and cos...";

Marketing w sieci - da się ?
Odnośnik do komentarza
Udostępnij na innych stronach

Baza (gwiazdka* - to założone indeksy):

1) Tabela 'Kategorie'

(IdKat* | NazwaKategorii)

1 | Szukam Pracy

2 | Dam Pracę

3 | Motoryzacja

4 | Sprzedam

5 | Kupię

2) Tabela 'Podkategorie'

(IdPodKat | IdKat* | Ogłoszenia)

1 | 1 | "Szukam pracy nr1"

2 | 1 | "Szukam pracy nr2"

3 | 4 | "Sprzedam nr1"

4 | 2 | "Zatrudnię nr1"

5 | 1 | "Szukam pracy nr3"

6 | 5 | "Kupię nr1"

przecież napisałem rozwiązanie !

SELECT * FROM Podkategorie JOIN Kategorie ON Podkategorie.IdKat=Kategorie.IdKat WHERE 1

Nic więcej a w pętli .. to można te wyniki wyświetlić.

Odnośnik do komentarza
Udostępnij na innych stronach

mrtn nie krzycz :) poprosiłem o schemacik i dokładniejszy opis bo nie byłem pewny czy dobrze zrozumiałem problem i mi go przedstawił...

no i wydaje mi się, że Twoje zapytanie wyciągnie wszystkie ogłoszenia jakie są w bazie a nie 25 (po 5 najnowszych z każdej kategorii)

Odnośnik do komentarza
Udostępnij na innych stronach

no i wydaje mi się, że Twoje zapytanie wyciągnie wszystkie ogłoszenia jakie są w bazie a nie 25 (po 5 najnowszych z każdej kategorii)

K...a :) płakać mi się chce :)

ja nie napiszę za ciebie twojego programu - warunki ON, WHERE możesz sobie ustawić sam. Po za tym pisałeś o pobieraniu drzewa kategorii a nie samych ogłoszeń !

Odnośnik do komentarza
Udostępnij na innych stronach

Nie ma co sie denerować raczej śmiać przez łzy.

Młody człowiek widać nie kuma że ludzie na forach nie sa po to aby pisać za niego tylko żeby raczej podpowiadać rozwiązanie aby trochę wysilił swój mózg. A bez znajomości podstaw SQL-a to myśle ze żaden programista PHP za daleko nie zajedzie

Odnośnik do komentarza
Udostępnij na innych stronach

mrtn to czytaj ze zrozumieniem a potem płacz. Napisał wyraźnie czego chce.

Po wejściu na stronę główną wyświetlają się kategorie (Dam Prace, Szukam Pracy, Szkolenia, Sprzedam, Kupie) i pod każdą z kategorii 5 ostatnich ogłoszeń z danej kategorii.

dielektryk dobrze robisz ale zmień na JOIN'a i zobacz czy to coś da. W skrócie wyglądać powinno to tak:

function getLast5($kategoria) {
$zapytanie = "SELECT 
	Kategorie.NazwaKategorii, 
	Podkategorie.IdPodKat, 
	Podkategorie.Ogloszenie 
FROM 
	Podkategorie 
LEFT JOIN 
	Kategorie 
ON 
	Podkategorie.IdKat = Kategorie.IdKat
WHERE
	Podkategorie.IdKat=".$kategoria."
ORDER BY
	Podkategorie.DataDodania DESC
LIMIT 5";

   //wykonanie zapytania

while ($row = mysql_fetch_array($wynikZapytania)) {

	// Wyświetlenie danych na ekranie
	echo $row['NazwaKategorii'];
	echo ...
}
}

I tak dla każdej kategorii możesz to wykonać.

Podkategorie.DataDodania można zmienić np. na Podkategorie.IdPodKat jak nie masz dat dodania w tabeli.

Sam innego rozwiązania nie znam, sprawdź czy to Ci pomoże.

Odnośnik do komentarza
Udostępnij na innych stronach

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.
×
×
  • Dodaj nową pozycję...

Powiadomienie o plikach cookie

Umieściliśmy na Twoim urządzeniu pliki cookie, aby pomóc Ci usprawnić przeglądanie strony. Możesz dostosować ustawienia plików cookie, w przeciwnym wypadku zakładamy, że wyrażasz na to zgodę. Warunki użytkowania Polityka prywatności