Autor Zpráva
Matla
Profil *
Ahoj,
mám výpis souborů, kde když se klikne na některý znich, objeví se vedle něj meníčko s možnostmi, co se s ním má udělat. Je tam taky možnost "odstranit". Už sem se v tom začal nějak patlat, ale mam to špatně.

odkaz odkazuje sem:
<a href="smazat.php?file=".$file.">Smazat</a>


a soubor smazat.php obsahuje:
<?php
$soubor = ( $_GET["$file"]);
unlink ($file);
?>


Kde dělám chybu?
panther
Profil
Matla:
$soubor = $_GET['file']; // bez dolaru, ta GET proměnná se jmenuje file, není proměnná
Taps
Profil
Matla:

<?php
$soubor = ( $_GET["file"]);
unlink ($soubor);
?>

Matla
Profil *
Díky za opravu, ale chyba je ještě někde.
Je v tom odkazu. Ten odkaz je vražený do php, takže vypadá ve skutečnosti takto:
<a href=\"smazat.php?soubor=\"$file\"\" class=\"right negative pill button\"><span class=\"trash icon\"></span>Odstranit</a>

Mam chybu asi tam, kde je to tučné. Protože když se udělá výpis souborů, ten odkaz vypadá potom takhle:
http://adresa.do/upload/smazat.php?soubor= - a tady je prázdno. Je tam problém s tou proměnnou, která se do html nevypíše.
Zkouším úplně vše, ale nefunguje nic.
Taps
Profil
Matla:
lze to udělat jednoduše :-)
echo '<a href="smazat.php?soubor='.$file.'" class="right negative pill button"><span class="trash icon"></span>Odstranit</a>';
Matla
Profil *
Ne, vypisuje mi to tuto chybu:
Warning: unlink(): open_basedir restriction in effect. File() is not within the allowed path(s): (/home/users/kubakoum/:/var/php/:/usr/share/pear/) in /home/users/kubakoum/pocitadlo.cekuj.net/web/upload/smazat.php on line 3
Taps
Profil
Matla:
do funkce unlink doplň cestu k souboru
<?php
$soubor = ($_GET["file"]);
unlink ('/slozka/'.$soubor);
?>
Matla
Profil *
Warning: unlink(/upload/): No such file or directory in /home/users/kubakoum/pocitadlo.cekuj.net/web/upload/smazat.php on line 3
Taps
Profil
Matla:
zkus
unlink ('/upload/'.$soubor);
Stano
Profil
Matla:
v url sa nedávajú úvodzovky.
echo '<a href="smazat.php?soubor=$file" class="right negative pill button"><span class="trash icon"></span>Odstranit</a>';
Taps
Profil
Stano:
podle mě tam ty uvozovky ničemu nevadí.
Stano
Profil
Taps:
napr tu na fóre url s ' alebo " nefungujú. a v konečnom dôsledku by ich musel stade mazať leb $_GET["soubor"] = "\"nazov_subora.jpg\""; neskúšal som to ale myslím že to tak bude.
YoSarin
Profil
Stano:
tvůj příklad je blbě - $file zůstane $file - nevloží se tam obsah proměnné. Podívej se na rozdíl mezi " a '. Uvozovky v Tapsově příkladě nejenže ničemu nevadí, ale dokonce jsou nutné

Matla:
unlinkuješ cestu začínající "/" - tzn snažíš se z rootu smazat adresář který tam není. A i kdyby tam byl, tak na něj nemáš práva.
řekni nám kde ve struktuře tvého webu je soubor který chceš smazat
A potom se trochu zamysli nad zabezpečením - takhle ti může kdokoli smazat cokoli z webu (přinejmenším)
Stano
Profil
YoSarin, Taps:
jop jasne zle som to pozrel moja chyba. už vidím.
Matla
Profil *
soubor ke smáznutí je ve stejném adresáři jako ten s tlačítkem odstranit, takže cesta není nutná.
YoSarin
Profil
Matla:
Tak pak by to mělo být nějak takhle:
unlink('./' . $_GET['file']);

Ale říkám znovu - není to nijak ošetřené, nějaký zlý a ošklivý basta ... eh osoba by mohl zadat třeba soubor 'smazat.php' a ty pak spláčeš nad výdělkem.
Pokud to pořád nefunguje, ověř velikost/malost písmen v názvu souboru...
DarkMeni
Profil
Nemá ten unlink nějaké nechtěné účinky? Mě se stává že když dám možnost, například u avataru, odstranit, pro test si to odstranim, to proběhne v pořádku ale problém nastane až když tam chci nahrát nový avatar, to se bude stránka tvářit jako že nahrává ale nakonec nic, ale upload mám snad v pořádku, a ten novej avatar se mi tam nahraje až po tom co restartuju prohlížeč, stává se to i někomu z vás? A nebo takle je to kvůli tomu unlinku?
* Když ten soubor nesmažu ale jen přepíšu (nahraju jinej obrázek se stejným jménem) tak je všechno jak má být i po několika přepsání.
Rellik
Profil
DarkMeni:
ten novej avatar se mi tam nahraje až po tom co restartuju prohlížeč, stává se to i někomu z vás?
To je celkem normální věc. Stránky na které chodíš se totiž nenačítají celé z webu, ale jsou uloženy v historii prohlížeče v tvém PC. Takže pokud nahraješ znovu něco co už tam bylo s jiným názvem, tak to nezobrazí, protože to nemůže najít. V tomto případě stačí zmáčknout kombinaci kláves Ctrl+F5 aby se stránka načetla znovu komplet celá. Většinou stačí jen F5 A pak to musí 100% zobrazit všechno co má..
Matla
Profil *
Hele, fakt moc děkuju, hodně jste mi pomohli. Řešení vypadá takto:
Odkaz:
echo "<a href=\"smazat.php?file=".$file."\" class=\"right negative pill button\"><span class=\"trash icon\"></span>Odstranit</a>"
Zpracování:
<?php

$nemazat = Array("vypis.php","smazat.php","upload.php");
$i = 0;
while ($i <= Count($nemazat)-1):
    If ($file == $nemazat[$i])
       {
       echo "Systémový soubor <b>".$nemazat[$i]."</b> nelze smazat.";
       exit; //Příkaz exit ukončí běh php v tomto místě.
       }
    $i++;
endwhile;


$file = ( $_GET['file']);
$vysledek = unlink($file);
          //unlink('/upload/'.$file);

If ($vysledek)
   {
   echo "Soubor <b>".$file."</b> byl smazán.";
   }else{
   echo "Sorry, soubor <b>".$file."</b> se smazat nepodařilo.";
   }
?>
Matla
Profil *
YoSarin:
OK, tohle je opravdu jen osobní sdílení souborů s přáteli a vše bude zaheslované pomocí session.
YoSarin
Profil
Matla:
Jen ještě malá úprava - ten while cyklus pro kontrolu systémových souborů můžeš nahradit tímhle:
if (in_array($file, $nemazat)) {
  echo "Systémový soubor <b>" . $file . "</b> nelze smazat.";
  exit; //Příkaz exit ukončí běh php v tomto místě.
}

A kamarádi nekamarádi - pořád stačí zadat './smazat.php' a soubor zmizí :). Doporučuju nahradit řádek 15:
$file = '';
if (!empty($_GET['file']) {
  $file = explode('/', $_GET['file']);
  $file = explode('\\', array_pop($file)); // tohle možná nebude nutné, ale jistota je jistota
  $file = array_pop($file); // teď by $file nemělo obsahovat žádnou změnu adresáře - při porovnání se soubory v $nemazat už by mělo fungovat vždy
}
if (empty($file)) {
  echo "Nezadali jste soubor ke smazání, nebo jste se pokusili zadat neplatný soubor.";
  exit; //Příkaz exit ukončí běh php v tomto místě.
}

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0