Wątek przeniesiony 2015-11-17 22:00 z PHP przez dzek69.

Usuwanie plików z serwera

0

Stworzyłem skrypt który usuwa plik z serwera i z bazy. Ścieżkę pobiera z bazy. Gdy próbuję usunąć wszystko jest ok, jednak gdy próbuję usunąć kolejny plik to wywala błąd, że pliku nie ma a w ścieżce widać plik który usunąłem już wcześniej. Nie mam pojęcia skąd się to bierze skoro wpisu w bazie już nie ma. Zamieszczam kod poniżej:


<?php

include("polacz.php");

// wylistowanie rekordow

$result = mysql_query("SELECT * FROM rozkazy2015 ORDER BY nazwa DESC") or die(mysql_error());

while ($dane=mysql_fetch_array($result)) {


echo @$dane[nazwa]." - ". ' <a class="archl" href="?action=usun&amp;id='.@$dane[id].'">Usuń</a><br>';
@$sciezka = $dane[sciezka];

} // koniec while


if (@$_GET["action"] == "usun") {

unlink("../../rozkazy/2015/" . $sciezka);
$id = $_GET["id"];

$result = mysql_query("DELETE FROM rozkazy2015 WHERE id = '$id' LIMIT 1") or die(mysql_error());
$dane = @mysql_fetch_array($result);


echo "<br /><br />Plik został usunięty <a class='archl' href='usun.php'>Odśwież</a>";
} // koniec get action == edytuj



?>

3

Może zamiast wygłuszać błędy małpą @ po prostu zacznij pisać kod poprawnie?

Twój kod to zbieranina dziur, złych praktyk i kompletnego niezrozumienia tak podstawowych rzeczy jak pętla while. Zawsze powtarzam - NIE BIERZCIE SIĘ ZA BAZY DANYCH zanim nie zrozumiecie podstaw języka.

a w ścieżce widać plik który usunąłem już wcześniej

A tu kłamiesz. To nie usuwa wcześniej wskazanego pliku, tylko ten, który jako ostatni jest w bazie, sortując wg nazwy.

Twoim problemem jest to, że w pętli while nadpisujesz sobie w kółko zmienną $sciezka, używając do tego WSZYSTKICH wpisów z bazy, posortowanych wg nazwy.

Następnie jeżeli masz action usun to usuwasz fizycznie plik z $sciezka (czyli ostatni wylistowany, niezależnie od tego który klikniesz), następnie pozbywasz się wpisu z bazy danych o podanym ID (czyli to, czego oczekujesz).

Generalnie wróć do czegoś prostszego, bo pomijanie podstaw Cię kiedyś zgubi (w tym momencie masz dziury SQL Injection, zapewne XSS, może nawet directory travelsal się trafi (pozwoli na usunięcie dowolonego pliku z serwera, ale bez większego fragmentu kodu nie da się ocenić), nie wspominam o CSRF, bo tego prawie nikt nie zabezpiecza, przestarzałe funkcje mysql_*, złe praktyki, okropna obsługa błędów (die + wypisanie treści klientowi), brak formatowania a to wszystko w kilku linijkach kodu ;] A i tak nie jestem złośliwy i nie czepiam się pierdół)

1 użytkowników online, w tym zalogowanych: 0, gości: 1