Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][MySQL] Wiele kategori/tagow dla jednego artykulu
Forum PHP.pl > Forum > Przedszkole
zachu
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?
matiit
Przykład
Tabel art:
art_id
title
text


Tabela cat:
cat_id
name

Tabela cat_art
cat_art_id
cat_id
art_id

zachu
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?
Kshyhoo
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...
zachu
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
Kshyhoo
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.
matiit
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.
zachu
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?
Kshyhoo
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...
zachu
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...
matiit
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.
Kshyhoo
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.
Turson
Ostatnio dodane ID
zachu
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?
Kshyhoo
No ale chyba nie chcesz gotowca? Masz wszystko wytłumaczone. Działaj a z błędami wracaj - taka przecież zasada na Forum...
matiit
Ktoś wyżej podał Ci funkcję do last inserted id, więc nie powinien to już być problem smile.gif
zachu
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??
nospor
Nie: name="cat_id"
a: name="cat_id[]"

Czemu dla was jest takim problemem zrobic:
print_r($_POST);
? Czemu uwazacie ze piszecie bezblednie?
zachu
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?
Kshyhoo
Daj SELECT-OPTION z multi-wyborem...
nospor
Cytat
nospor nie twierdze ze pisze bezblednie,
To skoro wiesz, ze nie piszesz bezblednie, to sprawdzaj co zawieraja zmienne na ktorych pracujesz
Prosze, lektura obowiazkowa:
Temat: Jak poprawnie zada pytanie

Cytat
Niestety moj skrypt doda i pole ktorego nie uzupelnilem z wartoscia zerow
To czemu poprostu nei sprawdzisz czy pole ma wartosc czy nie i dopiero potem dodawaj lub nie...
zachu
Udalo mi sie zrobic to co chcialem. Wykorzytalem checkboxy.

Dzieki ludzie, bardzo mi w tym pomogliscie smile.gif Dzieki rowniez za nie podawanie mi gotowca, bo nic bym sie nie nauczyl.

Pozdrawiam
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.