Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] Usuwanie postów przez użytkowników
Forum PHP.pl > Forum > Przedszkole
marcin0077
Witam
Chciałem zrobić aby użytkownicy mogli usuwać swoje posty ale mam problem z kodem podczas usuwania.

  1. if(@$_SESSION["power"] != 1){
  2. header("Location: ./");
  3. }
  4. $db->query("DELETE FROM items WHERE id = '" . $_GET["id"] . "'");
  5. $db->query("DELETE FROM comments WHERE picId = '" . $_GET["id"] . "'");
  6. header("Location: " . $_SERVER["HTTP_REFERER"]);


próbowałem coś takiego:

  1. if(@$_SESSION["power"] != 1 || $_SESSION["uid"] != $row["uid"] ){
  2. header("Location: ./");
  3. }
  4. $db->query("DELETE FROM items WHERE id = '" . $_GET["id"] . "'");
  5. $db->query("DELETE FROM comments WHERE picId = '" . $_GET["id"] . "'");
  6. header("Location: " . $_SERVER["HTTP_REFERER"]);



oraz inne kombinacje ale niestety nic ;/
chciałbym zrobić również aby podczas usuwania, usuwało też zdjęcie. W bazie danych jest to oznaczone jako md5id (jest to pełna nazwa zdjęcia z rozszerzeniem) a zdjęcie znajduje się w folderze "_pic"

Proszę o pomoc
thek
Powiedz co to jest to power, bo być może dlatego masz problem. Robi Ci przekierowanie zamiast usuwanie i stąd problem możesz mieć. Domyślam, że to oznaczenie admina. To teraz pomyśl, czy dojdzie do usuwania, jeśli ktoś nie jest adminem, a chce usunąć swoje zdjęcie winksmiley.jpg Nadal nie spełni warunku i go przekieruje zamiast zrobić delete. Musisz inaczej to rozplanować smile.gif Zwróć też uwagę, że skrypt ten po uwzględnieniu usera może usuwać zdjęcia nie będące własnością usera. To już jest niebezpieczne. Jak się tego ustrzec? Prosto. Twórz zapytanie, które po walidacji zmiennej id ( teraz nie sprawdzasz tego pod kątem ataku sqlinjection ) wstawiało ją do zapytania, ale jeśli user nie jest adminem, to dodatkowo dokładają warunkowo w where jeszcze z choćby sesji - id usera. W bazie zdjęć przechowujesz oczywiście id użytkownika, który dane zdjęcie dodał? W efekcie powstanie zapytanie, które będzie, mimo poprawnego id, nieprawidłowe jeśli user będzie nie tym co trzeba.
Przykładowo tabela items ma pozycje. id, md5id, user_id
W sesji trzymasz: id, power
Zmienne są już po sprawdzeniu choćby funkcjami ctype_digit czy filter_var
  1. $sql = 'DELETE FROM items WHERE id = '.$_GET['id'];
  2. if( $_SESSION['power'] != 1 )
  3. $sql .= ' AND user_id = '.$_SESSION['id'];
  4. //musimy sprawdzić, czy mimo wykonania się delete cokolwiek zostało usunięte, stąd affected_rows
  5. //oczywiście nie musi się to tak nazywać, ale zapewne będzie funkcja do tego celu służąca
  6. if( $resource = $db->query( $sql ) AND $db->affected_rows() > 0 )
  7. //jeśli coś zmieniono, to oczywiście można modyfikować i usuwać coś innego, dalej...
  8. else
  9. echo 'Shit happens!';


EDIT: Dlaczego tak? Ponieważ usunięcie przez admina wykona się zawsze. Nic specjalnego. Usunięcie przez usera prawidłowego? Id zdjęcia jest ok, a id usera w sesji prawidłowe z tym zapisanym w items. Super, delete znajdzie taki rekord i go usunie. Usuwanie przez usera nieprawidłowego? Id zdjęcia się zgadza, ale id usera w sesji niezgodne z tym co w items. Delete jest prawidłowe, ale nie ma rekordu , który spełnia oba warunki. Affected rows zwróci 0. Możesz więc przyjąć, że koleś o zadanym id chciał wykonać działanie bez uprawnień i dać mu warna lub sobie to odnotować w logach. Więcej takich akcji i koleś wylatuje z serwisu smile.gif
marcin0077
Tak. power to admin.
Patrze na to i nie czaje ;/

  1. if( $_SESSION['power'] != 1 )

tutaj czasem nie powinno być == zamiast != ?

Zmieniłem
  1. $sql .= ' AND user_id = '.$_SESSION['id'];

na swoje
  1. $sql .= ' AND uid = '.$_SESSION['uid'];


ale
Fatal error: Call to a member function query() on a non-object in /home/............... on line 30
thek
To != 1 jest dodatkiem, który reaguje na obecność admina. Jeśli jest adminem to nie dodaje tego fragmentu. Jesli nie jest, to musi być sprawdzenie czy przypadkiem Tomek, nie chce usunąć posta napisanego przez Adama winksmiley.jpg
Co do błędu to masz wyraźnie napisane co jest problemem. Funkcja query wykonuje się na czymś co nie jest obiektem. Brak więc obiektu $db prawidłowego i stąd błąd.
Zawsze możesz też
$resource = $db-> query( $sql);
pchnąć przed IFem i do samego przekazać jedynie
if( $resource AND ... )
marcin0077
Cytat
Funkcja query wykonuje się na czymś co nie jest obiektem. Brak więc obiektu $db prawidłowego i stąd błąd.


ale co z tym zrobić ?
mortus
Może dołącz na początku plik, w którym inicjujesz obiekt $db. Nie wiem, jak ten plik się u Ciebie nazywa, ale użyj np. include. Jeśli nie masz takiego pliku, to brakuje Ci linii w tym stylu:
  1. $db = Db();
gdzie Db to nazwa klasy obsługującej bazę danych.
marcin0077
  1. include("_xfiles/db/database.config.php");
  2. $sql = 'DELETE FROM items WHERE id = '.$_GET['id'];
  3. if( $_SESSION['power'] != 1 )
  4. $sql .= ' AND uid = '.$_SESSION['uid'];
  5.  
  6. $resource = $db-> query( $sql);
  7. if( $resource AND $db ->affected_rows() > 0 ) {}
  8.  
  9. else
  10. {
  11. echo "Shit happens!";
  12. }
  13. ?>


Działa usuwanie własnych postów ale nie działa usuwanie postów użytkowników przez admina. Pojawia się biała strona ale nie usuwa
Jeśli użytkownik próbuję usunąć nie swoje zdjęcie to też pojawia się biała strona i nie usuwa a przecież powinno być shit happens
mortus
Bo powinno być tak:
[PHP] delete.php - pobierz, plaintext
  1. include("_xfiles/db/database.config.php");
  2. $sql = 'DELETE FROM items WHERE id = '.$_GET['id'];
  3. if( $_SESSION['power'] != 1 ) {
  4. $sql .= ' AND uid = '.$_SESSION['uid'];
  5. }
  6. $resource = $db-> query( $sql);
  7. if( $resource AND $db ->affected_rows() > 0 ) {
  8. } else {
  9. echo "Shit happens!";
  10. }
  11. ?>
[PHP] delete.php - pobierz, plaintext
Zapytanie ma być wykonane również wtedy, kiedy użytkownik jest adminem, kiedy nie jest, to dokładamy do zapytania warunek ' AND uid=id_użytkownika'.
EDIT:
@down Brakowało. Już poprawiane.
marcin0077
brakowało jeszcze klamry otwierającej {
Teraz działa smile.gif

Chciałbym zrobić jeszcze 1 warunek że jeśli w bazie isYouTube = 0 to usuwało zdjęcie md5id (nazwa zdjęcia) który znajduje się w folderze _pic
Jest to wykonalne?
mortus
Da się. Zaraz po tym include musisz wstawić kod, który wybierze Ci odpowiedni item z tabeli (SELECT ... WHERE id=$_GET['id']). Później odczytujesz zwrócony rekord (mysql_fetch_array()) i sprawdzasz, czy w komórce isYouTube znajduje się wartość 0 (zwykły if($rekord['isYouTube']). Jeśli tak, to usuwasz określony plik (unlink). Później wrzucasz kod odpowiedzialny za usuwanie. Pokombinuj i daj znać, jak Ci idzie.
marcin0077
o ja, dobra dam sobie spokój bo nie wiem nawet z 'czym to się je'
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.