Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PHP][MySQL] Wiele kategori/tagow dla jednego artykulu
zachu
post 8.02.2014, 15:21:11
Post #1





Grupa: Zarejestrowani
Postów: 10
Pomógł: 0
Dołączył: 4.01.2014

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


Witam

Mam dosc popularny problem. Googluje od 3 dni i nigdzie nie znalazlem konkrenej pomocy. Moze wy mi pomozecie.

Pisze system w ktorym moglbym dodawac artykuly z poziomu strony i do kazdego artykulu chcialbym dopisac kategorie.

Udalo mi sie dodac i wyswietlic artykuly lecz moge przypisac tylko jedna kategorie do kazdego. Problem w tym ze chcialbym okreslic jeden artykul kilkoma kategoriami.

Oto co mi sie udalo napisac:

Mam 3 tabele:

articles - tu trzymam artykuly i id kategori (niestety tylko jedno i nie mam pomyslu jak zrobic na kilka)

categories - tutaj trzymam id kategori i jej nazwe

art_cat - tutaj trzymam id artykulu i id kategori i moge wyciagnac informacje o kategori.

Problem polega na tym ze dodajac artykul dodaje do tabeli articles i powstaje unikatowe id artykulu i dodajac rekord jednoczesnie do art_cat powstaje unikatowe id artykulu i numer kategori ktory podalem zeby ten artykul przypisac do niej.

Nie wiem ja dodac do tego samego id artykulu nastepna kategorie/tag.

Prosze jakies pomysly?
  1. if(isset($_POST['art_send'])){
  2. db_connect();
  3. $query=mysql_query("INSERT INTO articles (art_id,art_title,art_content,cat_id)
  4. values ('','{$_POST['art_title']}','{$_POST['art_content']}','{$_POST['cat_id']}')");
  5. if($query)
  6. {
  7. echo 'dodano artykul<br>';
  8.  
  9. $query2=mysql_query("INSERT INTO art_cat (art_id,cat_id)
  10. values ('','{$_POST['cat_id']}')");
  11. if(!$query2)
  12. {
  13. echo 'nie dodano do categori<br>';
  14. }
  15. else
  16. {
  17. echo 'dodano do categori<br>';
  18. }
  19.  
  20. }
  21.  
  22. }
  23. else
  24. {
  25. echo'nie wcisnieto wyslij';
  26. }

I to dziala (nie wiem czy wydajnie czy nie) ale dopisuje mi do bazy artykul i jego kategorie. Nie wiem jednak jak dopisac wiele kategori do jednego artykulu. Jakies pomysly?
Go to the top of the page
+Quote Post
2 Stron V   1 2 >  
Start new topic
Odpowiedzi (1 - 19)
matiit
post 8.02.2014, 15:32:11
Post #2





Grupa: Zarejestrowani
Postów: 365
Pomógł: 70
Dołączył: 5.04.2009

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


Przykład
Tabel art:
art_id
title
text


Tabela cat:
cat_id
name

Tabela cat_art
cat_art_id
cat_id
art_id

Go to the top of the page
+Quote Post
zachu
post 8.02.2014, 15:36:06
Post #3





Grupa: Zarejestrowani
Postów: 10
Pomógł: 0
Dołączył: 4.01.2014

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


Cytat(matiit @ 8.02.2014, 16:32:11 ) *
Przykład
Tabel art:
art_id
title
text


Tabela cat:
cat_id
name

Tabela cat_art
cat_art_id
cat_id
art_id


No wlasnie tylko dodajac artykul do tabeli articles - art_id jest automatycznie generowane auto increment.
Jak dodac to samo art_id do tabeli cat_art??
I jak za jednym zamachem dodac do tabeli cat_art to samo id kilka razy np mam checkbox z kategoriami i ticknalem 3 kategorie o id np. 1, 2 , 3
I terazz chce dodac dodajac artykul do tabel:
articles:
art_id
1

cat_art:
art_id cat_id
1 / 1
1 / 2
1 / 3

z czego art_id jest generowane automatycznie auto increment.

Jakis pomysl?
Go to the top of the page
+Quote Post
Kshyhoo
post 8.02.2014, 15:39:37
Post #4





Grupa: Opiekunowie
Postów: 3 855
Pomógł: 317
Dołączył: 4.01.2005
Skąd: że




Musisz operować tablicą. Co do dodawania do bazy, można dodać jednym lub dwoma zapytaniami. W przypadku dwu robisz tak:
  1. foreach($_POST['kat_id'] as $klucz => $id_kat) {
  2. $sql = "INSERT INTO art_kat (id_art, id_kat) VALUES ($numer, $id_kat)";
  3. mysql_query($sql);
  4. }

Czyli przypisujesz kilka kategorii do jednego artykułu.
Zapytanie przy wyświetleniu będzie bardziej skomplikowane:
  1. $zapytanie1 = "SELECT ... wszystko to, co chcesz pobrać
  2. GROUP_CONCAT(kat_kategoria SEPARATOR ', ') kategorie
  3. FROM art_kat, artykuly, kategorie
  4. WHERE art_kat.id_art=artykuly.art_id
  5. AND art_kat.id_kat=kategorie.kat_id
  6. AND art_kat.id_art='$art_nr'
  7. GROUP BY art_id";

Co da Ci id kategorii dla wybranego id artykułu...


--------------------
Go to the top of the page
+Quote Post
zachu
post 8.02.2014, 15:53:34
Post #5





Grupa: Zarejestrowani
Postów: 10
Pomógł: 0
Dołączył: 4.01.2014

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


Dzieki ale nie do konca rozumiem

Jak ponizszym zapytaniem mam dodac takie samo art_id do tabeli artykuly i art_cat jednoczesnie?

  1. foreach($_POST['kat_id'] as $klucz => $id_kat) {
  2. $sql = "INSERT INTO art_kat (id_art, id_kat) VALUES ($numer, $id_kat)";
  3. mysql_query($sql);
  4. }


skoro w formularzu nie podaje art_id tylko jest generowane automatycznie?

Siedze juz nad tym tyle ze wszystko mi sie miesza tongue.gif
Go to the top of the page
+Quote Post
Kshyhoo
post 8.02.2014, 15:56:37
Post #6





Grupa: Opiekunowie
Postów: 3 855
Pomógł: 317
Dołączył: 4.01.2005
Skąd: że




No pisałem, że dwoma... a to jest wrzucenie kategorii przecież.
I również pisałem, że musisz operować na tablicy, czyli z formularza musi pójść tablica kategorii.


--------------------
Go to the top of the page
+Quote Post
matiit
post 8.02.2014, 15:57:17
Post #7





Grupa: Zarejestrowani
Postów: 365
Pomógł: 70
Dołączył: 5.04.2009

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


Poczytaj sobie w google o relacji wiele do wielu, jeden do wielu i jeden do jednego. Ta teoria na pewno Ci się przyda i wyjdziesz na tym lepiej niż gdybyśmy Ci podali rozwiązanie na tacy.
Go to the top of the page
+Quote Post
zachu
post 8.02.2014, 18:29:08
Post #8





Grupa: Zarejestrowani
Postów: 10
Pomógł: 0
Dołączył: 4.01.2014

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


Dzieki panowie wracam w takim razie do googlowania. Poczytam o dzialaniach na tablicach, relacjach bazodanowych. I jezeli cos uda mi sie wymyslic to wroce.


Dobra troche poczytalem i moze uda mi sie to jasniej pojac.

Ponizsze zapytanie pobierze z formularza numery id kategori do ktorych chce przypisac artykul.

  1. foreach($_POST['kat_id'] as $klucz => $id_kat) {
  2. $sql = "INSERT INTO art_kat (id_art, id_kat) VALUES ($numer, $id_kat)";
  3. mysql_query($sql);
  4. }


Pozostaje mi tylko jeden problem. Jak pobrac $numer podana przez Ciebie czyli id artykulu ktory dodaje i do ktorego beda kategorie dopisywane.

Jakis pomysl?
Go to the top of the page
+Quote Post
Kshyhoo
post 8.02.2014, 18:45:22
Post #9





Grupa: Opiekunowie
Postów: 3 855
Pomógł: 317
Dołączył: 4.01.2005
Skąd: że




No przecież musisz dopasować ten kod do swoich wymagać. To tylko przykład. jak dodajesz artykuł, to masz jego ID. Tak samo, jak wyświetlasz, również posługujesz się ID...


--------------------
Go to the top of the page
+Quote Post
zachu
post 8.02.2014, 18:47:39
Post #10





Grupa: Zarejestrowani
Postów: 10
Pomógł: 0
Dołączył: 4.01.2014

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


Tak tylko kiedy dodaje artykul do tabeli artykuly powstaje jego id generowanie automatycznie auto_incrementem.

W tym samym czasie chce dodac to samo id do tabeli art_cat ale musze miec pewnosc ze jest to dokladnie takie samo id jak dodane do artykuly...
Go to the top of the page
+Quote Post
matiit
post 8.02.2014, 18:51:02
Post #11





Grupa: Zarejestrowani
Postów: 365
Pomógł: 70
Dołączył: 5.04.2009

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


No to jak dodajesz do art_cat to przekazujesz to art_id i ono Ci się już drugi raz nie zwiększy. Kolumna art_id w tabeli art_cat NIE JEST autoinkrementowana.
Go to the top of the page
+Quote Post
Kshyhoo
post 8.02.2014, 18:53:57
Post #12





Grupa: Opiekunowie
Postów: 3 855
Pomógł: 317
Dołączył: 4.01.2005
Skąd: że




Cytat(zachu @ 8.02.2014, 18:47:39 ) *
Tak tylko kiedy dodaje artykul do tabeli artykuly powstaje jego id generowanie automatycznie auto_incrementem.

W tym samym czasie chce dodac to samo id do tabeli art_cat ale musze miec pewnosc ze jest to dokladnie takie samo id jak dodane do artykuly...

Masz rację. Przed dodaniem artykułu nie wiesz, jaki on przyjmie ID, więc masz dwa wyjścia: albo pobrać przed dodaniem artykułu numer ID, albo pobrać po dodaniu artykułu... Pierwsze rozwiązanie wydaje się łatwiejsze.


--------------------
Go to the top of the page
+Quote Post
Turson
post 8.02.2014, 18:59:00
Post #13





Grupa: Zarejestrowani
Postów: 4 291
Pomógł: 829
Dołączył: 14.02.2009
Skąd: łódź

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


Ostatnio dodane ID
Go to the top of the page
+Quote Post
zachu
post 8.02.2014, 22:07:37
Post #14





Grupa: Zarejestrowani
Postów: 10
Pomógł: 0
Dołączył: 4.01.2014

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


Matii:
No to jak dodajesz do art_cat to przekazujesz to art_id i ono Ci się już drugi raz nie zwiększy. Kolumna art_id w tabeli art_cat NIE JEST autoinkrementowana

W jaki sposob przekazuje art_id z tabeli Artykuly do tabeli art_cat? Musze je najpierw pobrac tak? tylko w jaki sposob? przeszukac baze i pobrac ID ostatnio dodanego artykulu?

Kshyhoo
Masz rację. Przed dodaniem artykułu nie wiesz, jaki on przyjmie ID, więc masz dwa wyjścia: albo pobrać przed dodaniem artykułu numer ID, albo pobrać po dodaniu artykułu... Pierwsze rozwiązanie wydaje się łatwiejsze.

Pobieram id przed dodaniem artykulu czyli przeszukuje baze i pobieram ostatanie ID po czym dodaje do tego +1 i mam ID artykulu ktorego chce dodac??

Sorry panowie to pewnie lamerskie pytania ale ciagle sie ucze.... A w ksiazkach wszystkiego nie ma (pewnie jest ale nie idzie wszystkiego polaczyc w calosc) dlatego poszukuje pomocy u doswiadczonych programistow.



Jakies pomysly?
Go to the top of the page
+Quote Post
Kshyhoo
post 8.02.2014, 22:12:45
Post #15





Grupa: Opiekunowie
Postów: 3 855
Pomógł: 317
Dołączył: 4.01.2005
Skąd: że




No ale chyba nie chcesz gotowca? Masz wszystko wytłumaczone. Działaj a z błędami wracaj - taka przecież zasada na Forum...


--------------------
Go to the top of the page
+Quote Post
matiit
post 8.02.2014, 22:54:23
Post #16





Grupa: Zarejestrowani
Postów: 365
Pomógł: 70
Dołączył: 5.04.2009

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


Ktoś wyżej podał Ci funkcję do last inserted id, więc nie powinien to już być problem smile.gif
Go to the top of the page
+Quote Post
zachu
post 9.02.2014, 20:10:15
Post #17





Grupa: Zarejestrowani
Postów: 10
Pomógł: 0
Dołączył: 4.01.2014

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


Dobra juz jestem blizej niz dalej.

Mam teraz problem z petla foreach... Ta sama petla dziala mi na innym skrypcie jednak w tym dostaje blad.

  1. $last_id=mysql_insert_id();
  2. foreach($_POST['cat_id'] as $klucz => $cat_id) {
  3. $sql = "INSERT INTO art_cat (art_id,cat_id) VALUES ('$last_id', '$cat_id')";
  4. $query=mysql_query($sql) or die(mysql_error());


A tutaj caly kod.

Formularz:

  1. <form action="add_article.php" method="post">
  2. tytul<input type="text" name="art_title"><br>
  3. content<input type="text" name="art_content"><br>
  4. kategoria<input type="text" name="cat_id"><br>
  5. kategoria<input type="text" name="cat_id"><br>
  6. kategoria<input type="text" name="cat_id"><br>
  7. tytul<input type="submit" name="art_send"><br>
  8. </form>


I funkcje dodajace artykul (artykul dodaje bez problemu do tabeli articles) jednak druga funkcja nie dodaje do art_cat tabeli..

  1. if(isset($_POST['art_send'])){
  2. db_connect();
  3. $query=mysql_query("INSERT INTO articles (art_id,art_title,art_content)
  4. values ('','{$_POST['art_title']}','{$_POST['art_content']}')");
  5. if($query)
  6. {
  7. echo 'dodano artykul<br>';
  8. $last_id=mysql_insert_id();
  9. foreach($_POST['cat_id'] as $klucz => $cat_id) {
  10. $sql = "INSERT INTO art_cat (art_id,cat_id) VALUES ('$last_id', '$cat_id')";
  11. $query=mysql_query($sql) or die(mysql_error());
  12. }
  13. if(!$query)
  14. {
  15. echo 'nie udalo sie dodac do art_cat<br>';
  16. }
  17. else
  18. {
  19. echo 'udalo sie dodac do art_cat<br>';
  20. }
  21.  
  22. }
  23. db_close();


Dziwne bo po wyslanu formularza dostaje komunikaty:

dodano artykul

( ! ) Warning: Invalid argument supplied for foreach() in C:\wamp\www\bakehouse01\config.php on line 186
Call Stack
# Time Memory Function Location
1 0.0009 250384 {main}( ) ..\add_article.php:0
2 0.0225 289352 add_article( ) ..\add_article.php:7

ale mimo to dostaje komunikat ponizszy:
udalo sie dodac do art_cat

a tabela nadal pusta.

Jakis pomysl co robie zle??
Go to the top of the page
+Quote Post
nospor
post 9.02.2014, 20:25:01
Post #18





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Nie: name="cat_id"
a: name="cat_id[]"

Czemu dla was jest takim problemem zrobic:
print_r($_POST);
? Czemu uwazacie ze piszecie bezblednie?


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

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
zachu
post 9.02.2014, 20:29:08
Post #19





Grupa: Zarejestrowani
Postów: 10
Pomógł: 0
Dołączył: 4.01.2014

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


nospor nie twierdze ze pisze bezblednie, gdyby tak bylo nie prosil bym o pomoc.

Dzieki wielkie.

Teraz mam troszke inny problem. Mam np 3 pola na wpisanie kategori, lecz chce uzupelnic tylko 2. Niestety moj skrypt doda i pole ktorego nie uzupelnilem z wartoscia zerowa. Jak tego uniknac? Myslisz ze jak to zrobie np z checkboxami to to pomoze?
Go to the top of the page
+Quote Post
Kshyhoo
post 9.02.2014, 20:30:42
Post #20





Grupa: Opiekunowie
Postów: 3 855
Pomógł: 317
Dołączył: 4.01.2005
Skąd: że




Daj SELECT-OPTION z multi-wyborem...


--------------------
Go to the top of the page
+Quote Post

2 Stron V   1 2 >
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 Wersja Lo-Fi Aktualny czas: 14.08.2025 - 07:41