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
4.03.2015, 12:32:14
To sie nazywa Slug
Możesz zrobić tym np:
http://stackoverflow.com/a/2955878Wrzucasz do BD.
Przy wejściu sprawdzasz string, szukasz w BD i pobierasz odpowiedni content.
super, dzięki o to mi chodziło

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
5.03.2015, 14:26:28
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?
fklar
5.03.2015, 15:55:10
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.
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
5.03.2015, 17:55:32
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.
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
5.03.2015, 22:26:19
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.
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

albo mózg od myślenia przegrzany
Pyton_000
5.03.2015, 22:45:36
Normalnie, dodajesz tagi - również masz ich ID, zbierasz to do kupy i wrzucasz do "tagi wpisów"
Mam:
///// Dodajemy treść do bazy wpisy_$tabela w tym przypadku jest to wpisy_test
$zapytanie = "INSERT INTO wpisy_$tabela SET tytul='$tytulWpisu', url='$clean', tresc='$trescWpisu', trescwpis='$trescWpisu2', obrazek='$obrazekWpisu', description='$description', keywords='$keywords'";
if($zapytanie) echo "<font color='green'>Wygenerowano wpis: <b>".$tytulWpisu." </b></font>"; else echo "Błąd nie udało się dodać nowego rekordu";
////
for ($x = 0; $x < count($tagi_all); $x++) { //dodajemy tagi tagi_test
$zapytanie_tagi = "INSERT INTO `tagi_test` (`id`, `nazwa`) VALUES ('', '" . $tagi_all[$x] . "')";
//pobieram id tagu
// tutaj dodajemy ID tagu i id wpisu
$zapytanie_id = "INSERT INTO `tagi_wpisow_test` (`id`, `id_tagu`, `id_wpisu`) VALUES ('', '$tag_id', '$wpis_id')";
}
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
6.03.2015, 13:28:16
- Nie potrzebujesz id w tagi_wpisow_test
- załóż indeks PK na (id_tagu, id_wpisu)
///// Dodajemy treść do bazy wpisy_$tabela w tym przypadku jest to wpisy_test
$zapytanie = "INSERT INTO wpisy_$tabela
SET
tytul='$tytulWpisu',
url='$clean',
tresc='$trescWpisu',
trescwpis='$trescWpisu2',
obrazek='$obrazekWpisu',
description='$description',
keywords='$keywords'";
if($zapytanie)
{
echo '<span style="color: green; ">Wygenerowano wpis: <b>' .$tytulWpisu. ' </b></span>'; }
else
{
echo "Błąd nie udało się dodać nowego rekordu"; }
foreach ($tagi_alla as $tag)
{
// Sprawdzamy czy jest taki tag, Nie ma sensu dodawać x takich samych
$sql = "SELECT id FROM tagi_test WHERE nazwa = '$tag'";
if(!$id)
{
$sql = "INSERT INTO tagi_test (nazwa) VALUES ('$tag')";
}
else {
$id = $id[0];
}
$sql = "INSERT INTO `tagi_wpisow_test` (`id_tagu`, `id_wpisu`) VALUES ('$id', '$wpis_id')";
}
wyskakuje Fatal error: Cannot use object of type stdClass as array in 125
a ta linia to:
$id = $id[0];
Pyton_000
6.03.2015, 14:20:26
zamień fetch_field na fetch_row
super dziękuję. Mam jeszcze jedno pytanie odnośnie slug'a tagów:
dodaję również
i równiez jadę tak jak z zwykłym tagiem, czy łącze w jedno?
Pyton_000
6.03.2015, 14:43:10
slug dodajesz do 'tagi_test' razem z normalnym tagiem.
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
6.03.2015, 16:00:34
Jak masz ID wpisu to
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ń
co oznacza to "tw." w zapytaniu?
Pyton_000
6.03.2015, 16:17:26
alias tabeli
Zoribłem tak:
$tagi_wpis = mysql_query("SELECT nazwa, slug FROM tagi_test JOIN tagi_wpisow_test ON(id_tagu) WHERE id_wpisu ='$id%'");
if (!$tagi_wpis) {
}
{
$idpobierz = $tagiwiersz['nazwa'];
$slugg = $tagiwiersz['slug'];
}
jednak przy wyświetlaniu pobiera tylko jeden tag, co źle robie?
Pyton_000
6.03.2015, 18:01:19
Nie uważasz że Twoje zapytanie jest "troszkę" inne od mojego?
nie troszkę tylko jest, kombinuje na różne sposoby - tam mi wyskakiwało, że tw nie jest tabelą czy coś takiego :/
Pyton_000
6.03.2015, 18:19:42
Pokaż lepiej jaki błąd miałeś z mojego zapytania bo to co pokazałeś się kupy nie trzyma.
Nie można uruchomić zapytania: Nieznana kolumna 'tw.wpis_id' w where clause
Pyton_000
6.03.2015, 18:37:31
to zmieć na: t.id
lub pokaż strukturę tabel
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
6.03.2015, 18:56:34
nie tu, w WHERE zmień
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
6.03.2015, 19:27:06
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.
Tables_in_biznes2_gen
tagi_test
tagi_wpisow_test
wpisy_test
tagi_test:
FIELD Type NULL KEY DEFAULT Extra
id int(11) NO PRI NULL AUTO_INCREMENT
nazwa tinytext NO UNI NULL
slug tinytext YES UNI NULL
tagi_wpisow_test:
FIELD Type NULL KEY DEFAULT Extra
id_tagu int(11) YES NULL
id_wpisu int(11) YES NULL
faktycznie - przepraszam, zamotałem się, poprawiłem - zwraca zero wierszy
Pyton_000
6.03.2015, 21:34:58
Czyli jak, pokaż to zapytanie co poprawiłeś.
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
6.03.2015, 22:16:11
Ja już zgłupiałem. To Co Ty chcesz osiągnąć w końcu?
zrobiłem to w ten sposób:
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
$_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
7.03.2015, 16:57:44
Spróbuj coś na zasadzie:
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

Jeśli nie to możesz pobrać ID tagu podzapytaniem :
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' )
super

działa

dziękuję bardzo
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.