ďťż

[php/mysql]Dodatkowe linki Jak to powiązać z artykułem?

       

Podstrony


telcocafe

Witam

Otóż sprawa ma się tak...mam dodawania artykułu. Do niego mam mieć możliwość dodania linków do plików, innych artykułów, albo stron www.
Chodzi o coś takiego:

Użytkownik klika na artykuł...wyświetla mu się zawartośc artykułu, a pod spodem link ZOBACZ TEŻ...klika na to i ma liste dodatkowych źródeł informacji

Teraz....jak to powiązać z artem? Bo zasadniczo nie ma ograniczenia na ilość tych linków dodatkowych więc jest problem. Bo jeżeli zrobie tabele DODATKI
dod_id | link_art | link_plik | link_www |

to jak to potem przeszukać pod kątem danego artykułu i najwazniejsze...jak wyświetlić to dane z danej komórki jeśli jest tam np. 20 linków ? W sumie do tabeli mogę dodać pole z id danego arta ale nadal nie wiem jak zrobić wyświetlenie tego w postaci linków



W MySQL nie mam profesjonalnych umiejętności, ale może tak...

Do tabeli dodatki dodajesz ID danego artykuły do którego te dodatki są.

A jak wyświetlać ?
- np. jak będziesz dodawał linki do w/w tabeli, to rozdziel je jakimś znakiem, i przy wyciąganiu tych linków z tabeli, w PHP rozwalasz to funkcją explode();
Użytkownik lopik_ edytował ten post 20 kwiecień 2007, 15:45
A jak na przykład załatwić sprawę z nazwą linku? Bo to użytkownik dodający np. plik musi nazwać link czyli to co jest między tagami <a> a </a>. Jezeli doda 20 linków...hmm przydałoby się chyba jeczcze pole np. nazwa_link_art, nazwa_link_plik ale to już wogóle nie wiem jak wyświetlić potem :/

Jejku, no podstawy relacji...
`attachments` article_id ID attachment_id ID attachment_name CHAR(64) attachment_search CHAR(64) `articles` article_id [...]

I teraz wyszukujesz odpowiednie dodatki dla konkretnego artykułu:
$art_id = 777; $result = mysql_query(SELECT * FROM `attachments` WHERE article_id='.$art_id); echo '<table>'; while ($row = mysql_fetch_assoc($result)) { echo '<tr><td><a href="'.$row['attachment_search'].'">'.$row[' attachment_name'].'</a></td></tr>'; }

Tak to powinno wyglądać. ;)



no tak to by wyglądało gdybym w danym polu miał 1 wartość

ale jeżeli użytkownik poda np. 10 linków to będe miał
link1; link2; link3 no i do każdego musi być nazwa...nazwa1; nazwa2; nazwa3

jak se z tym poradzić ?

Ech, ta nazwa jest po to, by user sobie nazwał np. inaczej zdjęcie, inaczej coś tam jeszcze. Może to być puste, wtedy mógłbyś wklejać nazwę pliku.

nie nie...ta nazwa to ma być nazwa linku która się MUSI wyświetlić między znacznikami....to ten napis na który ktoś będzie klikał kjiedy będzie chciał otworzyć danego linka. Ona musi byc podana i zawsze będzie podawana stąd ten problem mój. nie moge założyć, że nazwy nie będzie bo nazwa bedzie podawana ZAWSZE :)

W takim razie nie rozumiem Twojego problemu... Możesz dokładniej opisać?

PS. Trochę się nie wyspałem, więc proszę łopatologicznie :D

ok ok też tak czasem mam :)

1. user wchodzi do dodawania artykułu. Tam otwiera sobie formularz który dodaje linki. są 3 kategorie
-> linki do innych artykułów
-> linki do plików
-> linki do innych stron

2. Załóżmy że są 2 inputy
-> nazwa
-> adres

<a href='adres.html'>NAZWA</a> To co user wpisze w nazwę to będzie ten napis na który klika gdy chcesz otworzyć łącze a adres to adres :)

3. Teraz jest opcja że user może podać kilkanaście takich linków. Wtedy automatycznie do tabeli będziesz miał
nazwa -> nazwa1; nazwa2; nazwa3; nazwa4
adres -> adres1; adres2; adres3; adres4

4. Problem jest w wyświetlaniu. nie wiem jak to wywalić odpowiednio. Rozróżniac może być poprzez dodawania id danego artu ale coś wykorzystać explode?? No niby moge użyć explode() do rozbicia poszczególnych komórek. Ale nie mam pojęcia jak połączyć nazwa1 z adres1 itp

Hmmm, możesz wykorzystać explode przy inpucie albo możesz zrobić w JS, że po kliknięciu na jakiś przycisk, dynamicznie tworzyłby się nowy input, do którego można by wpisać kolejny adres + nazwę itd... I później w skrypcie odebrać to za pomocą zwykłego for (albo foreach).

Jeśli byś skorzystał z pierwszej opcji, to rozbijasz w skrypcie łatwo:
$names = explode(';', $_REQUEST['name']); $addresses = explode(';', $_REQUEST['address']); echo 'Pierwsze: <a href="'.$addresses[0].'">'.$names[0].'</a> ';

a powiesz czym jest $_REQUEST ?? Bo pierwszy raz to widze??
ja myślałem, żeby to zrobić troche inaczej

zakładając, że w polu art_link_name mam nazwa1; nazwa2 a w polu art_link mam adres1; adres2

to pobrać je z tabeli
wrzucić do 2 tablic ale coś mi tu nie gra bo nie do końca wiem co zrobic

$_REQUEST = $_POST + $_GET ;]

Co do Twojego pomysłu: tak się nie powinno robić ;] Takie bzdety powinno się wydzielać do całkowicie osobnej tabeli, bo user może ich dać bardzo, bardzo dużo. ;] No i operacje na takich bzdetach w osobnej tabelce (jak np. usuwanie, edycja) są dużo prostsze.


to pobrać je z tabeli
wrzucić do 2 tablic ale coś mi tu nie gra bo nie do końca wiem co zrobic

Hmmm, wydawało mi się, że dość dobrze opisałem. Równie dobrze możesz to wrzucić do jednej tablicy, tyle że dwuwymiarowej...

a gdybym cię poprosił o łopatologiczne rozpisanie tego dajmy na to od podstaw na przykładowych polach i tabelach które ty byś podał ??

Siedze blisko 14 godzine i ciężko mi to skminić

Baza danych:

`attachments` article_id INT attachment_id INT attachment_name CHAR(64) attachment_link CHAR(64) `articles` article_id INT auto_increment article_content TEXT [...]
article_id - ID artykułu, do którego odnosi się dany dodatek (link, czy co tam chcesz).
attachment_id - ID dodatku, przyda się przy edycji/usuwaniu.
attachment_name - wyświetlana nazwa dodatku.
attachment_link - adres.

<form method="post" action="add_post.php"> <textarea name="content">tresc</textarea> <input type="text" name="names" value="attachment1;att2"> <input type="text" name="addresses" value="#1;#2"> <input type="submit" value="Dodaj post"> </form>

add_post.php:
<?php //pomijam obowiazkowe sprawdzanie danych wejsciowych oraz laczenie sie z baza $result = "INSERT INTO `articles`(article_id, article_content) VALUES (NULL, $_REQUEST['content'])"; $result = mysql_query($result); if (isset($_REQUEST['names'], $_REQUEST['addresses'])) { if (strpos($_REQUEST['names'], ';') && strpos($_REQUEST['addresses'])) { $names = explode(';', $_REQUEST['names']); $addresses = explode(';', $_REQUEST['addresses']); } else { $names = array($_REQUEST['names']); $addresses = array($_REQUEST['addresses']); } if (count($addresses) == count($names)) { $last_id = mysql_last_id(); for ($i=0; $i<count($names); $i++) { $query = "INSERT INTO attachments(article_id, attachment_id, attachment_name, attachment_link) VALUES ($last_id, NULL, $names[$i], $values[$i])"; $result = mysql_query($query); if ($result) { echo 'dodano jeden dodatek.<br>'; } } } } ?>

Teraz pytanie, czy to coś działa, bo pisałem z głowy (i jestem zaspany :D).

//oo, 1000 post :)
Użytkownik pbnan edytował ten post 20 kwiecień 2007, 18:33
szkoda, że komentów nie dałeś hehe ale chyba kminie, ale sprawdze czy dobrze rozumiem

1. pierw mamy formularz gdzie dajemy treść naszego arta, nazwe linka, i adres linka
2. potem uzupełniamy tabele artów
3. if (isset($_REQUEST['names'], $_REQUEST['addresses'])) { if (strpos($_REQUEST['names'], ';') && strpos($_REQUEST['addresses'])) { $names = explode(';', $_REQUEST['names']); $addresses = explode(';', $_REQUEST['addresses']); } else { $names = array($_REQUEST['names']); $addresses = array($_REQUEST['addresses']); } if (count($addresses) == count($names)) { $last_id = mysql_last_id(); for ($i=0; $i<count($names); $i++) { $query = "INSERT INTO attachments(article_id, attachment_id, attachment_name, attachment_link) VALUES ($last_id, NULL, $names[$i], $values[$i])"; $result = mysql_query($query); if ($result) { echo 'dodano jeden dodatek.<br>'; } } } }

Ale tu nie jestem pewien. Jeżeli użytkownik wpisze wartości do tych pól...to sprawdzamy czy są tam sredniki i robimy sobie tablice...ale po co ten warunek else ???? i dalsza część też mi ciężko wchodzi do rozkminienia

Jeśli nie ma średników, to możliwe jest, iż user wpisał tylko po jednej nazwie i adresie. Jeśli tak się stało, to przypisujemy bez rozdzielania do pierwszego elementu tablicy $names, $addresses całą zawartość, kolejno, inputu names i addresses.

Następnie jeśli tych wpisanych adresów i nazw jest tyle samo, to:
- zabieramy article_id zwrócone w ostatniej operacji INSERT;
- w pętli dodajemy do tablicy attachments kolejne dodatki z tablic wykorzystując ID artykułu;
- sprawdzamy, czy się udało (w pętli sprawdzamy). Ach, nie jestem pewien, czy to dokładnie tak się sprawdzało, możliwe że inaczej (korzystam z mysqli, a nie proceduralnego mysql... Drobne różnice istnieją).

;)

//edit:

to ma sens hehe :) Wszystko ma sens, oprócz biologii. :D

Jesteś wielki hehe
Dosłownie - prawda, w przenośni - nieprawda :)

ps. zajżyj tu jeszcze dziś bo coś czuje, że na bank się jeszcze odezwe;d
A, jak napiszesz post pod postem to się nic strasznego nie stanie. Wystarczy tylko to zastrzec.
Użytkownik pbnan edytował ten post 20 kwiecień 2007, 19:50
ok dzięki wielkie. to ma sens hehe :) Jesteś wielki hehe

ps. zajżyj tu jeszcze dziś bo coś czuje, że na bank się jeszcze odezwe ;d
Użytkownik Dawid-San edytował ten post 20 kwiecień 2007, 19:05
$query = "INSERT INTO attachments(article_id, attachment_id, attachment_name, attachment_link) VALUES ($last_id, NULL, $names[$i], $values[$i])";

Skąd wziąłęs zmienną $values[$i] ?? :)

Ze snu :P
Powinno być $addresses[$i] :)
Tak to jest, jak się wszystko na szybko i śpiąco pisze :D

  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • nvm.keep.pl

  • Sitedesign by AltusUmbrae.