Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][MySQL]Tworzenie bazy danych - tabele,atrybuty,kategorie
Forum PHP.pl > Forum > Przedszkole
13oRy5
Proszę Was o pomoc i wskazówki dotyczące następujacego zadania/ćwiczenia, które mam wykonać:
Należy stworzyć bazę danych mysql.
Ma zawierać tabele: m.in. PRODUKTY, GRUPA PRODUKTÓW, ATRYBUTY,
w taki spsoób aby każdy produkt posiadał wiele atrybutów i mógł znajdować się
w dowolonej ilości kategorii.

Moje pierwsze pytanie/niestety jestem laikiem w tej materii/:
co to znaczy, żeby produkt miał wiele atrybutów i mógł znajdować się
w dowolnej kategorii?
Gdzie definiuje się atrybuty i kategorie?

Narazie stworzyłem konto na 000webhost.
Stworzyłem bazę danych
oraz za pomocą phpMyAdmin dodałem tabele.

Proszę o wskazówki, bo pewnie to łatwe ale jak już się raz to robiło smile.gif
nospor
Cytat
bo pewnie to łatwe ale jak już się raz to robiło
Napewno jest łatwe jak się już słuchało na wykładach....

Cytat
co to znaczy, żeby produkt miał wiele atrybutów i mógł znajdować się
w dowolnej kategorii?
To co pisze to własnie znaczy. Tu nie ma żadnego haczyka. Czego nie rozumiesz w zdaniu, że ma wiele atrybutów? A jak ktoś powie że ma wiele ołówków to wg. Ciebie co to znaczy? Bo wg. mnie znaczy to ni mniej ni więcej, że ma wiele ołówków

Cytat
Gdzie definiuje się atrybuty i kategorie?
Toż sam napisałeś, że masz tabele ATRYBUTY oraz GRUPA PRODUKTÓW. Po nazwach można stwierdzić, że w pierwszej będą dostępne ATRYBUTY, zaś w drugiej KATEGORIE.

By teraz produkt mógł posiadać wiele atrybutów, należy stworzyć tabelę wiążącą:
PRODUKT_ATRYBUT z polami
ID_PRODUKT
ID_ATRYBUT

I dzięki tej właśnie tabeli produkt będzie mógł posiadać wiele atrybutów.

Analogicznie należy zrobić z kategoriami - też tabela wiąząca kategorię z produktem
CuteOne
Atrybuty:
kolor, waga, szerokość...

Poczytaj o relacjach w bazie danych np.

id_pociag | nazwa
1 | Pociąg ICC
2 | SHX

id_tor | nazwa
1 | A2
2 | A2/3

id_pociag | id_tor
1 | 1
2 | 1
1 | 2

Pobierając pociąg, możesz pobrać za pomocą relacji wszystkie tory, po których jeździ. Pociąg o id 1 jeździ na torach 1 i 2.

ps. przeczytaj parę tutoriali, artykułów czy forów o projektowaniu baz danych
13oRy5
Dziękuję za podpowiedzi.
Przepraszam, za tak prozaiczne pytania
ale sprawa jest pilna i nie moge za dużo czasu poświęcić na szukanie po tutorialach,
stad mój post. Zresztą to nie ucieknie i tak będę musiał ten temat przyswoić.

Ok , ale jeszcze uściślając:
Tworzę np tabelę PRODUKTY:
id produkt | nazwa produkt
jakie typy zmiennych wybrac?
INT(?) | TEXT(?)
zaznaczyłem jeszcze autoincrement dla id.

Ponad to, mam wykonać zapytanie sql do stworoznej bazy danych wyświetlające ilość produktów i ich nazwę
z grupy x
posiadajacych atrybuty, sortując wyniki po kolumnie nazwa przeciwnie do kierunku alfabetu.

Zauważyłem, że w myPhpAdmin jest opcja search i tam są podpowiedzi z kodem.
Czy w ten sposób mozna do tego podejśćquestionmark.gif
tzn skopiwać ten kod i użyć wewnątrz pliku php ?
b4rt3kk
Żeby owy "kod" działał to trzeba najpierw połączyć się z bazą danych, przygotować zapytanie, wykonać je i na końcu wyświetlić wyniki. Do wybierania rekordów służy:

  1. SELECT kolumny FROM tabela


Dodatkowo przyda się WHERE, ORDER BY, JOIN, COUNT().
13oRy5
ok,
czyli po kolej
1.tworzę plik php i wrzucam go na serwer

2. w pliku: połączenie z bazą danych to ten fragment kodu,
(parameetry funkcji inne , bo mam to na serwerze )

  1. mysql_connect ("127.0.0.1","admin","haslo");


następnie muszę stworzyć zmienną (?)
$zapytanie
i teraz jak ją zdefiniować by przeszukiwanie dotyczyło konkretnej tabeli?
b4rt3kk
Już nie za bardzo pamiętam jak się obsługiwało zapytania strukturalnie, ale:

  1. $query = "SELECT * FROM produkty"; // zapytanie sql
  2. $res = mysql_query($query);
  3.  
  4. while ($row = mysql_fetch_row($res)) {
  5. print_r($row);
  6. }


  1. mysql_connect ("127.0.0.1","admin","haslo", "nazwa_bazy");


Dodaj nazwę bazy na końcu, będzie wygodniej.
13oRy5
Wielkie bądz małe litery przy tabelach tzn "PRODUKTY" / "produkty"
mają znacznie?
bo wpisałem ten kod od Ciebie z powyższego postu i cos nie chce działać ..
CuteOne
  1. $conn = mysql_connect("127.0.0.1","admin","haslo") or die(mysql_error());
  2. mysql_select_db("nazwa_bazy", $conn) or die(mysql_error());
  3.  
  4. // zapytanie
13oRy5

w moim wypadku, myślę, że analaogicznie do postu powyżej tak to powinno wyglądać:
  1. $conn = mysql_connect("mysql13.000webhost.com","a8986120_10","ultra777") or die(mysql_error());
  2. mysql_select_db("a8986120_10", $conn) or die(mysql_error());


Jednak po wrzuceniu na serwer pliku test.php
pojawia się komunikat:
Parse error: syntax error, unexpected T_VARIABLE in /home/a8986120/public_html/projects/test.php on line 3

Czy ja coś zle wpisałem w składni?
Na 000webhost podali mi takie dane:
MySQL Database » MySQL User » MySQL Host
a8986120_10 a8986120_10 mysql13.000webhost.com
b4rt3kk
Błąd nie tyczy się połączenia z bazą tylko gdzieś średnika zapomniałeś, albo coś. Zanim napiszesz na forum to sprawdzaj swój kod, a zwłaszcza w miejscu, na które wskazuje błąd (linia 3).
13oRy5
chyba to nie o to chodzi:
skopiowałem przykład z podpowiedzi o php, czyli zakładam , że tam nie ma błędów i też wyskakuje bład:
Parse error: syntax error, unexpected T_VARIABLE in /home/a8986120/public_html/test.php on line 9
  1. $link = mysql_connect('mysql13.000webhost.com', 'a8986120_10', 'ultra777');
  2. if (!$link) {
  3. die('Could not connect: ' . mysql_error());
  4. }
  5. echo 'Connected successfully';
  6. mysql_close($link);

Używam Notepada ++ , zapisuje do formatu php.

Proszę o wybaczenie,
między ? a php mialem spacje facepalmxd.gif

ok. czyli mam połaczenie z bazą danych.

teraz jak pociągnąc wątek tej selekcji z tabel ?
w myPhpAdmin można przez to search uzyskać jakieś podpowiedzi jak
to zapisac w sql'u??
b4rt3kk
Cytat(13oRy5 @ 20.06.2013, 14:30:39 ) *
chyba to nie o to chodzi:
skopiowałem przykład z podpowiedzi o php, czyli zakładam , że tam nie ma błędów i też wyskakuje bład:
Parse error: syntax error, unexpected T_VARIABLE in /home/a8986120/public_html/test.php on line 9
  1. $link = mysql_connect('mysql13.000webhost.com', 'a8986120_10', 'ultra777');
  2. if (!$link) {
  3. die('Could not connect: ' . mysql_error());
  4. }
  5. echo 'Connected successfully';
  6. mysql_close($link);

Używam Notepada ++ , zapisuje do formatu php.

Proszę o wybaczenie,
między ? a php mialem spacje facepalmxd.gif

ok. czyli mam połaczenie z bazą danych.

teraz jak pociągnąc wątek tej selekcji z tabel ?
w myPhpAdmin można przez to search uzyskać jakieś podpowiedzi jak
to zapisac w sql'u??


Spałeś na wykładach czy jak? Kilka postów wyżej napisałem Ci co masz zrobić i nawet kod napisałem.
13oRy5
tak zgadza się, użyłem też tego kodu który mi przesłałeś.
Teraz mam tak:
  1. $link = mysql_connect('mysql13.000webhost.com', 'a8986120_10', 'ultra777');
  2. if (!$link) {
  3. die('Could not connect: ' . mysql_error());
  4. }
  5. echo 'Connected successfully';
  6. //mysql_close($link);
  7.  
  8. mysql_select_db("a8986120_10", $link) or die(mysql_error());
  9.  
  10. $query = "SELECT * FROM KATEGORIE"; // zapytanie sql
  11. $res = mysql_query($query);
  12.  
  13. while ($row = mysql_fetch_row($res)) {
  14. print_r($row);
  15. }


i faktycznie w przeglądarce mam :
Connected successfullyArray ( [0] => 1 [1] => kategoria 1 ) Array ( [0] => 2 [1] => kategoria 2 ) Array ( [0] => 3 [1] => kategoria 3 )
i bardzo Ci dziękuje za te wskazówki.

Teraz tylko pytanie jak skonstruować samo zapytanie sgl, żeby umożliwiło:
"wyświetlenie ilość produktow i ich nazwę z grupy "x" posiadajacych atrybuty sortując wyniki po kolumnie nazwa przeciwnie do kierunku alfabetu."

btw. faktycznie cierpię na spory deficyt snu ...
b4rt3kk
Nie wiadomo jak zbudowana jest Twoja baza, więc nie mam pojęcia.
13oRy5
Zadanie polegało na tym by:
Zaprojektować bazę danych mysql zawierających m.in tabele: PRODUKT, GRUPA PRODUKTÓW, ATRYBUTY
w taki sposób aby każdy produkt posiadał wiele atrybutów i mógł się znajdować w dowolnej ilości kategorii.


baza danych: a3521536_db1
zawiera:

Tabele:
produkty
id produkt | nazwa produkt

kategorie
id kategoria | nazwa kategoria

atrybuty
id atrybut | nazwa atrybut

Tabele wiążące:
produkty_atrybuty
id produkt | id atrybut

produkt_kategoria
id produkt | id kategoria


Teraz potrzebuję:
zapytanie sql,które:
do powyższej bazy danych wyświetli ilość produktow i ich nazwę z grupy x posiadajacych atrybuty sortując wyniki po kolumnie nazwa przeciwnie do kierunku alfabetu.
b4rt3kk
  1. SELECT produkty.nazwa_produkt, COUNT(produkt_kategoria.id_kategoria) AS ile_produktow FROM produkty JOIN produkty_atrybuty ON produkty.id_produkt = produkty_atrybuty.id_produkt JOIN produkt_kategoria ON produkty.id_produkt = produkt_kategoria.id_produkt WHERE produkt_kategoria.id_kategoria = 'x' ORDER BY produkty.nazwa_produkt DESC


Zamiast x wstaw id kategorii, jeśli chcesz wstawić nazwę kategorii to musisz dołączyć jeszcze jedną tabelę. W tabelach wiążących przydałyby się jeszcze klucze podstawowe.
13oRy5
Dzięki wielkie.
Jak mam już to zapytanie sql
to jaką funckcją wyświetlić należy wynik zapytania w przegladarce?
wczesniej bylo:
  1. while ($row = mysql_fetch_row($res)) {
  2. print_r($row);
  3. }
b4rt3kk
Cytat(13oRy5 @ 20.06.2013, 20:28:50 ) *
Dzięki wielkie.
Jak mam już to zapytanie sql
to jaką funckcją wyświetlić należy wynik zapytania w przegladarce?
wczesniej bylo:
  1. while ($row = mysql_fetch_row($res)) {
  2. print_r($row);
  3. }


Ta sama funkcja, zmieniasz tylko treść zapytania, czyli wartość zmiennej $query. Jak chcesz zrobić bardziej eleganckie wyniki wyświetlania to zamiast print_r() użyj echo.
13oRy5
chyb nie do końca bo
mam teraz tak:
  1. <html>
  2. <head>
  3. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  4. <title>Zadanie 3</title>
  5. </head>
  6. <?php
  7. $link = mysql_connect('mysql11.000webhost.com', 'a3521536_user1', 'ultra777');
  8. if (!$link) {
  9. die('Could not connect: ' . mysql_error());
  10. }
  11. echo 'Connected successfully';
  12.  
  13.  
  14. mysql_select_db("a3521536_db1", $link) or die(mysql_error());
  15.  
  16. $query = "SELECT produkty.nazwa_produkt, COUNT(produkt_kategoria.id_kategoria) AS ile_produktow FROM produkty JOIN produkty_atrybuty ON produkty.id_produkt = produkty_atrybuty.id_produkt JOIN produkt_kategoria ON produkty.id_produkt = produkt_kategoria.id_produkt WHERE produkt_kategoria.id_kategoria = '2' ORDER BY produkty.nazwa_produkt DESC"; // zapytanie sql
  17. $res = mysql_query($query);
  18.  
  19.  
  20. while ($row = mysql_fetch_row($res)) {
  21. print_r($row);
  22. //echo($row);
  23. }
  24.  
  25.  
  26. //echo($row);
  27. ?>
  28. <body>
  29. </body>
  30. </html>


i wyrzuca mi bląd a przecież wcześniej działało tzn wyświetlało się, tj jak było inne zapytanie
b4rt3kk
Jakbyś jeszcze treść tego błędu podał. biggrin.gif
13oRy5
blad:
Warning: mysql_fetch_row(): supplied argument is not a valid MySQL result resource in /home/a3521536/public_html/zad_3.php on line 20
b4rt3kk
Więc dopisz:

  1. $res = mysql_query($query) or die (mysql_error());


I powiedz co wyrzuciło.
13oRy5
były błędy z zapytaniu odnośnie nazw kolumn
teraz , ostatecznie wyświetla się tak:
Connected successfullymysql_select_dbArray ( [0] => produkt 1 [1] => 33 )

chyba nie do końca o to chodziło, bo miały być wyświetlone te produkty i zliczone...a ten powyższy komunikat trudno tak zinterpretować.

bardzo proszę o pomoc, bo już nie wile zostało.
próbowałem trochę inaczej skonstruowac to zapytanie:
  1. $query ="SELECT k.nazwa_kategoria, count(*)
  2. FROM produkt_atrybut AS pa
  3. LEFT JOIN produkty AS p ON pa.id_produkt = p.id_produkt
  4. LEFT JOIN produkt_kategoria AS pk ON pk.id_produkt = p.id_produkt
  5. LEFT JOIN kategorie AS k ON pk.id_kategoria = k.id_kategoria
  6. GROUP BY k.nazwa_kategoria
  7. ORDER BY k.nazwa_kategoria DESC";

ale wyświetla sie tez nie to o co chodzi w zadaniu:

mysql_select_dbArray ( [0] => kategoria 3 [1] => 49 ) Array ( [0] => kategoria 2 [1] => 33 ) Array ( [0] => kategoria 1 [1] => 48 )

a ja potrzebuję ilośc produktów i ich nazwy, które posiadają atrybuty i należą do jednej z kategorii

Proszę o pomoc
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.