Autor Zpráva
Chatík
Profil
Dobrý den,

chtěl bych poprosit někoho o pomoc.
Udělal jsem si script na mazání v databázi,:
<?php
include_once('../settings.php');
if(isset($_GET['databaze'])) {
  $db = htmlSpecialChars($_GET['databaze'],ENT_QUOTES);
  $inter = htmlSpecialChars($_GET['interpret'],ENT_QUOTES);
$query = "DELETE FROM $db WHERE Contentgroup = '$inter'";
            mysql_query($query) or die("Error in query $query");  
$_SESSION["message"] = "Smazán<br>interpret: $inter z databáze $db<br>";
    header("Location: index.php");
}
else
    $_SESSION["message"] = "Něco je špatně<br>";
    header("Location: index.php"); 
?>

Potřeboval bych do toho scriptu přidat ještě kod na smazání složky na ftp.
Složka by se měla mazat podle $inter
Prosím jestli by se tu někdo našel jestli by mi to nedopsal nebo aspoň neodkázal na nějaké hotové řešení.

Budu moc vděčný
Corwin
Profil
složka se maže funkcí rmdir() http://php.net/rmdir
musíš mít práva (pokud jsi ji vytvářel skriptem neměl by být problém), ale hlavně, složka musí být prázdná. pokud prázdná není, potřebuješ nejdřív po jednom smazat všechny soubory uvnitř.

soubory ve složce načteš přes scandir: scandir, funkce unlink soubory maže. v cyklu ale musí být podmínka na "." a ".."

$files = scandir($inter);
foreach($files as $file){
  if($file != '.' && $file != '..' && file_exists($inter.$file)){
    unlink($file);
  }
}
rmdir($inter);

pokud ta složka obsahuje další podsložky, je potřeba to prostě celé projít promazat. vygoogli si to líp :-) raději hotové řešení, protože stačí jedna chyba a skript ti smaže celý obsah webu... takže pokud ta složka co chceš mazat neobsahuje podsložky, mělo by to být v pohodě.
Chatík
Profil
Corwin:
Žádné podložky už v té složce nejsou, takže to zkusím.
Doufám že nesmažu nic jiného.
Díky
Corwin
Profil
mazání souborů a složek není sranda, a jestli se to teprvé učíš, vřele doporučuji vždy vše nejdřív zálohovat :-) a pokud to jméno složky získáváš z GETU nebo POSTU, je potřeba to pořádně ošetřit. tedy smazat všechny řetězce "../" a "./" ze stringu a také první lomítko, pokud proměnná začíná lomítkem.
Chatík
Profil
jj zazálohoval jsem si to, nyní to mám takto ale složku ani soubory v ní to nesmazalo.
include_once('../settings.php');
if(isset($_GET['databaze'])) {
  $db = htmlSpecialChars($_GET['databaze'],ENT_QUOTES);
  $inter = htmlSpecialChars($_GET['interpret'],ENT_QUOTES);
$query = "DELETE FROM $db WHERE Contentgroup = '$inter'";
            mysql_query($query) or die("Error in query $query");  
$_SESSION["message"] = "Smazán<br>interpret: $inter z databáze $db<br>";
    header("Location: index.php");
    
    $files = scandir($inter);
foreach($files as $file){
  if($file != '.' && $file != '..' && file_exists($inter.$file)){
    unlink($file);
  }
}
rmdir($inter);
}
else {
    $_SESSION["message"] = "Něco je špatně<br>";
    header("Location: index.php");
    } 
Asi bude potřeba upravit cesta ke složce ale jak přesně to nevím
Corwin
Profil
jestli to nebude tím, že je tam nejdřív to přesměrování a pak skript pokračuje :-) funkci header tam dej jenom jednou a úplně nakonec skriptu.
Chatík
Profil
Nyní upraveno takto:
include_once('../settings.php');
if(isset($_GET['databaze'])) {
  $db = htmlSpecialChars($_GET['databaze'],ENT_QUOTES);
  $inter = htmlSpecialChars($_GET['interpret'],ENT_QUOTES);
$query = "DELETE FROM $db WHERE Contentgroup = '$inter'";
            mysql_query($query) or die("Error in query $query"); 
                $files = scandir('../'.$inter);
foreach($files as $file){
  if($file != '.' && $file != '..' && file_exists($inter.$file)){
    unlink($file);
  }
}
rmdir('../'.$inter); 
$_SESSION["message"] = "Smazán<br>interpret: $inter z databáze $db<br>";
    }
else {
    $_SESSION["message"] = "Něco je špatně<br>";
    } 
    header("Location: index.php");  

Cesta je upravena protože složka která se má mazat je v rootu webu, kdež to script ne ten je ve složce upravy.
Ale ani tak to nesmaže
Fisir
Profil
Reaguji na Chatíka:
Řádek 9 uprav na:
  if($file != '.' && $file != '..' && file_exists('../'.$inter.$file)){
Chatík
Profil
Fisir:
Bohužel, ani tak se nic nesmazalo:
include_once('../settings.php');
if(isset($_GET['databaze'])) {
  $db = htmlSpecialChars($_GET['databaze'],ENT_QUOTES);
  $inter = htmlSpecialChars($_GET['interpret'],ENT_QUOTES);
$query = "DELETE FROM $db WHERE Contentgroup = '$inter'";
            mysql_query($query) or die("Error in query $query"); 
                $files = scandir('../'.$inter);
foreach($files as $file){
  if($file != '.' && $file != '..' && file_exists('../'.$inter.$file)){
    unlink($file);
  }
}
rmdir('../'.$inter); 
$_SESSION["message"] = "Smazán<br>interpret: $inter z databáze $db<br>";
    }
else {
    $_SESSION["message"] = "Něco je špatně<br>";
    } 
    header("Location: index.php");  

V databázi ano, na ftp ne.
Corwin
Profil
možná někdo zkušenější tam odhalí chybu pouhým okem, já ti ale mohu doporučit akorát následující : nejdřív si to mazání zkus samostatně, mimo tohle všechno. čistý skript co vytvoří sloužku, smaže sloužku, smaže soubory atd...

píše ti to chybu? máš zaplá chybová hlášení? opravdu máš práva mazat tu složku? je cesta správná? tedy přesně o adresář výš vůči umístění skriptu? je v proměnné $inter to co tam má být?
Chatík
Profil
Píše to chybu Warning: scandir(../KTO): failed to open dir: No such file or directory in takže je špatná cesta.
Ale jaká jiná by měla býti?
Tento script je ve složce contentgroup a pak ještě ve složce upravy, složka která by se měla smazat je v rootu webu takže o dvě úrovně výš.
Proměná je správně
Marschmallow
Profil
Chatík:
Zkus nastavit cestu ke složce pouze takto:
/KTO
To by se mělo automaticky vrátit do kořenové složky a tam hledat složku KTO.
Chatík
Profil
Takže teĎ jsem asi cestu zvoli správně:
include_once('../settings.php');
if(isset($_GET['databaze'])) {
  $db = htmlSpecialChars($_GET['databaze'],ENT_QUOTES);
  $inter = htmlSpecialChars($_GET['interpret'],ENT_QUOTES);
$query = "DELETE FROM $db WHERE Contentgroup = '$inter'";
            mysql_query($query) or die("Error in query $query"); 
            echo $inter;
                $files = scandir('../../'.$inter);
foreach($files as $file){
  if($file != '.' && $file != '..' && file_exists('../../'.$inter.$file)){
    unlink($file);
  }
}
rmdir('../../'.$inter); 
$_SESSION["message"] = "Smazán<br>interpret: $inter z databáze $db<br>";
    }
else {
    $_SESSION["message"] = "Něco je špatně<br>";
    } 

Ale hlásí to chybu:
Jakub Smolík Warning: rmdir(../../Jakub Smolík): Directory not empty in /home/users/michales/country.funsite.cz/web/upravy/contentgroup/delete.php on line 24

Na řádku 24 je: rmdir('../../'.$inter);


Tak mám toto:
include_once('../settings.php'); 
# recursively remove a directory
function rrmdir($dir) {
    foreach(glob($dir . '/*') as $file) {
        if(is_dir($file))
            rrmdir($file);
        else
            unlink($file);
    }
    rmdir($dir);
}

if(isset($_GET['databaze'])) { 
  $db = htmlSpecialChars($_GET['databaze'],ENT_QUOTES); 
  $inter = htmlSpecialChars($_GET['interpret'],ENT_QUOTES); 
$query = "DELETE FROM $db WHERE Contentgroup = '$inter'"; 
            mysql_query($query) or die("Error in query $query");   
$_SESSION["message"] = "Smazán<br>interpret: $inter z databáze $db<br>"; 
rrmdir('../../'.$_GET['interpret']);
} 
else 
    $_SESSION["message"] = "Něco je špatně<br>"; 

A funguje to, smaže to přesně tu složku.
Díky za váš čas

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