Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [JavaScript][MySQL][PHP] Odnośnik usuwający rekord + przesyłający zmienną do nowej strony
Forum PHP.pl > Forum > Przedszkole
Kuza
Witam,

Moje pytanie jest z natury jak się to poprawnie (zgodnie ze standardami, wymogami bezpieczeństwa itp.) powinno robić.

Mam panel użytkownika w którym user za pomocą odnośnika może skasować sobie dodane wcześniej zdjęcie (z serwera jak i rekord w bazie danych). Czy dobrym rozwiązaniem będzie zaopatrzyć odnośnik w onClick="return funkcja_usuwajaca_zdjecie()" (czyli, czy te rozwiązanie jest dobre?) ? Dodatkowo chciałbym aby po usunięciu zdjęcia i przeniesieniu go na stronę główną wyświetlała się notka 'Plik został poprawnie usunięty' + po odświeżeniu strony notka znikała. Pomysł taki - nie wiem czy wykonalny - aby przesłać wraz z odnośnikiem zmienną, a następnie po wyświetleniu ów notki usunąć zmienną (niestety nie wiem jak do tego się zabrać - oraz czy jest na to inny, lepszy sposób?).

Pozdrawiam i witam wszystkich raz jeszcze, jako nowy użytkownik.
thek
Pomyślmy.. W sesji przechowujesz id użytkownika. W momencie gdy chce on zdjęcie usunąć linkiem jako parametr rzucamy do zmiennej GET id_fotki czy inny identyfikujący ją wskaźnik. Sprawdzamy, czy taka fotka jest w bazie i dodał ją ten user (bo chyba zapisujesz kto dodał daną fotografię w bazie, a przynajmniej id tego usera?). Jeśli wszystko jest ok, możesz usuwać. No i nieco przerób skrypt, by admina pod kątem praw nie sprawdzało winksmiley.jpg On może usuwać wszystko. O co mi mnie więcej chodzi?
  1. //tutaj pobranie z GET id zdjęcia i jego oczyszczanie (ctype_digit, filter_var czy co tam chcesz)
  2. //ja tego nie piszę tylko przejdę od razu do schematu...
  3. $check_sql = 'SELECT path FROM photos WHERE id = '.$_GET['photo_id'];
  4. if( !$_SESSION['admin'] )
  5. $check_sql .= ' AND owner = '.$_SESSION['user_id'];
  6. $check_sql .= ' LIMIT 1';
  7. $check_res = mysql_query( $check_sql );
  8. if( $check_res && mysql_num_rows( $check_res ) > 0 ) {
  9. //tutaj usuwanie z bazy wpisu
  10. //dopiero gdy się usuwanie z bazy POWIEDZIE (mysql_affected_rows dla DELETE zwróci liczbę większą od 0)
  11. //usuń zdjęcie fizycznie z serwera
  12. } else {
  13. //wywal komunikat do zmiennej lub prosto na ekran w stylu 'Sorry Batory, ale serwer leży albo próbujesz usunąć nie swoje zdjęcie."
  14. }


EdIT: O co mi chodzi ze sprawdzeniem powodzenia usuwania zdjęcia z bazy? Może dojść do sytuacji, że w bazie wpis o zdjęciu zostanie, ale zostanie zdjęcie usunięte fizycznie z serwera. lub na odwrót. Zdjęcie zostanie, choć baza będzie wskazywać, że zostało usunięte. I tak źle i tak niedobrze. Stąd uzależnienie kasowanie zdjęcia z dysku w sytuacji gdy już zostało ono wywalone z bazy, jest znacznie bezpieczniejszym rozwiązaniem. Choć z dwojga złego lepiej jeśli ono jest na dysku serwera, nawet jeśli baza o nim nie wie, niż na odwrót smile.gif Samo podejście to mała zmiana mojego powyższego kodu. Popatrz jak tworzę $check_sql i co robię oraz podobnie zrób dla DELETE, tylko zamiast mysql_num_rows użyj mysql_affected_rows.

A co do komunikatów to możesz także posłużyć się zmienną sesyjną smile.gif Do sesji wysyłasz sobie komunikaty w jakiejś określonej postaci i w określonych miejscach strony sprawdzasz, czy sesja dla komunikatów jest pusta. Jeśli nie to wyświetlasz te komunikaty i czyścisz zmienną sesyjną, by po przeładowaniu strony nie pokazały się one ponownie.
Kuza
Dziękuję za pomoc, jednak stoję jeszcze w jednym punkcie, a mianowicie:

Cytat(thek @ 18.07.2010, 00:11:50 ) *
Do sesji wysyłasz sobie komunikaty w jakiejś określonej postaci


W chwili kliknięcia na odnośnik powinienem do zmiennej sesyjnej dodać ten komunikat, jednak zupełnie nie wiem jak to zrobić. Potrzebuję coś w stylu:

if(wciśnięto_odnośnik() )
{
$_SESSION['komunikat'] = 'zdjęcie zostało usunięte';
}

A już na stronie głównej wyczyszczenie $_SESSION['komunikat'] tuż po wyświetleniu komunikatu.

Pozdrawiam.
thek
W momencie gdy masz jakiś komunikat dodać - ustaw zmienną. Przykład? Ciut wyższy kod jaki podałem winksmiley.jpg
  1. if( $check_res && mysql_num_rows( $check_res ) > 0 ) {
  2. //tutaj usuwanie z bazy wpisu
  3. //dopiero gdy się usuwanie z bazy POWIEDZIE (mysql_affected_rows dla DELETE zwróci liczbę większą od 0)
  4. //usuń zdjęcie fizycznie z serwera
  5. } else {
  6. $_SESSION['komunikat'] = 'Sorry Batory, ale serwer leży albo próbujesz usunąć nie swoje zdjęcie.';
  7. }
Przy czym osobiście nieco inaczej sprawę rozwiązuję niż zasugerowałeś. U mnie komunikaty są tablicą. Czemu? Bo mogę chcieć wysłać nie jeden ale kilka komunikatów, niekoniecznie oznaczających błędy(!). Zamiast więc ustawiać tylko jeden, mogę wysłać tablicę całą, z których tylko 1 będzie błędem, 3 jakimiś informacjami, a 2 to komunikaty powodzenia. Wygodniej wtedy mieć:
$_SESSION['komunikaty'][] = array('typ' => 'wybrany typ', 'komunikat' => 'Jakiś komunikat');
Gdzie 'wybrany_typ' to u mnie: 'err', 'ok' lub 'inf' co implikuje mi 3 klasy w CSS, które ładnie mi je wyróżniają. A odczyt? W określonym miejscu kodu coś w stylu:
  1. if( !empty( $_SESSION['komunikaty'] ) && count( $_SESSION['komunikaty'] ) > 0 ) {
  2. foreach( $_SESSION['komunikaty'] AS $wpis ) {
  3. echo '<div class="'.$wpis['typ'].'">'.$wpis['komunikat'].'</div>';
  4. }
  5. unset( $_SESSION['komunikaty'] );
  6. }
Popatrz... Może coś podobnego Ci się przyda po przeróbkach.
Kuza
A np. rozsądnym byłoby w przypadku naciśnięcia odnośnika uruchomić funkcję (za pomocą onclicka) usuwającą zdjęcie + w przypadku dobrze wykonanej czynności przesłać do mysql'a komunikat, że wszystko ok i następnie odczytujemy go na stronie (a po odczycie kasacja wpisu)? Nie musielibyśmy wtedy angażować $_GET'a.

Może inaczej: Jak to robi photobucket.com, że usuwamy zdjęcie -> przechodzimy do nowej strony bez $_GETa -> pojawia się komunikat a po refreshu znika. Albo choćby bliższa nam nasza klasa, prawie ta sama akcja -> po potwierdzeniu chęci usunięcia zdjęcia (tutaj naszym przyciskiem jest już przycisk formularza) przenosi nas na główną stronę albumu -> notka o kasacji -> refresh i informacja znika winksmiley.jpg. Co trzeba zaangażować, żeby takie coś uzyskać; gdzie ma zacząć szukać początkujący (niestety nawet nie wiem jakie pytanie google zadać, próbowałem coś w stylu success message how to), a najlepiej - jak to wykonać winksmiley.jpg?

Wybacz/wybaczcie upierdliwość i pozdrawiam.
thek
Nie korzystam z żadnego z wymienionych serwisów więc zgaduję, że po drodze jest użyty AJAX. I tam też jest na bank GET, tylko nie widać go jawnie, lub całość jest ujęta w formularz, czyli dane typu POST.
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.