Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][MySQL] System Ulubionych - Wykonanie (2)
Forum PHP.pl > Forum > Przedszkole
FlashSplash
Pierwsza część tematu: Temat: PHPMySQL System Ulubionych Idea 1

Witam!
W poprzednim temacie podpowiedziano mi, jak stworzyć mini system ulubionych połączony z bazą danych użytkowników mojego forum SMF oparty o PHP oraz MySQL. Użytkownik Crozin podpowiedział mi by stworzyć osobną tabelę, która utworzy z tabelą użytkowników relację wiele-do-jednego (klik).

Osoba, która byłaby tak miła by napisać dla mnie takowy kod zostałaby nagrodzona kwotą co najmniej 10zł oraz dostałaby reklamę w wybranym okresie na stronie CartoonCenter.pl (która - przypomnę - nawet w okresie BETA miała miejscami 2000 UU wyświetleń).

Opis systemu
Moim poprzednim pomysłem było stworzenie osobnej tabeli dla każdego użytkownika który będzie chciał używać systemu ulubionych, ale podobno 10'000 tabel dla 10'000 użytkowników to kiepski pomysł haha.gif
Niestety tak jak osobne tabele byłem w stanie stworzyć i rozumiałem to, tak utworzenie osobnej tabeli która utworzy z tabelą użytkowników relację wiele-do-jednego jest po prostu czarną magią.

Rozumiem, że mają bazę danych (nazwijmy ją cc_db) i mając tam 50 różnych tabel forum (SimpleMachinesForum) jedną z nich jest forum_members, w której są wszyscy użytkownicy, oczywiście z unikalnym ID, które w php mogę otrzymać dzięki komendzie $user_id = $context['user']['id'] . Następnie mam utworzyć nową tabelę, np. ulubione i co dalej?

Chcę, aby użytkownik wchodząc na podstronę CartoonCenter na której jest możliwość dodania tego URL do ulubionych klikał ikonkę, która byłaby tak naprawdę ukrytym submit i wysyłał do bazy danych URL i PageTitle.

  1. function curPageURL() {
  2. $pageURL = 'http';
  3. if ($_SERVER["HTTPS"] == "on") {$pageURL .= "s";}
  4. $pageURL .= "://";
  5. if ($_SERVER["SERVER_PORT"] != "80") {
  6. $pageURL .= $_SERVER["SERVER_NAME"].":".$_SERVER["SERVER_PORT"].$_SERVER["REQUEST_URI"];
  7. } else {
  8. $pageURL .= $_SERVER["SERVER_NAME"].$_SERVER["REQUEST_URI"];
  9. }
  10. return $pageURL;
  11. }
  12.  
  13. function curPageName() {
  14. return substr($_SERVER["SCRIPT_NAME"],strrpos($_SERVER["SCRIPT_NAME"],"/")+1);
  15. }
  16.  
  17. $PageURL = curPageURL();
  18. $PageTitle = curPageName();

  1. <form action="add_fav.php" method="post">
  2. <input type="hidden" name="fav-url" value="'. $PageURL .'" />
  3. <input type="hidden" name="fav-title" value="'. $PageTitle .'" />
  4. <input type="submit" id="submit" />


Wysyłając dane do pliku add_fav.php chciałbym by php sprawdzało, czy w tabeli 'ulubione' nie ma już przypadkiem takiego URL i jeśli jest to wysyłać komunikat o tym, że podany adres już jest w ulubionych, a jeśli nie ma takowego to go dodać (lub możemy to uprościć - by jeśli pozycja znajduje się już w bazie danych to ikonka dodawania do ulubionych jest nieaktywna, a jeśli nie ma to aktywna - z tym że to już oczywiście nie w plik add_fav.php tylko bezpośrednio na stronie którą użytkownik zamierza dodać). Potem niezbędna jest opcja przeglądania wszystkich ulubionych z możliwością usunięcia pojedynczych adresów z tabeli (zakładam że to z DELETE FROM ulubione WHERE PageURL = $PageURL czy coś tego typu).

Czy ktokolwiek byłby w stanie mi pomóc? Z góry dzięki za pomoc.
Pozdrawiam,
Newbie FlashSplash
sebekzosw
Kod
SELECT * FROM `ulubione` WHERE `user_id` = ".$user_id." AND `PageURL` = '".mysql_real_escape_string($_POST['fav-url'])."';


Potem robisz zapytanie i zbierasz wyniki do tablicy funkcją mysql_fetch_assoc() i potem sprawdzasz czy tablica jest pusta - jeżeli jest pusta to znaczy ze tego wpisu nie ma w ulubionych czyli możesz wykonać dodawanie rekordu...


Cytat
Potem niezbędna jest opcja przeglądania wszystkich ulubionych z możliwością usunięcia pojedynczych adresów z tabeli (zakładam że to z DELETE FROM ulubione WHERE PageURL = $PageURL czy coś tego typu).


do tego proponuję dorobić jeszcze jeden warunek = id usera:
Kod
DELETE FROM `ulubione` WHERE `PageURL` = '".mysql_real_escape_string($PageURL)."' AND `user_id` = ".$user_id." LIMIT 1;


  1. $fav = mysql_fetch_assoc(mysql_query("SELECT * FROM `ulubione` WHERE `user_id` = ".$user_id." AND `PageURL` = '".mysql_real_escape_string($_POST['fav-url'])."' LIMIT 1"));
  2.  
  3. if(empty($fav))
  4. {
  5. //dodawanie nowego wpisu do bazy
  6. }
  7. else
  8. {
  9. //blad
  10. }



A jak masz podstronę to robisz tak tak:
  1. $fav = mysql_fetch_assoc(mysql_query("SELECT * FROM `ulubione` WHERE `user_id` = ".$user_id." AND `PageURL` = '".mysql_real_escape_string($PageURL)."' LIMIT 1"));
  2.  
  3. if(empty($fav))
  4. {
  5. echo '<form action="add_fav.php" method="post">
  6. <input type="hidden" name="fav-url" value="'. $PageURL .'" />
  7. <input type="hidden" name="fav-title" value="'. $PageTitle .'" />
  8. <input type="submit" id="submit" />';
  9. }


mam nadzieję, że wszystko jasne jest snitch.gif
FlashSplash
Cytat(sebekzosw @ 17.08.2010, 10:43:26 ) *
Kod
SELECT * FROM `ulubione` WHERE `user_id` = ".$user_id ." AND `PageURL` = '".mysql_real_escape_string($_POST['fav-url']."';


Potem robisz zapytanie i zbierasz wyniki do tablicy funkcją mysql_fetch_assoc() i potem sprawdzasz czy tablica jest pusta - jeżeli jest pusta to znaczy ze tego wpisu nie ma w ulubionych czyli możesz wykonać dodawanie rekordu...


do tego proponuję dorobić jeszcze jeden warunek = id usera:
Kod
DELETE FROM `ulubione` WHERE `PageURL` = '".mysql_real_escape_string($PageURL)."' AND `user_id` = ".$user_id." LIMIT 1;


To rozumiem, tylko nie kumam tego połączenia tabeli forum_members z ulubione . Na jakiej zasadzie jest ta relacja wiele-do-jednego i jak ją stworzyć? Dzięki za pomoc smile.gif
sebekzosw
Kod
CREATE TABLE `ulubione` (
`id` INT NOT NULL AUTO_INCREMENT ,
`user_id` INT NOT NULL ,
`PageUrl` VARCHAR( 100 ) NOT NULL ,
PRIMARY KEY ( `id` )
)


i relacja zachodzi między `ulubione`.`user_id` a `forum_members`.`user_id` - rozumiesz ;>
thek
Tworzy Ci ją sama struktura tabeli ulubionych smile.gif

Masz użytkownika z określonym ID. Jeśli dodajesz coś do tabeli ulubionych to zamieszczasz w niej link, gdzie id_usera jest równoznaczne z ID. Jeśli spojrzysz w pewnym momencie to zauważysz, że relacja o której wspominasz utworzy w tabeli fav_url rekordy, gdzie wiele z nich ma dokładnie ten sam id_usera, wskazujący na określoną osobę. Z innej strony zastanawiałbym się, czy nie ma sensu tutaj lepiej tworzyć relacji wiele-do-wielu. Pewne popularne linki bowiem będą się powtarzać. W tym wypadku będziesz musiał zrobić osobną tablice linków, które zawsze będą unikatowe. Dodatkowo utworzysz tabelę łączącą, która id_linka powiąże z określonym id_usera.

Co Ci to daje? Będziesz mógł nie tylko zobaczyć jakie linki ma dany user w ulubionych, ale iść od drugiej strony także, czyli zobaczyć który link znajduje się jako ulubiony u wielu userów, a więc określić jego faktyczną popularność.
FlashSplash
Hmm rozumiem trochę. Tylko czy ja miałem wstawić $user_id czy to z tabeli forum_members (id_member) ?



W każdym razie póki co otrzymałem to. Przepraszam za moją ignorancję ale osobie która pomoże stawia jako zadośćuczynienie 2 piwa więc nie jest tak źle tongue.gif



Cytat(thek @ 17.08.2010, 11:29:56 ) *
Tworzy Ci ją sama struktura tabeli ulubionych smile.gif

Masz użytkownika z określonym ID. Jeśli dodajesz coś do tabeli ulubionych to zamieszczasz w niej link, gdzie id_usera jest równoznaczne z ID. Jesli spojrzysz w pewnym momencie to zauważysz, że relacja o której wspominasz utworzy w tabeli fav_url rekordy, gdzie wiele z nich ma dokładnie ten sam id_usera, wskazujący na określoną osobę. Z innej strony zastanawiałbym się, czy nie ma sensu tutaj lepiej tworzyć relacji wiele-do-wielu. Pewne popularne linki bowiem będą się powtarzać. W tym wypadku będziesz musiał zrobić osobną tablice linków, które zawsze będą unikatowe. Dodatkowo utworzysz tabelę łączącą, która id_linka powiąże z określonym id_usera.

Co Ci to daje? Będziesz mógł nie tylko zobaczyć jakie linki ma dany user w ulubionych, ale iść od drugiej strony także, czyli zobaczyć który link znajduje się jako ulubiony u wielu userów, a więc określić jego faktyczną popularność.


To jest dokładnie to co chciałbym osiągnąć a nawet jeszcze lepiej. Jak tego dokonać? *-*
sebekzosw
w tabeli `ulubione` zamieniasz `PageURL`na `page_id` typu INT i tworzysz nową tabelę, kolejną

Kod
CREATE TABLE `pageURL` (
`id` INT NOT NULL AUTO_INCREMENT ,
`PageUrl` VARCHAR( 100 ) NOT NULL ,
PRIMARY KEY ( `id` )
)
FlashSplash
Cytat(sebekzosw @ 17.08.2010, 11:38:45 ) *
w tabeli `ulubione` zamieniasz `PageURL`na `page_id` typu INT i tworzysz nową tabelę, kolejną

Kod
CREATE TABLE `pageURL` (
`id` INT NOT NULL AUTO_INCREMENT ,
`PageUrl` VARCHAR( 100 ) NOT NULL ,
PRIMARY KEY ( `id` )
)

Ulubione:


PageUrl:


To się robi skomplikowane haha.gif A co z PageName? Zostaje tak jak jest? W końcu użytkownik woli klikać w tytuł aniżeli w adres http:.

Dzięki za pomoc!
thek
Dodajesz 2 tabele. Jedną podał Ci sebekzosw. Druga to:
  1. CREATE TABLE `page_user` (
  2. `id_url` INT NOT NULL,
  3. `id_user` INT NOT NULL,
  4. INDEX ( `id_url` )
  5. INDEX ( `id_user`)
  6. )
W chwili operacji będziesz tylko robił odpowiednie JOIN i ograniczał albo do określonego id_url = X, albo id_user = Y smile.gif

EDIT: A pageName możesz wrzucić do PageUrl jako dodatkową, trzecią, kolumnę.

Tak więc zostajesz z 3 tabelami: forum_members, gdzie najważniejszy jest jego id_member bo go używasz do łączenia, PageUrl, gdzie najważniejszy jest jego id, też do łączenia. I ostatnia, czyli page_user, która łączy wszystkie te dane smile.gif
FlashSplash
Cytat(thek @ 17.08.2010, 11:51:13 ) *
Dodajesz 2 tabele. Jedną podał Ci sebekzosw. Druga to:
  1. CREATE TABLE `page_user` (
  2. `id_url` INT NOT NULL,
  3. `id_user` INT NOT NULL,
  4. INDEX ( `id_url` )
  5. INDEX ( `id_user`)
  6. )
W chwili operacji będziesz tylko robił odpowiednie JOIN i ograniczał albo do określonego id_url = X, albo id_user = Y smile.gif

EDIT: A pageName możesz wrzucić do PageUrl jako dodatkową, trzecią, kolumnę.

Tak więc zostajesz z 3 tabelami: forum_members, gdzie najważniejszy jest jego id_member bo go używasz do łączenia, PageUrl, gdzie najważniejszy jest jego id, też do łączenia. I ostatnia, czyli page_user, która łączy wszystkie te dane smile.gif


No dobra. Czyli mam 3 tabele, id_member która definiuje użytkownika, PageUrl w której przetrzymywane są wszystkie url dodane do ulubionych oraz page_user która definuje który user ma jakie url. Jeśli dobrze kumam.

Sytuacja tabel

ulubione:

PageUrl:

page_user:


I co dalej? Jak to połączyć z php i tym formularzem widocznym w pierwszym poście?
Chyba będę musiał 2 osobom postawić piwo haha.gif
sebekzosw
1)Wysyłasz formularz
2) Z tabeli `PageUrl` pobierasz id rekordu, w którym spełniony jest warunek WHERE `PageUrl` = '".mysql_real_escape_string($_POST['fav-url'])."'; ($id = $row['id']; )
a) jeżeli tablica jest pusta dodajesz nowy rekord z formularza i pobierasz jego nowy identyfikator ($id = mysql_insert_id(); )


i do tabeli `ulubione` dodajesz $user_id i $id

Najlepiej jakby pole `PageUrl`.`PageUrl` było UNIQUE

P.S.: moim zdaniem tabela `page_user` jest zbędna
FlashSplash
Cytat(sebekzosw @ 17.08.2010, 12:35:24 ) *
1)Wysyłasz formularz
2) Z tabeli `PageUrl` pobierasz id rekordu, w którym spełniony jest warunek WHERE `PageUrl` = '".mysql_real_escape_string($_POST['fav-url'])."'; ($id = $row['id']; )
a) jeżeli tablica jest pusta dodajesz nowy rekord z formularza i pobierasz jego nowy identyfikator ($id = mysql_insert_id(); )


i do tabeli `ulubione` dodajesz $user_id i $id

Najlepiej jakby pole `PageUrl`.`PageUrl` było UNIQUE

P.S.: moim zdaniem tabela `page_user` jest zbędna


Mógłbym Cię poprosić o cały kod? smile.gif

Mam coś takiego:
  1. $con = mysql_connect("localhost","database_name","hasło");
  2. if (!$con)
  3. {
  4. die('Could not connect: ' . mysql_error());
  5. }
  6. mysql_select_db("cartoonc_ulubione", $con);
  7. $user_id = $context['user']['id'];
  8. $curPageURL = curPageURL();
  9. $curPageName = curPageName();
  10.  


Hasło i database_name ofc ukryłem. Ja potem cały kod przeanalizuje i się nauczę (bo swoją drogą i tak muszę do innej rzeczy).
sebekzosw
tu masz dodawanie do ulubionych:

  1. $id = mysql_result(mysql_query("SELECT `id` FROM `PageUrl` WHERE `PageUrl` = '".mysql_real_escape_string($_POST['fav-url']).""),0);
  2. if(empty($id))
  3. {
  4. mysql_query("INSERT INTO `PageUrl` (`PageUrl`, `PageName`) VALUES ('".mysql_real_escape_string($_POST['fav-url'])."' , '".mysql_real_escape_string($_POST['fav-title'])."');");
  5. $id = mysql_insert_id();
  6. }
  7. mysql_query("INSERT INTO `ulubione` (`id_member`, `page_id`) VALUES ('".$user_id."' , '".$id."');");


a tutaj masz formularz, tylko zapytanie jest pisane z palca więc nie wiem czy jest poprawne:

  1. $fav = mysql_fetch_assoc(mysql_query("SELECT * FROM `PageUrl` AS `pu`
  2. LEFT JOIN `ulubione` AS `u` ON `u`.`page_id`=`pu`.`id`
  3. WHERE `u`.`id_member` = '$user_id' AND `pu`.`PageUrl` = '".mysql_real_escape_string($PageURL)."'"));
  4.  
  5. if(empty($fav))
  6. {
  7. echo '<form action="add_fav.php" method="post">
  8. <input type="hidden" name="fav-url" value="'. $PageURL .'" />
  9. <input type="hidden" name="fav-title" value="'. $PageTitle .'" />
  10. <input type="submit" id="submit" />';
  11. }
thek
Sebekzosw...
W relacji N-N istnieją 3 tabele z polami pracującymi:
forum_members: (różne kolumny) + member_id
pageUrl: id, pageUrl, pageName
user_page: id_url, id_user

Zwróć uwagę na to, że Ulubione i user_page to tak naprawdę to samo, przy czym klucz primary na id jest zbędny. W zasadzie ta kolumna nie jest do niczego potrzebna smile.gif Kompletnie przy tym niemal olewasz sprawdzanie czy rekordy się nie dublują, czy istnieją. Patrz na kod swój. Sprawdzasz czy istnieje url w pageUrl. Jeśli nie - wrzucasz do tej tabeli. Nawet nie sprawdzasz czy mysql_result zwrócił Ci wynik, licząc na domyślne 0 w przypadku braku winksmiley.jpg Tymczasem strona będzie sypała warning w tle zapewne, bo brak kolumny w wyniku jakiejkolwiek. Od razu dodajesz też fava po tym do ulubionych. A sprawdziłeś czy takowy już się w ulubionych nie znajduje przypadkiem? Ja nic takiego nie widzę winksmiley.jpg

Ale idziemy do działania kodu...
Teraz mając formularz, możesz go wysłać i po stronie php sprawdzasz, czy taki url znajduje się wśród rekordów tego usera. Jak? Przypuśćmy, że masz w sesji przechowywany id tego usera (częsta praktyka) robisz JOINa między pageUrl i user_page, gdzie pageUrl.id = user_page.id_url i ograniczasz do tych rekordów WHERE user_page.id_user = id_usera z sesji smile.gif Masz w ten sposób wszystkie jego fav(!) i dodatkowo możesz nawet już teraz w WHERE oprócz id_usera walnąć sprawdzenie czy pageUrl.pageUrl jest równy adresowi z formularza. Jeśli zapytanie zwróci 0 wyników - jesteś w domu -> nie ma tego fava jeszcze i dodaj. Jest coś w wyniku -> link już jest w ulubionych. To samo będzie tyczyć dodawania i edycji. Sprawdzasz wpierw czy taki istnieje w fav. Jeśli nie, sprawdzasz czy taki url istnieje już w pageUrl. Jeśli tak wyciągasz jego id. Jeśli nie - dodajesz pozycję do tabeli i wyciągasz id. Uwaga na edycję! Tutaj nie sprawdzasz czy dany id już istnieje, ale czy taki link istnieje. Jest to niejako "powtórzenie" tego samego co przy insert winksmiley.jpg Edycja powiedzie się tylko gdy takiego linku nie ma wśród już będących fav, a na dodatek "edytowany" fav, przy całej operacji usuwa swoje połączenie z tabeli user_page smile.gif Robi to dlatego, by się nie zdublować, a dodatkowo jeśli adres url ulegnie zmianie, nie zostawi on "starego" ulubionego na liście. Zauważ też, że nie możesz usunąć nic z tabeli pageUrl, gdyż inni userzy mogą ten link mieć w swoich ulubionych. Możesz tylko usunąć samo powiązanie. Usunięcie zaś linka z ulubionych to proste usunięcie owego "łącznika" z tabeli user_page.

Gdybyś sprawdził error_reporting to byś się zdziwił jak często Ci sypie coś. Nawet nie sprawdzasz czy dodawanie uległo wykoaniu, bo znów liczysz, że w razie powtórzonego klucza wywali o już istniejącym takim. Błąd myślenia. Wywaliło by błąd, gdyby istniał klucz unique na połączonych kolumnach id_url + id_user, bo tylko wtedy przy próbie dodania baza się oburzy, że takowy wpis już istnieje i nie dokona dodania nowego rekordu. Nigdzie nawet nie sprawdzasz faktu poprawności dodania rekordów. Co nam po mysql_insert_id(), skoro baza się może rąbnąć akurat wtedy i dostaniesz śmieci, które zechcesz przepchnąć do ulubionych. Twój kod nie ma żadnej kontroli nad tym co się dzieje po stronie i czy jest to poprawne. Nie kontrolujesz insertów i delete poprzez mysql_affected_rows. Takie coś się niezauważenie będzie mścić, aż do czasu aż nie zapłaczesz nad rekordami, które są choć ich być nie powinno lub nie ma choć być powinny. To poważny błąd związany ze spójnością danych.
FlashSplash
Cytat(sebekzosw @ 17.08.2010, 13:15:42 ) *
tu masz dodawanie do ulubionych:

  1. $id = mysql_result(mysql_query("SELECT `id` FROM `PageUrl` WHERE `PageUrl` = '".mysql_real_escape_string($_POST['fav-url']).""),0);
  2. if(empty($id))
  3. {
  4. mysql_query("INSERT INTO `PageUrl` (`PageUrl`, `PageName`) VALUES ('".mysql_real_escape_string($_POST['fav-url'])."' , '".mysql_real_escape_string($_POST['fav-title'])."');");
  5. $id = mysql_insert_id();
  6. }
  7. mysql_query("INSERT INTO `ulubione` (`id_member`, `page_id`) VALUES ('".$user_id."' , '".$id."');");


a tutaj masz formularz, tylko zapytanie jest pisane z palca więc nie wiem czy jest poprawne:

  1. $fav = mysql_fetch_assoc(mysql_query("SELECT * FROM `PageUrl` AS `pu`
  2. LEFT JOIN `ulubione` AS `u` ON `u`.`page_id`=`pu`.`id`
  3. WHERE `u`.`id_member` = '$user_id' AND `pu`.`PageUrl` = '".mysql_real_escape_string($PageURL)."'"));
  4.  
  5. if(empty($fav))
  6. {
  7. echo '<form action="add_fav.php" method="post">
  8. <input type="hidden" name="fav-url" value="'. $PageURL .'" />
  9. <input type="hidden" name="fav-title" value="'. $PageTitle .'" />
  10. <input type="submit" id="submit" />';
  11. }


Super! Jak tylko jeszcze usunę wszystkie błędy i będzie działał to z przyjemnością poproszę o Twoje GG tongue.gif
Mały problem: Warning: mysql_result(): supplied argument is not a valid MySQL result resource in /home/cartoonc/public_html/add_fav.php on line 29
Something is wrong in your syntax obok ''' w linii 1
  1. $id = mysql_result(mysql_query("SELECT `id` FROM `pageURL` WHERE `PageUrl` = ".mysql_real_escape_string($_POST['fav-url']).""),0); echo mysql_error();


Cytat(thek @ 17.08.2010, 13:36:38 ) *
Sebekzosw...
W relacji N-N istnieją 3 tabele z polami:
forum_members: (różne kolumny) + member_id
pageUrl: id, pageUrl, pageName
user_page: id_url, id_user

Teraz mając formularz, możesz go wysłać i po stronie php sprawdzasz, czy taki url znajduje się wśród rekordów tego usera. Jak? Przypuśćmy, że masz w sesji przechowywany id tego usera (częsta praktyka) robisz JOINa między pageUrl i user_page, gdzie pageUrl.id = user_page.id_url i ograniczasz do tych rekordów WHERE user_page.id_user = id_usera z sesji smile.gif Masz w ten sposób wszystkie jego fav(!) i dodatkowo możesz nawet już teraz w WHERE oprócz id_usera walnąć sprawdzenie czy pageUrl.pageUrl jest równy adresowi z formularza. Jeśli zapytanie zwróci 0 wyników - jesteś w domu -> nie ma tego fava jeszcze i dodaj. Jest coś w wyniku -> link już jest w ulubionych. To samo będzie tyczyć dodawania i edycji. Sprawdzasz wpierw czy taki istnieje w fav. Jeśli nie, sprawdzasz czy taki url istnieje już w pageUrl. Jeśli tak wyciągasz jego id. Jeśli nie - dodajesz pozycję do tabeli i wyciągasz id. Uwaga na edycję! Tutaj nie sprawdzasz czy dany id już istnieje, ale czy taki link istnieje. Jest to niejako "powtórzenie" tego samego co przy insert winksmiley.jpg Edycja powiedzie się tylko gdy takiego linku nie ma wśród już będących fav, a na dodatek "edytowany" fav, przy całej operacji usuwa swoje połączenie z tabeli user_page smile.gif Robi to dlatego, by się nie zdublować, a dodatkowo jeśli adres url ulegnie zmianie, nie zostawi on "starego" ulubionego na liście. Zauważ też, że nie możesz usunąć nic z tabeli pageUrl, gdyż inni userzy mogą ten link mieć w swoich ulubionych. Możesz tylko usunąć samo powiązanie. Usunięcie zaś linka z ulubionych to proste usunięcie owego "łącznika" z tabeli user_page


Łał. Jesteś w stanie napisać kod z twoimi myślami? smile.gif
thek
Jestem w stanie, ale właśnie dlatego ładnie napisałem całość, byś mógł sam spróbować to zrobić. Forum nie jest tylko od podawania gotowców, ale wskazówek przede wszystkim. Ja podałem wyczerpujący opis na co uważać i jak to zrobić. Resztę zostawiam osobom zainteresowanym. I nic nie musisz mi stawiać, bo i tak mi na tym nie zależy. Najwyżej sebekzosw skorzysta, poprawiając według wskazówek moich kod swój dla Ciebie.

I to jest dokładnie co pisałem... Wywalił Ci przy mysql_result błąd, choć sądziłem, że warna tylko sypnie. To jest to co wspomniałem jako:
Cytat
Nawet nie sprawdzasz czy mysql_result zwrócił Ci wynik, licząc na domyślne 0 w przypadku braku. Tymczasem strona będzie sypała warning w tle zapewne, bo brak kolumny w wyniku jakiejkolwiek.
Jest to fragment dodany w chwilę później, bo edytowałem post gdy Ty dodałeś akurat swojego smile.gif
FlashSplash
Cytat(thek @ 17.08.2010, 14:14:34 ) *
Jestem w stanie, ale właśnie dlatego ładnie napisałem całość, byś mógł sam spróbować to zrobić. Forum nie jest tylko od podawania gotowców, ale wskazówek przede wszystkim.

Widzisz, tutaj jest mały problem. Póki co jestem kompletnie w tyłku jeśli chodzi o termin, i muszę to zrobić jak najszybciej. Wobec czego nie mam kompletnie czasu na naukę na razie. Dlatego poprosiłem o kod, który będę mógł przeanalizować. W pełni cię rozumiem, też mówię tak do ludzi na innych forach, i wiem że moja "oferta" jest gówniana ale dopiero zaczynam i "budżet" w zasadzie nie istnieje.

Dlatego nie ma póki co opcji żebym to samemu zrobił, jako że wczoraj pierwszy raz zacząłem pracować z MySQL. Pozdrawiam i dzięki za pomoc! smile.gif
thek
Podam skrócony opis słowny
1. Przefiltruj url
2. Pobierz id_usera z sesji
3. Wstawienie rekordu:
a) sprawdź czy w połączonych tabelach user_page i pageUrl jest wpis dla usera z tym user_id i tym pageUrl
cool.gif jeśli nie - sprawdź czy jest wpis w tabeli pageUrl o tym pageUrl
- jeśli nie: dodaj adres do pageUrl i pobierz jego id. Dodaj to id oraz id usera do user_page
- jeśli tak: pobierz id tego url i dodaj to id oraz id_usera do user_page
c) jeśli tak - walnij komunikat, że wpis już jest.
4. Edycja rekordu:
a) sprawdź czy w połączonych tabelach user_page i pageUrl jest wpis dla usera z tym user_id i tym pageUrl
cool.gif jeśli nie, usuń ten wpis z user_page i sprawdź czy jest wpis w tabeli pageUrl o tym pageUrl
- jeśli nie: dodaj adres do pageUrl i pobierz jego id. Dodaj to id oraz id usera do user_page
- jeśli tak: pobierz id tego url i dodaj to id oraz id_usera do user_page
c) jeśli tak - walnij komunikat, że wpis już jest.
5. Usunięcie rekordu:
a) usuń wpis o danym url z user_page
Zaznaczam, że każdy "dodaj" i "usuń" muszą być sprawdzone, jak róznież istnieje konieczność sprawdzenia czy wyniki są prawidłowe przy pobieraniu informacji do sprawdzenia. Nie można od razu walić mysql_result ( mysql_query( zapytanie ) ) bo nie obsłuży się błędów inaczej. Na wstępie minimum to
  1. $res=mysql_query(poprawne_zapytanie);
  2. if( $res && mysql_num_rows( $res) > 0 ) {}
oraz
  1. $res=mysql_query(poprawny_insert_lub_delete);
  2. if( $res && mysql_affected_rows() > 0 ) {}
Zauważ, że operacje update'u nic nie update'ują! To konieczność usunięcia starych powiązań i utworzenia nowych, czasem ze stworzeniem nowego rekordu w pageUrl...

Zobacz jak niewiele rzeczy różni edycję i dodanie! To niemal lustrzane kopie. Update jedynie dodatkowo usuwa stare dowiązanie z tabeli user_page(!). Poza tym są identyczne. Wystarczy więc na pewnym etapie sprawdzić z czym mamy do czynienia, ale poza tym kod dla obu rzeczy nie musi być nawet kopiowany, może być nim po prostu na zasadzie:
  1. $operacja = typ operacji;
  2. if( $operacja == 'insert' || $operacja == 'update' ) {
  3. zrób punkt a)
  4. rób punkt b) bez podpunktów
  5. if( $operacja == 'update')
  6. usuń wpis z user_page;
  7. wykonaj podpunkty i resztę operacji
  8. }
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.