Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP]przyjazne linki w mysql?
Forum PHP.pl > Forum > Przedszkole
qoqo
Witam.

Chcę zrobić bazę artykułów z newsami

Wygląd bazy danych jest taki:

ID TYTUŁ NEWSA URL TRESC DATA


Załóżmy tytuł nosi nazwe z polskimi znakami "przykładowy tytuł"

I w bazie wygląda to tak:

ID TYTUŁ NEWSA URL TRESC DATA
1 PRZYKŁADOWY TYTUŁ TREŚĆ ITD 4.04.2020


jak zrobić, aby tytuł newsa wrzucił w tabele URL o takim wyglądzie: przykladowy-tytul

i wtedy zamiast wyświetlania przez ID wyświetlałbym tytuł za pomocą %LIKE% przykladowy-tytul czyli na zasadzie URl wyświetlałby mi się post


w jaki sposób to zrobić?

Pyton_000
To sie nazywa Slug
Możesz zrobić tym np: http://stackoverflow.com/a/2955878
Wrzucasz do BD.

Przy wejściu sprawdzasz string, szukasz w BD i pobierasz odpowiedni content.
qoqo
super, dzięki o to mi chodziło smile.gif

Jeszcze mam jeden problem.

chodzi o tagi...

Dodaje poprawnie tagi przykład: ola śćź, karolina ęąć.

Przy dodawaniu do tablicy 'tagi' dodaje te same tagi do tablicy 'tagi_url' gdzie zamienia je na taką postać: ola-scz, karolina-eac, itd itp

W jaki sposób wyświetlić te tagi a później w jaki sposób zrobić, jak ktoś kliknie na link np. tag-ola-scz.html wyszuka za pomocą %LIKE% wpisy o zawartości ola-scz ?



baza wygląda tak:


fklar
Kod
SELECT * FROM `wpisy` WHERE `tagi_url` LIKE '%ola-scz%'


Natomiast ja bym to zrobił inaczej. Nie lepiej stworzyć osobno tabelę z tagami i powiązanie tag-wpis, gdzie po prostu w osobnej tabeli trzymałbyś id wpisu i id powiązanych z nim tagów?
qoqo
w jaki sposób to zrobić?
fklar
Uproszczona struktura:

Wpisy
id | tytuł | slug | treść | data

Tagi
id | nazwa | slug

Tagi wpisów
id | id wpisu | id tagu

Wtedy jak masz np. wpis "Testowy" o id 1 i tagi A (id 8) i B (id 20) to w tabeli z tą relacją będziesz miał:

id | id wpisu | id tagu
1 | 1 | 8
1 | 1 | 20

Będziesz miał większą przejrzystość w bazie. Wtedy mając id tagu pobierzesz sobie id wszystkich wpisów z tym tagiem i je sobie wyświetlisz.
qoqo
a jak zrobić aby we wpisie tagi się wyświetlały?
załóżmy otaguję post: tag-1, tag-2, tag-3

to chcę aby przy wejściu w ten wpis wyświetlały się te tagi i adres url do tych tagów (to nie problem)

ale jak tu zrobić?

ja nie pobieram treści wpisu poprzez ID tylko poprzez URL wpisu %LIKE%

(widać w bazie)
fklar
1. Tak samo znajdziesz sobie po id wpisu wszystkie tagi.
2. Nic nie szkodzi, żeby znaleźć id tagu znając slug obecny w adresie.

Wiem, że to może skomplikowanie wygląda, ale tak właśnie się robi.
qoqo
ok rozumie, mam nadzieje, że dam radę.
jedyne pytanie: jak zrobić na zasadzie ID wpisu, skoro dodają się równocześnie wpis i tagi jeszcze nie jest znany ID wpisu, wygenerować jakiś unikalny klucz bez powtórzeń?
fklar
ID masz w bazie danych jako główny klucz, który jest przyporządkowywany automatycznie do rekordu. Funkcja mysqli_insert_id zwróci Ci ostatnio dodane ID w tabeli.
qoqo
Wpisy
id | tytuł | slug | treść | data

Tagi
id | nazwa | slug

Tagi wpisów
id | id wpisu | id tagu


Więc chodzi mi o to: Dodaję wpis do wpisy, po dodaniu tworzy ID unikalny np. 100, 120 itd - rozumiem, jednak przy jednym zapytaniu gdzie leci treść do wpisów, jak zrobić aby w tabeli tagi wpisów pojawiły się ID wpisu i ID tagów?

troche jestem ciemny w tym biggrin.gif albo mózg od myślenia przegrzany
Pyton_000
Normalnie, dodajesz tagi - również masz ich ID, zbierasz to do kupy i wrzucasz do "tagi wpisów"
qoqo
Mam:

  1.  
  2. ///// Dodajemy treść do bazy wpisy_$tabela w tym przypadku jest to wpisy_test
  3. $zapytanie = "INSERT INTO wpisy_$tabela SET tytul='$tytulWpisu', url='$clean', tresc='$trescWpisu', trescwpis='$trescWpisu2', obrazek='$obrazekWpisu', description='$description', keywords='$keywords'";
  4. mysql_query($zapytanie);
  5. $wpis_id = mysql_insert_id();
  6. if($zapytanie) echo "<font color='green'>Wygenerowano wpis: <b>".$tytulWpisu." </b></font>";
  7. else echo "Błąd nie udało się dodać nowego rekordu";
  8.  
  9. ////
  10. $tagi_all= explode(',', strtolower($tagiWpisu));
  11. for ($x = 0; $x < count($tagi_all); $x++) {
  12. //dodajemy tagi tagi_test
  13. $zapytanie_tagi = "INSERT INTO `tagi_test` (`id`, `nazwa`) VALUES ('', '" . $tagi_all[$x] . "')";
  14. $maket = mysql_query($zapytanie_tagi);
  15.  
  16. //pobieram id tagu
  17. $tag_id = mysql_insert_id();
  18.  
  19. // tutaj dodajemy ID tagu i id wpisu
  20. $zapytanie_id = "INSERT INTO `tagi_wpisow_test` (`id`, `id_tagu`, `id_wpisu`) VALUES ('', '$tag_id', '$wpis_id')";
  21. $maketm = mysql_query($zapytanie_id);
  22. }


Zrobiłem jeszcze tagi bez slug'a - wrzuca je to bazy poprawnie.

Problem pojawia się w ostatniej tabeli tagi_wpisow_test

gdzie mam: ID, ID_wpisu i id_tagu

dodaje ttylko jeden rekord :1, IDWPISU: 140, ID TAGU: 10

czyli pierwszy wygenerowany tag mi jedynie dodaje, reszty nie... jak zrobić, aby wrzuciło:

ID, ID WPISU, ID TAGU:
1, 100, ID1
2, 100, ID2
3, 100, ID3

Nie wiem czy dobrze kombinuję? co jest źle?
Pyton_000
- Nie potrzebujesz id w tagi_wpisow_test
- załóż indeks PK na (id_tagu, id_wpisu)

  1. ///// Dodajemy treść do bazy wpisy_$tabela w tym przypadku jest to wpisy_test
  2. $zapytanie = "INSERT INTO wpisy_$tabela
  3. SET
  4. tytul='$tytulWpisu',
  5. url='$clean',
  6. tresc='$trescWpisu',
  7. trescwpis='$trescWpisu2',
  8. obrazek='$obrazekWpisu',
  9. description='$description',
  10. keywords='$keywords'";
  11. mysql_query($zapytanie);
  12. $wpis_id = mysql_insert_id();
  13.  
  14. if($zapytanie)
  15. {
  16. echo '<span style="color: green; ">Wygenerowano wpis: <b>' .$tytulWpisu. ' </b></span>';
  17. }
  18. else
  19. {
  20. echo "Błąd nie udało się dodać nowego rekordu";
  21. }
  22.  
  23. $tagi_all= explode(',', strtolower($tagiWpisu));
  24.  
  25. foreach ($tagi_alla as $tag)
  26. {
  27. // Sprawdzamy czy jest taki tag, Nie ma sensu dodawać x takich samych
  28. $sql = "SELECT id FROM tagi_test WHERE nazwa = '$tag'";
  29.  
  30. if(!$id)
  31. {
  32. $sql = "INSERT INTO tagi_test (nazwa) VALUES ('$tag')";
  33. mysql_query($sql);
  34. $id = mysql_insert_id();
  35. }
  36. else {
  37. $id = $id[0];
  38. }
  39.  
  40. $sql = "INSERT INTO `tagi_wpisow_test` (`id_tagu`, `id_wpisu`) VALUES ('$id', '$wpis_id')";
  41. mysql_query($sql);
  42. }
qoqo
wyskakuje Fatal error: Cannot use object of type stdClass as array in 125

a ta linia to:

  1. $id = $id[0];
Pyton_000
zamień fetch_field na fetch_row
qoqo
super dziękuję. Mam jeszcze jedno pytanie odnośnie slug'a tagów:

dodaję również
  1. $tagi_slug = explode(',', strtolower($cleantagi));


i równiez jadę tak jak z zwykłym tagiem, czy łącze w jedno?
Pyton_000
slug dodajesz do 'tagi_test' razem z normalnym tagiem.
qoqo
ok jeszcze jedno: w jaki sposób pobrać to we wpisie?

Chodzi mi o to, że mam pobrane wszystkie pola wpisu : między innymi ID

i teraz wyszukuję z tabeli tagi wpisów za pomocą LIKE ID z artykułu, przypisuje pobrany IDtagu i na tej podstawie wyświetlam z tabeli tagi_test we wpisach?
Pyton_000
Jak masz ID wpisu to

  1. SELECT name FROM tagi_wpisow_test tw JOIN tagi_test t ON(t.id = tw.tag_id) WHERE tw.wpis_id = 3

W ten deseń
qoqo
co oznacza to "tw." w zapytaniu?
Pyton_000
alias tabeli
qoqo
Zoribłem tak:

  1. $tagi_wpis = mysql_query("SELECT nazwa, slug FROM tagi_test JOIN tagi_wpisow_test ON(id_tagu) WHERE id_wpisu ='$id%'");
  2.  
  3. if (!$tagi_wpis) {
  4. echo 'Nie można uruchomić zapytania: ' . mysql_error();
  5. }
  6.  
  7. while ($tagiwiersz = mysql_fetch_array($tagi_wpis))
  8. {
  9.  
  10. $idpobierz = $tagiwiersz['nazwa'];
  11. $slugg = $tagiwiersz['slug'];
  12.  
  13. }


jednak przy wyświetlaniu pobiera tylko jeden tag, co źle robie?
Pyton_000
Nie uważasz że Twoje zapytanie jest "troszkę" inne od mojego?
qoqo
nie troszkę tylko jest, kombinuje na różne sposoby - tam mi wyskakiwało, że tw nie jest tabelą czy coś takiego :/
Pyton_000
Pokaż lepiej jaki błąd miałeś z mojego zapytania bo to co pokazałeś się kupy nie trzyma.
qoqo
Nie można uruchomić zapytania: Nieznana kolumna 'tw.wpis_id' w where clause
Pyton_000
to zmieć na: t.id
lub pokaż strukturę tabel
qoqo
tak wygląda w bazie wszystko:




po zmianie jest błąd:
Nie można uruchomić zapytania: Something is wrong in your syntax obok '.id JOIN tagi_test t ON(t.id = tw.tag_id) WHERE tw.wpis_id=223' w linii 1
Pyton_000
nie tu, w WHERE zmień
qoqo
  1. SELECT nazwa FROM tagi_wpisow_test tw JOIN tagi_test t ON(t.id = tw.tag_id) WHERE t.id = $id


tak?

wywala: Nie można uruchomić zapytania: Nieznana kolumna 'tw.tag_id' w on clause
Pyton_000
Pokażesz w końcu struktury tabel ? Poza tym czytaj co do Ciebie piszą. Skoro nie ma takiej kolumny to zamień łaskawie na to co masz.
qoqo
Tables_in_biznes2_gen
tagi_test
tagi_wpisow_test
wpisy_test


tagi_test:

  1. FIELD Type NULL KEY DEFAULT Extra
  2. id int(11) NO PRI NULL AUTO_INCREMENT
  3. nazwa tinytext NO UNI NULL
  4. slug tinytext YES UNI NULL



tagi_wpisow_test:

  1. FIELD Type NULL KEY DEFAULT Extra
  2. id_tagu int(11) YES NULL
  3. id_wpisu int(11) YES NULL
  4.  


faktycznie - przepraszam, zamotałem się, poprawiłem - zwraca zero wierszy
Pyton_000
Czyli jak, pokaż to zapytanie co poprawiłeś.
qoqo
  1. SELECT nazwa FROM tagi_wpisow_test tw JOIN tagi_test t ON(t.id = tw.id_tagu) WHERE t.id = 228


Wyświetla z ID tagu nie artykułu i zwraca tylko jeden wynik - będę kombinował dalej
Pyton_000
Ja już zgłupiałem. To Co Ty chcesz osiągnąć w końcu?
qoqo
zrobiłem to w ten sposób:
  1. SELECT nazwa,slug FROM domena_tagi JOIN domena_tagi_wpisow ON domena_tagi.id = domena_tagi_wpisow.id_tagu WHERE id_wpisu ='$id%'


Mam pytanie, jak teraz klikając na tag pobrać artykuły zawierające ID tagu?

nazwę slug-tagu pobieram
  1. $_GET['tag']


i teraz slug tagu z get z tabeli: tagi_test -> pobrać ID tego tagu na podstawie tego slug'u -> z tabeli: tagi_wpisow_test pobrać ID artykułu który został przypisany do id tego tagu

Czy to jest dobre rozwiązanie? czy sa prostrze metody na pobranie?
Pyton_000
Spróbuj coś na zasadzie:
  1. SELECY * FROM tagi_test t JOIN tagi_wpisow_test tw ON(t.id = tw.id_tagu) JOIN wpisy_test w ON(w.id = tw.id_wpisu) WHERE t.slug = 'twoj_slug'


To chyba powinno Ci zwrócić kilka wierszy, ale pewien nie jestem smile.gif
Jeśli nie to możesz pobrać ID tagu podzapytaniem :
  1. SELECY * FROM tagi_wpisow_test tw JOIN wpisy_test w ON(w.id = tw.id_wpisu) WHERE tw.id_tagu IN (SELECT id FROM tagi_test WHERE slug = 'sss' )
qoqo
super smile.gif działa smile.gif dziękuję bardzo smile.gif
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.