Удалить файл из директории при нажатии на ссылку

320
22 января 2018, 08:53

Привет коллеги, подскажите чем можете. Не могу сообразить как мне удалить из директории файлы, через кнопку на веб странице. Вот код страницы:

    $json = "json";
$files_dir = "./tests";
$files_list = scandir($files_dir);
$jsn_files = [];
for ($i = 0; $i < count($files_list); $i++){
    $explode = explode(".", $files_list[$i]);
    if ($explode[1] === $json){
        array_push($jsn_files, $files_list[$i]);
    }
}
?>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <link rel="stylesheet" href="style.css">
</head>
<body>
<nav>
    <ul>
        <li><a href="admin.php">Загрузить тест</a></li>
    </ul>
</nav>
<div class="list">
    <ul>
        <?php
        for ($i = 0; $i < count($jsn_files); $i++) {
            echo "<li><a href='test.php?id=".$i."'>Тест №".$i."</a>  <a href=''>Удалить тест №".$i."</a></li>";
            }
        ?>
    </ul>
</div>
</body>
</html>

Вопрос в том, как при нажатии на ссылку Удалить тест №.., удалялся тот тест, напротив которого эта ссылка? p.s не обязатаельно через ссылку, главное чтобы было куда тыкнуть и было понятно соотношение файл-удалить

Answer 1

Идентификация по id в данном случае не уместна, во временном промежутке между формированием html кода с числовыми идентификаторами файлов и запросом от клиента на удаление - структура файлов может поменяться, с меньшей вероятностью поменяться название файла и в вашем случае наверняка изменение названия файла это не штатная ситуация.

$validFileExtension = "json";
$filesDir = "./tests";
if (!empty($_GET['delete'])){
    $wayToFile = $filesDir.'/'.$_GET['delete'];
    if (file_exists($wayToFile)){
        unlink($wayToFile);
    }
}
$filesList = is_dir($filesDir) ? scandir($filesDir) : array(); 
?>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <link rel="stylesheet" href="style.css">
</head>
<body>
<nav>
    <ul>
        <li><a href="admin.php">Загрузить тест</a></li>
    </ul>
</nav>
<div class="list">
    <ul>
        <?php foreach ($filesList as $fileName):?>
            <?php if( pathinfo($filesDir.'/'.$fileName, PATHINFO_EXTENSION) == $validFileExtension):?>
                <li><a href='test.php?id=<?=$fileName?>'>Тест <?=$fileName?></a>  <a href='<?=$_SERVER['SCRIPT_NAME']?>?delete=<?=$fileName?>'>Удалить тест № <?=$fileName?></a></li>
            <?php endif;?>
        <?php endforeach;?>
    </ul>
</div>
</body>
</html>
Answer 2

Примерно так:

<?php
$format = 'json';
$jsons = '';
$dir = './tests';
($del = filter_input(INPUT_GET, 'delete'))
&& file_exists($fileDel = $dir . '/' . $del) 
&& unlibk($fileDel);
$list = is_dir($dir) ? scandir($dir) : array();
if($list) {
    foreach ($list as $file) {
        if($format === substr($file,-4)) {
            $jsons.='<li>
                        <a href="test.php?id='.$file.'">
                            Тест '.$file.'
                        </a>
                        <a href="test.php?delete='.$file.'">
                            Удалить тест № <?=$file?>
                        </a>
                    </li>';
        }
    }
}
?>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <link rel="stylesheet" href="style.css">
</head>
<body>
<nav>
    <ul>
        <li><a href="admin.php">Загрузить тест</a></li>
    </ul>
</nav>
<div class="list">
    <ul>
        <?=$jsons?>
    </ul>
</div>
</body>
</html>
READ ALSO
Замена switch-case

Замена switch-case

Имеется конструкция switch-case со множеством вариантовКаким образом создать компонентно-ориентированный и легко масштабируемый архитектурный...

173
Кнопка в кнопке php

Кнопка в кнопке php

ЗдравствуйтеПишу код на добавление строчки в базу

215
Спецификаторы хранения extern,static,register,auto

Спецификаторы хранения extern,static,register,auto

В чём суть каждого из спецификаторов? И почему в данном коде я не могу получить доступ к переменной i ,так как по определению static хранит значение...

216