[php]problem ze scryptem

Proszę o pomoc jak poprawić scrypt aby nie wyświetlał wszystkie zdjęcia do usunięcia tylko jedno zalogowanego użytkownika.

$folder = "./avatar/";

    $usun = $_GET["usun"];

    $lista=array();

    $katalog = opendir($folder);

    while ($plik = readdir($katalog)) {

      if ($plik<>"." && $plik<>".." && !is_dir($folder.$plik)) {

            if (md5($plik)==$usun)

      {

      unlink($folder.$plik); require 'db.php';

          $zapytanie = "DELETE id,nick,link_avatar = '".$plik."' FROM uzytkownicy WHERE nick='$nick' limit 1 ";

        $idzapytania = mysql_query($zapytanie); $wiersz = mysql_fetch_object($nick);         

          if (mysql_query($zapytanie, $wiersz)) {

          echo "Usunięto obiekt";

          echo "Wystąpił błąd:"; mysql_error();

          } }                                                     

        else $lista[$si]=$plik;

        }

        }

        closedir($katalog);

        sort($lista);

        for ($i=0;$i
          echo "[usun]";

          echo "";

          echo "$lista[$i]";


        } [/code]

Przekombinowane.

Pytanie, po co listować cały katalog, skoro chcesz usunąć jeden plik?

-wystarczyło by przecież odebrać hash pliku, sprawdzić (file_exists) czy istnieje plik w lokalizacji katalog/hash.rozszerzenie

-jeżeli istnieje, unlink i komunikat o powodzeniu, jeżeli nie …odpowiedni komunikat

Codo fotki użytkownika, to też nie widzę potrzeby listowania wszystkich plików z katalogu.

Powinieneś mieć przyjęty jakiś sposób identyfikowania jego fotki. Np hash nicka, czy jakikolwiek inny unikalny identyfikator usera.

I znowu, sprawdzasz czy odpowiednia ścieżka istnieje - jeżeli tak, to user ma fotkę i możesz ją wyświetlić czy co tam zechcesz.

Proszę o pomórzcie,nie mogę sobie poradzić z tym scryptem bo wywala mi cały czas błąd,albo listuje wszystkie zdjęcia.Jak to napisać aby wyciągnąć jedno zdjęcie zalogowanego użytkownika i go usunąć.

Czytałeś co napisał adpawl? Twój problem leży u samego podnóża, przechowuj avatary w formacie “nazwausera”.“rozszerzenie”.

Wtedy zaś wystarczy taki kawałek:

$fileToDelete = "home/.../nazwausera.rozszerzenie";

if(file_exists($fileToDelete)) unlink($fileToDelete);

else "Takie zdjęcie nie istnieje";

UPDATE jakby nadal nie szło, coś takiego z litości już naskrobałem.

<?php

// ... - tu jest jakiś wcześniejszy kod

// To jest plik o nazwie skrypt.php

// Ten kod powinien móc wykonywać tylko admin.

// Zakładam, że został już wysłane w zmiennej $_GET['login'] login użytkownika którego chcemy usunąć wraz z avatarem.

// Encja z której usuwamy nosi nazwę users oraz posiada pola: id, login, password, avatar. Przyczym avatar zawiera tylko nazwę z rozszerzeniem (bez żadnych ścieżek), a login jest unikalny.

// Ponad to drzewo plików wygląda tak:

// katalog_domowy -> skrypt.php katalog_z_avatarami

// katalog_z_avatarami -> avatar


$select = mysql_fetch_assoc(mysql_query('SELECT avatar FROM users WHERE login = "' . $_GET['login'] . '"'));

$fileToDelete = 'katalog_z_avatarami/'.$select['avatar'];

if(file_exists($fileToDelete)) unlink($fileToDelete); //Generalnie jak użytkownik nie miał avatara to nic się nie stanie

if($delete = mysql_query('DELETE FROM users WHERE login = "' . $_GET['login'] . '"')) echo "Pomyślnie usunięto użytkownika";

else echo "Nie udało się usunąć użytkownika";

?>

Dziękuję,że chcesz mi pomóc,może dokończymy ten scrypt.Avatary przechowuje w folderze avatar i mają taką postać:avatar/img7fdc1a630c238af0815181f9faa190f5.jpg.

Wiec nie przechowuj ich tak, tylko nazwausera.jpg - wtedy w bazie danych będziesz mógł zamiast beznadziejnie długiego hasha przechowywać w kolumnie user typ boolowski 1 - jest avatar, 0 - nie ma avatara, a skad wiadomo, który avatar do którego usera - mówiłem już nazawausera.jpg po tym wiadomo ze do zdjecia robimy odwołanie $user[“login”].".jpg";

Poza tym, nie wiem czy rozważyłeś taka czysto teoretyczna sytuacje, zdjęcie przechowujesz jako hash md5 czegoś (nie istotne login, id czy hasło). Ilość wariacji z powtórzeniami w nieskończonym ciągu jest nieskończona, bo jest nieskończenie wiele podciągów. A hashe md5 nie są unikalne ich ilość wariacji z powtórzeniami to 36^32, czyli istnieje mała szansa - ale ciągle istnieje, że tworząc zdjęcie na podstawie hasha nadpiszesz poprzednie, bo wygeneruje Ci ten sam hash dla różnych danych wejściowych. Jeśli będziesz używał loginu, który raczej musi być unikalny to omijasz ten problem.

Nie wiem jak to zmienić,poza tym już użytkownicy mają swoje avatary,jak to pozmieniam to usunę istniejące avatary.Jak umieszczam twój scrypt w moim pliku php to wywala mi błąd,gdzie go najlepiej umieścić:

<?php

 require 'db.php';

  $nick = $_SESSION['nick'];

$haslo = $_SESSION['haslo'];

    if ((empty($nick)) AND (empty($haslo))) {

echo '
Nie byłeś zalogowany albo zostałeś wylogowany
Strona Główna
';

exit;

}

$user = mysql_fetch_array(mysql_query("SELECT * FROM uzytkownicy WHERE `nick`='$nick' AND `haslo`='$haslo' LIMIT 1"));

    if (empty($user[id]) OR !isset($user[id])) {

echo '
Nieprawidłowe logowanie.
';

exit;

}

// tresc dla zalogowanego uzytkownika

echo 'Witaj '.$user[nick].'';  

echo'
'; echo 'Wyloguj mnie'; echo 'Dodaj tapete'; echo 'Zobacz profile'; echo'
'; ?>

Popraw profil dodaj avatar/zdjecie profilu

Uzupelnij dane

Imie: Nazwisko: Zamieszkaly: Opis/zainteresowania: [/code]

To powinno zamienić hashe na login.jpg tylko nie testowałem, więc uruchom na jakiś przykładowych danych, bo może być jakiś błąd

//Skrypcik odpalony z folderu z avatarami

$select = mysql_query('SELECT login, avatar FROM users');

while($row = mysql_fetch_assoc($select)) {

    if(file_exists($row['avatar'])) {

        rename($row['avatar'], $row['login']".jpg");

        $update = mysql_query('UPDATE users SET avatar = 1 WHERE login = "' . $row['login'] . '"');

    }

    else $update = mysql_query('UPDATE users SET avatar = 0 WHERE login = "' . $row['login'] . '"');

}

Odniosę się jeszcze do twojego update-u z posta wyżej, nigdzie w tym pliku, musisz stworzyć jakieś miejsce (panel admina) - tylko dla admina, gdzie będziesz mógł podać nazwę usera którego chcesz usunąć. Za pomocą $_GET[‘login’] prześlesz informacje którego usera usunąć do tego skryptu co ci napisałem (innymi słowy on jest stand-alone). Poza tym podaj jeszcze jaki błąd wyskakuje, bo nie testowałem ich.

Ja nie chcę usunąć usera,tylko chcę aby każdy użytkownik miał możliwość usunięcia swojego avatara

Go odnosi się do użytkownika - je do zdjęcia ehhh, oki zaraz edytuje ten post jak coś naskrobie.

UPDATE

<?php //panel usera

//W sekcji usera (ta czesc gdzie koles jest zalogowany) daj

echo 'Usuń avatar';

?>


i druga

<?php //skrypt.php - sprawdź czy wykonuje go ktoś kto jest właścicielem avatara, bo bez tego każdy przez pasek url jest wstanie usunąć dowolnego avatara

$select = mysql_fetch_assoc(mysql_query('SELECT avatar FROM users WHERE nick = "' . $_GET['nick'] . '"'));

$fileToDelete = 'katalog_z_avatarami/'.$select['avatar'];

if(file_exists($fileToDelete)) {

    unlink($fileToDelete);

    $update = mysql_query('UPDATE users SET avatar = "" WHERE nick = "' . $_GET['nick'] . '"'); //avatar = "" albo avatar = null albo w każdym razie coś co oznacza `defualt` u ciebie

?>

[/code]

sorry żle opisałem chodziło o zdjęcia a nie o profil.Jeszcze raz wyjaśniam w bazie mam tabelę użytkownicy gdzie są pola id,link_avatar gdzie zapisuje nazwy avatarów,następnie nick,hasło,opis itd…,a na serwerze mam folder gdzie przechowuje zdjęcia o nazwie avatar.

To dopasuj ten skrypt

<?php //skrypt.php - sprawdź czy wykonuje go ktoś kto jest właścicielem avatara, bo bez tego każdy przez pasek url jest wstanie usunąć dowolnego avatara

$select = mysql_fetch_assoc(mysql_query('SELECT link_avatar FROM uzytkownicy WHERE nick = "' . $_GET['nick'] . '"'));

$fileToDelete = 'avatar/'.$select['link_avatar'];

if(file_exists($fileToDelete)) {

    unlink($fileToDelete);

    $update = mysql_query('UPDATE uzytkownicy SET link_avatar = "" WHERE nick = "' . $_GET['nick'] . '"');

}

?>

Myślę, że nawet ten twój skrypt by poszedł tylko robisz podstawowy błąd - DELETE bla bla bla FROM nie ma takiej składni DELETE FROM usuwa cały wiersz jeżeli chcesz usunąć jakaś informacje (poszczególną) to uaktualniasz wiersz UPDATEM i ustawiasz to pole na null UPDATE - po połączeniu z baza u mnie działa taki kod wiec na pewno rozwiązanie jest dobre (pamiętaj na UNIX plik, który usuwasz musi mieć odpowiedni CHMOD inaczej unlink() wygeneruje E_WARNING)

if(isset($_GET['nick'])) {

    $select = mysql_fetch_assoc(mysql_query('SELECT avatar FROM users WHERE nickname = "' . $_GET['nick'] . '"'));

    $fileToDelete = 'avatar/'.$select['avatar'];

    if(file_exists($fileToDelete)) {

        unlink($fileToDelete);

        $update = mysql_query('UPDATE users SET avatar = "" WHERE nickname = "' . $_GET['nick'] . '"');

    }

}


$select = mysql_fetch_assoc(mysql_query('SELECT * FROM users WHERE nickname = "Kostek"'));


echo 'Nick: '.$select['nickname'];

echo 'Nazwa avataru: '.$select['avatar'];

echo '



';

echo 'Usun avatar';

[/code]

To teraz mi namieszałeś,zobacz kostek tak napisałem i tak żle,jak możesz to mnie popraw:

<?php

 require 'db.php';

  $nick = $_SESSION['nick'];

$haslo = $_SESSION['haslo'];

    if ((empty($nick)) AND (empty($haslo))) {

echo '
Nie byłeś zalogowany albo zostałeś wylogowany
Strona Główna
';

exit;

}

$user = mysql_fetch_array(mysql_query("SELECT * FROM uzytkownicy WHERE `nick`='$nick' AND `haslo`='$haslo' LIMIT 1"));

    if (empty($user[id]) OR !isset($user[id])) {

echo '
Nieprawidłowe logowanie.
';

exit;

}

// tresc dla zalogowanego uzytkownika

echo 'Witaj '.$user[nick].'';  

 echo '
';																																																																																																																

echo 'Wyloguj mnie'; echo 'Dodaj tapete'; echo 'Zobacz profile'; echo '
';																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																											                  																																																																																																									                                                                                                                                                                                                                                                                                                                                                           																																																																																																														  																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																				 																																																																																																																																																																																 																																																																																																																																																																																																																																	 																																																																																																																																																																																																																																														 								  

    if(isset($_GET['nick'])) {

        $select = mysql_fetch_assoc(mysql_query('SELECT link_avatar FROM uzytkownicy WHERE nick = "' . $_GET['nick'] . '"'));

        $fileToDelete = './avatar/'.$user['link_avatar'];

        if(file_exists($fileToDelete)) {

            unlink($fileToDelete);

            $update = mysql_query('UPDATE uzytkownicy SET link_avatar = "null" WHERE nick = "' . $_GET['nick'] . '"');

        }

    }


    $select = mysql_fetch_assoc(mysql_query('SELECT * FROM uzytkownicy WHERE nick = "' . $_GET['nick'] . '"'));


    echo 'Nick: '.$user['nick']; echo '
';		

    echo 'Nazwa avataru: '.$user['link_avatar']; echo '
';		

    echo '



';

    echo 'Usun avatar';


?>

Popraw profil dodaj avatar/zdjecie profilu

Uzupelnij dane

Imie: Nazwisko: Zamieszkaly: Opis/zainteresowania: [/code]

nazwę avatara wyświetla,ale nie usuwa! !!

Ty robisz te wcięcia? One są jakieś tragiczne w czymkolwiek to otwieram od notepad++ przez eclipse i phpdesignera kończąc na netbeansie rozjeżdża się mi tekst we wszystkie strony czytać się tego nie da tego ale coś tam spróbowałem wymodzić (jak będą błędy to je wrzuć bo na razie serwer mam wyłączony na uczelni wiec nie mam gdzie testować nawet)

<?php

 require 'db.php';

  $nick = $_SESSION['nick'];

$haslo = $_SESSION['haslo'];

    if ((empty($nick)) AND (empty($haslo))) {

echo '
Nie byłeś zalogowany albo zostałeś wylogowany
Strona Główna
';

exit;

}

$user = mysql_fetch_assoc(mysql_query("SELECT * FROM uzytkownicy WHERE `nick`='$nick' AND `haslo`='$haslo' LIMIT 1"));

    if (empty($user['id']) OR !isset($user['id'])) {

echo '
Nieprawidłowe logowanie.
';

exit;

}

// tresc dla zalogowanego uzytkownika

echo 'Witaj '.$user['nick'].'';  

 echo '
';                                                                                                                                                                                                                                                                                                                                                

echo 'Wyloguj mnie'; echo 'Dodaj tapete'; echo 'Zobacz profile'; echo '
';                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            

    if(isset($_GET['nickname'])) {

        $select = mysql_fetch_assoc(mysql_query('SELECT link_avatar FROM uzytkownicy WHERE nick = "' . $_GET['nickname'] . '"'));

        $fileToDelete = './avatar/'.$select['link_avatar'];

        if(file_exists($fileToDelete)) {

            unlink($fileToDelete);

            $update = mysql_query('UPDATE uzytkownicy SET link_avatar = "" WHERE nick = "' . $_GET['nickname'] . '"');

        }

    }

    // jeśli jest avatar powinien sie wyswietlać po usunieciu nie powinno go być

    echo '



';


    echo 'Usun avatar';


?>

Popraw profil dodaj avatar/zdjecie profilu

Uzupelnij dane

Imie: Nazwisko: Zamieszkaly: Opis/zainteresowania: [/code]

kostek zmieniłem tak:

if(isset($_GET['nick'])) {

        $select = mysql_fetch_assoc(mysql_query('SELECT link_avatar FROM uzytkownicy WHERE nick = "' . $_GET['nick'] . '"'));

        $fileToDelete = './avatar/'.$user['link_avatar'];

        if(file_exists($fileToDelete)) {

            unlink($fileToDelete);

            $update = mysql_query('UPDATE uzytkownicy SET link_avatar ="null" WHERE nick = "' . $_GET['nick'] . '"');

        }

    }

    echo 'Nick: '.$user['nick']; echo '
';      

    echo 'Nazwa avataru: '.$user['link_avatar']; echo '
';      

    echo '
';


    echo 'Usun avatar'; [/code]

i wyświetla mi zdjęcie i nazwę zdjęcia,ale nie usuwa go,co tu jeszcze zmienić.

Nie zmieniaj w tym nic jak będzie jakiś błąd daj tu informację o nim, ale na litość nie edytuj mojego kodu sam, bo robisz burdel za przeproszeniem i jak się o czymś nie ma pojęcia lepiej się za to nie brać to tak na przyszłość.

<?

if(isset($_GET['nickname'])) {

        $select = mysql_fetch_assoc(mysql_query('SELECT link_avatar FROM uzytkownicy WHERE nick = "' . $_GET['nickname'] . '"'));

        $fileToDelete = './avatar/'.$select['link_avatar'];

        if(file_exists($fileToDelete)){                                                                                                                                                                                                                                                                                                                                 

            unlink($fileToDelete);            

            $update = mysql_query('UPDATE uzytkownicy SET link_avatar = "" WHERE nick = "' . $_GET['nickname'] . '"');

            header('Location: '.$_SERVER['PHP_SELF']);            

        }

    }

    echo 'Nick: '.$user['nick'];                                                                                                                                                                                                                                                                                                                                                                         

    echo 'Nazwa avataru: '.$user['link_avatar'];                                                                                                                                                                                                                                                                                                                                                                           

    echo '
';

    echo 'Usun avatar'; 

?> [/code]

Nic wiele się nie zmieniło nadal nie usuwa się avatar.

A czy zniknęła nazwa avatara? Jeśli tak, zmień chmody avatara na 777.

UPDATE do postu wyżej poprawiłem jedna literówkę, która tworzyła złą ścieżkę, spróbuj teraz.

Nic nie zniknęło,wyświetla się nazwa i zdjęcia,tylko,że jak jak klikam na usuń to się nie usuwa.Chmody już przecież zmieniłem przed wysyłaniem zdjęć.

Jeżeli po poprawce nie działa, to nie wiem u mnie usuwało przed padem servera, wiec nie mam pojęcia co może być nie tak. Możesz echo umieścić przed instrukcjami kluczowymi i debbugować co się wyświetla, bo może coś gdzieś nadpisane jest (jakaś nazwa zmiennej).

Jeżeli będziesz jeszcze chciał coś wypróbować to dwa przypadki przychodzą mi do głowy

  1. $_SERVER

[PHP_SELF] nie zwraca scieżki do dokumentu w którym jest mało prawdopodobne aczkolwiek na niektórych serwerach nie ujdzie.