Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP]PHP + MySQL + Apache2 - Tworzenie kategorii
Forum PHP.pl > Forum > Przedszkole
nama
Cześć,
Chciałbym zrobić stronę, na której będzie można dodawać kategorie oraz produkty. Będzie to wyglądać tak:

-Kategoria 1:
-------Produkt 1,
-------Produkt 2,
-------Produkt 3,

-Kategoria 2:
-------Produkt 1,
-------Produkt 2,
-------Produkt 3,

-Kategoria 3:
-------Produkt 1,
-------Produkt 2,
-------Produkt 3,

Utworzyłem bazę o nazwie "baza1", w której znajdują się dwie tabele: "kat" oraz "poz".

W tabeli "kat" występują następujące pola: "id", "kategoria".
W tabeli "poz" występują następujące pola: "nazwa", "kategoria_kat".

Następnie zabrałem się do pisania skryptu.



Problem w tym, że jest to zupełnie nie zautomatyzowane. Za każdym razem, musiałbym do strony dodawać w kodzie linijki i zmieniać numery przy SELECT.

Jak to zautomatyzować?

Pozdrawiam
marck
Przede wszystkim strasznie komplikujesz. powinno to być tak.

1. Tworzysz 2 tabelki (1 kategorie : z polami np : id_kat, nazwa_kat | 2 Produkty - gdzie robisz pola id_prod, nazwa_prod, id_kat)
2. Piszesz zapytanko wypisujące np ja to robię choćby tak:
  1. echo"<table>";
  2.  
  3. $pokaz=mysql_query("SELECT * FROM produkty, kategorie WHERE kategorie.id_kat=produkty.id_kat");
  4. while($ln=mysql_fetch_array($pokaz)){
  5. $katname=$ln['nazwa_kat'];
  6. $prodname=$ln['nazwa_prod'];
  7. echo"<tr><td>$prodname</td><td>$katname</td></tr>\r\n";
  8. }
  9. echo"</table>";
  10.  


Możesz dodać grupowanie po id_kat, i tyle
nama
Mhm, więc zrobiłem tak jak doradziłeś. Jednak efekt jest inny. Z moim while i dwoma SELECTami mam możliwość tak zapętlić te wyniki, aby kategoria była wyświetlana jako nagłówek. W Twoim przykładzie kategorii w ten sposób nie wyświetlę. Nie jestem programistą i z algorytmów byłem noga. Najzwyczajniej nie mieści mi się w głowie działanie pewnych rzeczy. Ale dalej proszę o pomoc lub żebyś wytłumaczył jak można do nagłówka wstawić kategorię z Twojego przykładu:



EDIT:
Cel osiagnalem w ten sposob. Zapetlilem to uzywajac FOR i zmniejszajac $n. Pytanie: Czy jest to poprawne pod wzgledem "gramatycznym" jezyka php?

  1. for ($n = 3; $n > 0; $n--)
  2. {
  3. $sql_select1 = mysql_query("SELECT `kategoria` FROM `kat` WHERE id = $n");
  4. $sql_select2 = mysql_query("SELECT `nazwa`, `kategoria_kat` FROM `poz` WHERE kategoria_kat = $n");
  5.  
  6. while ($wiersz1 = mysql_fetch_row($sql_select1))
  7.  
  8. {
  9. echo '<table border="1">';
  10. echo '<tr>';
  11. echo '<td>Kat: '.$wiersz1[0].'</td>';
  12. echo '</tr>';
  13. echo '<tr>';
  14. echo '<td>';
  15. while ($wiersz2 = mysql_fetch_row($sql_select2))
  16. {
  17. echo 'Naz: '.$wiersz2[0].'<br>';
  18. }
  19. echo '</td>';
  20. echo '</tr>';
  21. echo '</table>';
  22. }
  23. }
athei
Z tego co rozumiem chcesz pogrupować produkty do kategorii.
To co napisałeś jest bez sensu bo w pętli wykonujesz zapytania, które mogłeś wykonać tylko raz.
To jest dla książek i z użyciem PDO ale powinieneś zrozumieć o co chodzi:
Kategorie: id | nazwa
Ksiazki: id | nazwa | wydawnictwo | kategoria_id
  1. try {
  2. $pdo = new PDO("mysql:host=localhost;dbname=test", 'user', 'pass');
  3. $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_SILENT);
  4. $pdo -> query ('SET NAMES utf8');
  5.  
  6. // pobiera kategorie
  7. $stmt = $pdo -> query('SELECT id, nazwa FROM kategorie ORDER BY id');
  8. $wynik = array();
  9.  
  10. // id = id kategorii, nazwa = nazwa kategorii, ksiazki = tablica z ksiazkami
  11. while($row = $stmt -> fetch())
  12. {
  13. $wynik[$row['id']] = array(
  14. 'nazwa' => $row['nazwa'],
  15. 'ksiazki' => array()
  16. );
  17. }
  18. $stmt -> closeCursor();
  19.  
  20. // pobiera ksiazki
  21. $stmt = $pdo -> query('SELECT nazwa, wydawnictwo, kategoria_id
  22. FROM ksiazki ORDER BY kategoria_id, id');
  23.  
  24. // dodaje ksiazki do tablicy, odpowiednio do okreslonej kategorii
  25. while($row = $stmt -> fetch())
  26. {
  27. $wynik[$row['kategoria_id']]['ksiazki'][] = array(
  28. 'nazwa' => $row['nazwa'],
  29. 'wydawnictwo' => $row['wydawnictwo']
  30. );
  31. }
  32. $stmt -> closeCursor();
  33.  
  34. // wypisanie ksiazek z podzialem na kategorie
  35. foreach($wynik as $kategoria)
  36. {
  37. echo '<h3>'.$kategoria['nazwa'].'</h3>';
  38. foreach($kategoria['ksiazki'] as $ksiazka)
  39. {
  40. echo '<p><i>'.$ksiazka['nazwa'].'</i>
  41. (Wyd. '.$ksiazka['wydawnictwo'].')</p>';
  42. }
  43. }
  44.  
  45. / /tak wyglada tablica
  46. echo '<pre>', print_r($wynik), '</pre>';
  47.  
  48. $pdo = null;
  49. } catch (PDOException $e) {
  50. die( 'ERROR! Problem z polaczeniem do bazy. ' . $e->getMessage() );
  51. }
nama
Hm... jednak nie do końca rozumiem. Czy możesz mi pokazać wynik tego kodu w przeglądarce?

Czy jeżeli kod, który napisałem zrobię tak aby było tylko jedno zapytanie to czy będzie to poprawne pod względem gramatycznym języka php?
athei
Będzie nazwa kategorii i przypisane do niej książki. Zrób sobie dwie tabele albo kod dostosuj do swoich to zobaczysz jak wygląda. Kod jest prosty jak nie rozumiesz to w manualu masz opisy funkcji. Ale i tak powinieneś przerzucić się czy to na mysqli czy pdo.
Poprawne jest wszystko co działa, tylko że jedno jest bardziej optymalne inne mniej.
nama
Dalej tego nie rozumiem... Już kilka dni próbuje to zrobić i wszystko jest dobrze gdy mam mieć tylko jedną kategorię i pozycje do niej. Robię to przy pomocy dwóch zapytań MYSQL oraz dwóch pętli while.

  1. $sql_select1 = mysql_query("SELECT `id`, `nazwa`,`kat` FROM `kat` ORDER BY `nazwa`");
  2. while ($wiersz1 = mysql_fetch_row($sql_select1))
  3. {
  4. echo '<table align="center" width="750" cellpadding="0" cellspacing="0">';
  5. echo '<tr>';
  6. echo '<td><font face="Verdana" size="3" color="#ff440b">'.$wiersz1[1].'</font><font face="Verdana" size="2" color="#fdc79f">&nbsp;-&nbsp;</font>';
  7. echo "<a href='opis.php?idopis=$wiersz1[0]'><font face='Verdana' size='2' color='#fdc79f'><b><i>Zobacz opis środka!</b></a>";
  8. echo '</td>';
  9. echo '</tr>';
  10. echo '</table>';
  11.  
  12. echo '<table align="center" width="750" cellpadding="0" cellspacing="0">';
  13. echo '<tr background="stripe.png">';
  14. echo '<td width="33%"><font face="Verdana" size="2" color="#0099FF"><b>Nazwa</b></font></td>';
  15. echo '<td width="20%"><font face="Verdana" size="2" color="#0099FF"><b>Producent</b></font></td>';
  16. echo '<td><font face="Verdana" size="2" color="#0099FF"><b>Ilość</b></font></td>';
  17. echo '<td><font face="Verdana" size="2" color="#0099FF"><b>Steżenie</b></font></td>';
  18. echo '<td><font face="Verdana" size="2" color="#0099FF"><b>Cena</b></font></td>';
  19. echo '<td><font face="Verdana" size="2" color="#0099FF"><center><b>Zdjęcie</b></center></font></td>';
  20. echo '</tr>';
  21. $n = $wiersz1[2];
  22. $sql_select2 = mysql_query("SELECT `id`, `nazwa`, `producent`,`ilosc`,`stezenie`,`cena`,`zdjecie`,`kat_nr` FROM `poz` WHERE kat_nr = $n ORDER BY `nazwa`");
  23. while ($wiersz2 = mysql_fetch_row($sql_select2))
  24. {
  25. echo '<tr>';
  26. echo '<td><font face="Verdana" size="2" color="#FFFFF">'.$wiersz2[1].'</font></td>';
  27. echo '<td><font face="Verdana" size="2" color="#FFFFF">'.$wiersz2[2].'</font></td>';
  28. echo '<td><font face="Verdana" size="2" color="#FFFFF">'.$wiersz2[3].'</font></td>';
  29. echo '<td><font face="Verdana" size="2" color="#FFFFF">'.$wiersz2[4].'</font></td>';
  30. echo '<td><font face="Verdana" size="2" color="#FFFFF">'.$wiersz2[5].'</font></td>';
  31. echo '<td><center><a href="photos/'.$wiersz2[6].'" rel="lightbox"><img src="camera.png" border="0"></a></center></td>';
  32. echo '</tr>';
  33. }
  34. echo '</table>';
  35. }


Efekt jest taki, że wyniki układają się tak jak chciałem:

- Kategoria1
----- Pozycja1
----- Pozycja2
----- Pozycja3
- Kategoria2
----- Pozycja1
----- Pozycja2
----- Pozycja3
- Kategoria3
----- Pozycja1
----- Pozycja2
----- Pozycja3

Natomiast nie da się (przynajmniej ja nie umiem) zrobić tego samego dla kategorii, podkategorii i pozycji czyli:

- Kategoria1
--- Podkategoria1
------ Pozycja1
------ Pozycja2
------ Pozycja3
--- Podkategoria2
------ Pozycja1
------ Pozycja2
------ Pozycja3
--- Podkategoria3
------ Pozycja1
------ Pozycja2
------ Pozycja3

Czy ktoś może mi jeszcze pomóc?
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.