@Genexys
фронтенделье

Как удалить выбранный файл с сервера?

есть такой вот кусок кода который удаляет файл с сервера и инфу о нем из базы, происходит, это по нажатию на кнопку, проблема в том, что в $id при нажатии передается id первого загруженного файла, а надо того который нажали.

Подскажите, как можно это исправить?

<?php
            if (isset($_POST['insert'])) {
                $sql2 = "select * from documents";
                $del = $db->query($sql2)->fetchAll();
        
                move_uploaded_file($_FILES["file"]["tmp_name"], $_SERVER['DOCUMENT_ROOT']."/project/html/".$_FILES["file"]["name"]);

                
                $data = addslashes(fread(fopen($_FILES['file']['tmp_name'], "r"),filesize($_FILES['file']['tmp_name'])));
                $result=$db->prepare("INSERT INTO documents (bin_data,filename,filetype) "."VALUES ('".$data."', '".$_FILES["file"]["name"]."','".$_FILES["file"]["type"]."')");
                if(!$result) exit("Ошибка выполнения SQL запроса!");
                $result->execute();
                $id = $db->prepare();
            }
            $sql = "select * from documents";
            $result = $db->query($sql)->fetchAll();
            $nnn =$db->query("SELECT id, filename FROM documents")->fetchAll();
            ?>
            <?php
            foreach($nnn as $row)
            {
                $v=$row['id'];
                $n=$row['filename'];


                ?>
                <div class="admph">
                    <?php
                    echo "$row[filename]";
                    ?>
                    <form method="post" id="del_table_form" action="javascript:void(null);" onsubmit="tableDel()" enctype="multipart/form-data">
                        <input class="button" name="del[<?php echo "$v";?>]" type="submit" value="Удалить">
                        <input type="hidden" name="" value="name[<?php echo "$n";?>]">
                        <input class="button" name="del[<?php echo "$v";?>]" type="text"  style="display: none;" value="Удалить">
                    </form>
                </div>
                <?php
            }

            if(isset($_POST['del'])){
                $ids = (int) $_POST['del'];
                $name = key($_POST['name']);
                unlink($_SERVER['DOCUMENT_ROOT']."/project/html/".$name);
                $result =$db->prepare('DELETE FROM documents  WHERE id=:ids');
                $result->bindParam(':ids', $ids);
                if ($result->execute())
                {
                    // header('location: /path/to/page');
                }
                else
                {
                    echo "Ошибка удаления данных: "; print_r($result->errorInfo());
                }

            }
            ?>
            <form method="post" id="insert_table_form" action="javascript:void(null);" onsubmit="tableInsert()" enctype="multipart/form-data">
                <input type="hidden" name="MAX_FILE_SIZE" value="1000000">
                Файл для загрузки на сайт: <input type="file" name="file" size="9999999999999999">
                <input class="button" name="insert" type="text"  style="display: none;" value="загр">
                <p><input class="button" type="submit" name="submit" value="Загрузить">
            </form>
  • Вопрос задан
  • 629 просмотров
Пригласить эксперта
Ответы на вопрос 1
RomaZveR
@RomaZveR
CEO AlertMoney, PHP/Golang Developer
Если вы принимаете имя удаляемого файла из внешнего мира - вопрос валидации должен стоять на первом месте. Как минимум это так:
if (!empty($_POST['name'])) {
  $name = basename($_POST['name']); //иначе беды огребете. 
  $file_path = $_SERVER['DOCUMENT_ROOT'].'/project/html/'.$name;
  if (is_file($file_path)) {
     @unlink($file_path);
  }
}


По поводу самого алгоритма - все в топку, у вас по 1 форме на каждую запись с одинаковыми айдишниками, браузер с ума сходит, делайте rest, храните в базе физическое имя файла, из внешнего мира получайте только id файла, все остальное должно быть blackbox.

Допустим:
<? foreach ($nnn as $row) {
    $v=$row['id'];
    $n=$row['filename'];
    ?>
                <div class="admph">
                    <?php
                    echo "$row[filename]";
                    ?>
                    <button type="button" onclick="deleteRecord(<?=$v?>); return false;">Удалить</button>
                </div>
                <?php
}


<script>
function deleteRecord(id) {
   console.log(id);
   //Тут уже ajax post на action удаления, параметр del со значением id
}
</script>
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы