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'
'; ?>
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.
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.
<?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)
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';
?>
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]
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
$_SERVER
[PHP_SELF] nie zwraca scieżki do dokumentu w którym jest mało prawdopodobne aczkolwiek na niektórych serwerach nie ujdzie.