Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/239.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 根据“选择”值显示和删除子文件夹中的文件_Php_Select_Delete File_Subdirectory_Chdir - Fatal编程技术网

Php 根据“选择”值显示和删除子文件夹中的文件

Php 根据“选择”值显示和删除子文件夹中的文件,php,select,delete-file,subdirectory,chdir,Php,Select,Delete File,Subdirectory,Chdir,我的文件夹结构有4层,我的表单在顶层,目前它只在顶层显示文件,我希望能够选择一个子文件夹并显示其中的文件,以便在必要时删除它们 Produce Produce/Meat Produce/Meat/Beef Produce/Meat/Beef/Portions Produce/Meat/Beef/Packaged Produce/Vegtables Produce/Vegetables/Fresh Produce/Vegetables/Fresh/Local etc,. “我的表单”使用复选框显

我的文件夹结构有4层,我的表单在顶层,目前它只在顶层显示文件,我希望能够选择一个子文件夹并显示其中的文件,以便在必要时删除它们

Produce
Produce/Meat
Produce/Meat/Beef
Produce/Meat/Beef/Portions
Produce/Meat/Beef/Packaged
Produce/Vegtables
Produce/Vegetables/Fresh
Produce/Vegetables/Fresh/Local etc,.
“我的表单”使用复选框显示其所在文件夹的内容,然后我可以勾选框并删除文件,但我已添加了“选择”,并希望能够显示所选子文件夹的内容并删除文件。我制作了两个提交按钮,两个都可以,但是删除功能只有在顶部文件夹中才有效

 if ($_POST['delete'] == 'Submit')
    {
    foreach ((array) $_POST['select'] as $file) {

    if(file_exists($file)) {
        unlink($file); 
    }
    elseif(is_dir($file)) {
        rmdir($file);
    }
}
}

$files = array();
$dir = opendir('.');
    while(false != ($file = readdir($dir))) {
        if(($file != ".") and ($file != "..")and ($file != "error_log")) {
                $files[] = $file; 
        }   
    }

if ($_POST['action'] == 'Change') {

if($_POST['folder'] == 'AAA'){
$files = array();
$dir = opendir('/home/mysite/public_html/Produce/Vegetables/');
    while(false != ($file = readdir($dir))) {
        if(($file != ".") and ($file != "..")) {
                $files[] = $file; 
        }   
    }
}
if($_POST['folder'] == 'BBB'){
$files = array();
$dir = opendir('/home/mysite/public_html/Produce/Meat');
    while(false != ($file = readdir($dir))) {
        if(($file != ".") and ($file != "..")) {
                $files[] = $file; 
        }   
    }
}
}
    natcasesort($files);
?>

<form id="delete" action="" method="POST">

<?php
echo '<table><tr>'; 
for($i=0; $i<count($files); $i++) { 
    if ($i%5 == 0) { 
        echo '</tr>';
        echo '<tr>'; 
    }       
    echo '<td style="width:180px">
            <div class="select-all-col"><input name="select[]" type="checkbox" class="select" value="'.$files[$i].'"/>
            '.$files[$i].'</div>
            <br />
        </td>';


 }
    echo '</table>';
    ?>
    </table>
    <br>
    Choose a folder:
            <select name="folder"><option value="this" selected>This folder</option><option value="BBB">Meat</option><option value="CCC">Meat/Beef</option><option value="DDD">Meat/Beef/Portions</option><option value="EEE">Meat/Beef/Packaged</option><option value="FFF">Vegetables</option><option value="GGG">Vegetables/Fresh</option><option value="HHH">Vegetables/Fresh/Local</option><option value="III">Vegetables/Fresh/Packaged</option></select>
            <br>
<input class="button" type="submit" form="delete" name="action" value="Change"><br>
    <button type="submit" form="delete" value="Submit">Delete File/s</button>
    </form><br>
if($\u POST['delete']=='Submit')
{
foreach((数组)$\u POST['select']作为$file){
如果(文件_存在($file)){
取消链接($文件);
}
elseif(is_dir($file)){
rmdir($文件);
}
}
}
$files=array();
$dir=opendir('.');
while(false!=($file=readdir($dir))){
如果($file!=“)和($file!=“.”)以及($file!=“错误日志”)){
$files[]=$file;
}   
}
如果($_POST['action']=='Change'){
如果($_POST['folder']=='AAA'){
$files=array();
$dir=opendir('/home/mysite/public_html/product/vegets/');
while(false!=($file=readdir($dir))){
如果($file!=”)和($file!=”)){
$files[]=$file;
}   
}
}
如果($_POST['folder']=='BBB'){
$files=array();
$dir=opendir('/home/mysite/public_html/product/Meat');
while(false!=($file=readdir($dir))){
如果($file!=”)和($file!=”)){
$files[]=$file;
}   
}
}
}
natcasesort($文件);
?>

选择一个文件夹: 此folderMeatMeat/BeefMeat/BeefMeat/Boef/PortionsMeat/Beef/PackagedVestures/FreshVestures/Fresh/LocalVestures/Fresh/Packaged

删除文件

如何使用所选值来完成此操作?

首先,我想说明您无法删除顶部文件夹之外的文件的原因。您永远不会更改“当前工作目录”,因此对深度文件调用删除功能将永远不会按预期工作,并且可能会删除顶部文件夹中的文件。要更正此问题,您需要在每个要删除的文件/目录中包含路径,或者调用
chdir()
一次,以便
unlink()
rmdir()
找到正确的位置

我相信你的项目还有一些自然的成熟,包括安全性和用户体验。我将提供一个概括的/简单的片段供您考虑/与您的项目进行比较,希望在您的开发中给您带来更多的动力


您的用户将能够在提交时做出两个选择之一:更改目录和删除文件/目录

对于目录更改,您的程序需要提交两条必要的信息:

  • 行动(action=“change”)
  • 新文件夹(newfolder={variable})
对于文件/目录删除,将有三条必要的信息:

  • 操作(action=“delete”)
  • 文件/目录(文件[]={variable})
  • 要访问的目录(文件夹={variable})*无法信任
    中的值,因为用户可以在选择删除当前目录中的文件之前更改所选值。此值必须静态保留。
    *注意,您只需在复选框值中添加文件名的路径并消除隐藏的输入,这将取决于编程首选项

纯粹出于演示目的,我将在代码中引用此静态文件夹数组:

$valid_folders=[
    'Produce',
    'Produce/Meat',
    'Produce/Meat/Beef',
    'Produce/Meat/Beef/Portions',
    'Produce/Meat/Beef/Packaged',
    'Produce/Vegetables',
    'Produce/Vegetables/Fresh',
    'Produce/Vegetables/Fresh/Local',
    'Produce/Vegetables/Fresh/Packaged'
];
实际上,您可能希望生成有效/允许/现有文件夹的数组。我建议您查看以下链接:

if(isset($\u POST['action']){//如果有提交
如果($_POST['action']==“Delete”){//if单击Delete
if(在数组中($\u POST['folder'],$valid\u folders)){
$folder=$\u POST['folder'];//使用有效目录
}否则{
$folder=$valid_folders[0];//设置默认目录
}
chdir($folder);//设置当前工作目录
//echo“”,getcwd(),“”;//确认目录是否正确
foreach($_POST['files']作为$file){//循环浏览所有提交的文件
if(is_dir($file)){//检查目录
rmdir($file);//删除它
}else{//或文件
取消链接($file);//删除它
}
}
}elseif($_POST['action']==“Change”){//如果单击了更改
如果(在_数组($_POST['newfolder',$valid_folders]){//使用有效的新目录
$folder=$\u POST['newfolder'];
}否则{
//回显“对不起,提交的文件夹无效”;
$folder=$valid_folders[0];//设置默认目录
}
}
}否则{
$folder=$valid_folders[0];//不提交,请设置默认目录
}
$dir=opendir(“/{$folder}”);//将其设置为您需要的任何值--考虑父目录
//回显“访问:/$folder
”; while(false!=($file=readdir($dir))){ 如果(iNoLoad($file,‘.',‘..’,‘ErrRyLogL'’)){//拒绝DOTS和ErrRyLogL},也应该考虑防止删除这个文件!或者,你可以跳过这个迭代条件并在循环完成后过滤$file数组。 $files[]=$file; } } natcasesort($文件); 回声“; 回声“; //回显“选择文件夹”;//如果嘶嘶声
if(isset($_POST['action'])){                               // if there is a submission
    if($_POST['action']=="Delete"){                        // if delete clicked
        if(in_array($_POST['folder'],$valid_folders)){
            $folder=$_POST['folder'];                      // use valid directory
        }else{
            $folder=$valid_folders[0];                     // set a default directory
        }
        chdir($folder);                                    // set current working directory
        //echo "<div>",getcwd(),"</div>";                  // confirm directory is correct
        foreach($_POST['files'] as $file){                 // loop through all files submitted
            if(is_dir($file)){                             // check if a directory
                rmdir($file);                              // delete it
            }else{                                         // or a file
                unlink($file);                             // delete it
            }
        }
    }elseif($_POST['action']=="Change"){                   // if change clicked
        if(in_array($_POST['newfolder'],$valid_folders)){  // use valid new directory
            $folder=$_POST['newfolder'];
        }else{
            //echo "Sorry, invalid folder submitted";
            $folder=$valid_folders[0];                     // set a default directory
        }
    }
}else{
    $folder=$valid_folders[0];                             // no submission, set a default directory
}

$dir = opendir("/{$folder}");                              // set this to whatever you need it to be -- considering parent directories
//echo "Accessing: /$folder<br>";
while(false!=($file=readdir($dir))){
    if(!in_array($file,['.','..','error_log'])){           // deny dots and error_log; you should also consider preventing the deletion of THIS file as well!  Alternatively, you could skip this iterated condition and filter the $files array after the loop is finished.
            $files[] = $file; 
    }   
}

natcasesort($files);

echo "<form action=\"\" method=\"POST\">";
    echo "<select name=\"newfolder\">";
        //echo "<option value=\"\">Select a folder</option>";  // this isn't necessary if the neighboring button is descriptive
        foreach($valid_folders as $f){
            echo "<option",($folder==$f?" selected":""),">{$f}</option>";  // if a previously submitted directory, show it as selected
        }
    echo "</select> ";
    echo "<button name=\"action\" value=\"Change\">Change To Selected Folder</button>";
    echo "<br><br>";
    echo "Delete one or more files:";
    echo "<table><tr>"; 
        for($i=0,$count=sizeof($files); $i<$count; ++$i){ 
            if($i!=0 && $i%5==0){  // see the reason for this change @ https://stackoverflow.com/questions/43565075/new-containing-div-after-every-3-records/43566227#43566227
                echo "</tr><tr>"; 
            }       
            echo "<td style=\"width:180px;\">";
                echo "<div><input name=\"files[]\" type=\"checkbox\" value=\"{$files[$i]}\">{$files[$i]}</div>";
            echo "</td>";
        }
    echo "</tr></table>";
    echo "<input type=\"hidden\" name=\"folder\" value=\"{$folder}\">";  // retain current directory
    echo "<button name=\"action\" value=\"Delete\">Delete Checked File(s)</button>";
echo "</form>";