За последние 24 часа нас посетили 73922 программиста и 10205 роботов. Сейчас ищут 2542 программиста ...

Как вывести сообщение об успешной/неуспешной загрузке файла?

Тема в разделе "PHP для новичков", создана пользователем nina_, 10 июл 2016.

  1. nina_

    nina_ Новичок

    С нами с:
    3 июл 2016
    Сообщения:
    8
    Симпатии:
    0
    Добрый день. Помогите, пожалуйста, разобраться.

    Есть форма загрузки файла на сервер - add_file.php:
    PHP:
    1. <?php
    2. include('function.php');
    3. Autorize();
    4. if ($_GET['file'] == 'upload') {
    5.     echo "<script>alert(\"Файл загружен\");</script>";
    6. } else if($_GET['file'] == 'un_upload') {
    7.     echo "<script>alert(\"Ошибка загрузки файла\");</script>";
    8. }
    9. ?>
    HTML:
    1. ...<div class="item">
    2.         <form name="form_add_file" action="upload_file.php" method="post" enctype="multipart/form-data">
    3.             <input type="file" name="filename">
    4.             <br/>
    5.             <br/>
    6.             <br/>
    7.             <textarea type="text" name="comment" id="comment"
    8.                      onfocus="if(document.form_add_file.comment.value=='введите сообщение'){ document.form_add_file.comment.value='' }"
    9.                      onblur="if(document.form_add_file.comment.value==''){ document.form_add_file.comment.value='введите сообщение' }"
    10.                      onkeyup="limiter();" cols="68" rows="10" maxlength="2000">введите сообщение</textarea>
    11.             <br/>
    12.             <br/>
    13.             <input class="submit" type="submit" value="Загрузить" name="submit"><br>
    14.         </form>
    15.     </div>
    А также обработчик этой формы - upload_file.php:
    PHP:
    1. include('connect.php');
    2. if (isset($_POST['comment'])) {
    3.     if (is_uploaded_file($_FILES["filename"]["tmp_name"])) {
    4.         $name = $_FILES["filename"]["name"];
    5.         $date = date('Y-m-d');
    6.         $comment = $_POST['comment'];
    7.         $link = $name;
    8.         if (move_uploaded_file($_FILES["filename"]["tmp_name"], "img/" . $name)) {
    9.             $sql = "INSERT INTO `files` (`id`, `name`, `date`, `comment`, `link`) VALUES ('','" . $name . "','" . $date . "','" . $comment . "','" . $link . "')";
    10.             $date_insert = mysql_query($sql);
    11.  
    12.             if ($date_insert == 'true') {
    13.                 header('Location:add_file.php?file=upload');
    14.                 exit();
    15.             } else {    
    16.                header('Location:add_file.php?file=un_upload');
    17.                exit();
    18.             }
    19.         } else {
    20.             echo("Ошибка загрузки файла");
    21.         }
    22.     } else {
    23.         echo("Ошибка загрузки файла");
    24.     }
    25. }
    Как сделать так, чтобы сообщение об успешной/неуспешной отправке появлялось только один раз, а не срабатывало при каждой перезагрузке браузера.
    Необходимо, наверное, удалить get - параметр после срабатывания js? Мне это не удалось.
    Скорее всего есть другие способы показать сообщение об успешной/неуспешной загрузке файла?
     
  2. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.213
    Симпатии:
    1.711
    Адрес:
    Молдова, г.Кишинёв
    Когда человек отправляет POST или GET запрос, то он его может повторить если нажмёт обновить браузер.
    Чтобы не отправлять POST опять после получения ответа, можно сделать перенапрвление на другой адрес и в нём указать параметры по которым будет понятно какое сообщение вывести, вот уже этот запрос можно будет повторить, так как он просто будет отображать результат, а не отправлять опять форму например.
    Вот такая хитрость. С POST делаем GET и всё.
     
  3. Александр С.

    Александр С. Новичок

    С нами с:
    10 июл 2016
    Сообщения:
    5
    Симпатии:
    0
    Как вариант, передай еще один параметр, который будет, как 'флаг'. В случае повторного обновления страницы, перенапровлял на другую.
     
  4. nina_

    nina_ Новичок

    С нами с:
    3 июл 2016
    Сообщения:
    8
    Симпатии:
    0
    У меня нет проблемы с повторной отправкой формы, т.к. чтобы данные записались в бд, необходимо снова вручную прикрепить файл.
    Дело в том, что: прикрепляю файл (первый файл) -> отправляю форму (другой файл) -> в зависимости о результата (успешная/неуспешна) отправка показываю сообщение (в первом файле), строка url при этом выглядит: http://zadanie/add_file.php?file=upload
    соответственно. И, конечно, если я обновлю браузер, то сообщение об успешной отправке повториться, т.к. get - параметр так и висит при обновлении в строке.
    Вопрос: Как мне его удалить (get - параметр и привести url к виду http://zadanie/add_file.php), после того как произошла отправка формы? Возможно, стоит применить другой подход для вывода сообщения? Подскажите, пожалуйста, какой?

    --- Добавлено ---
    Подскажите, пожалуйста, как в условии можно задать, что это будет повторное обновление страницы?
     
  5. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.178
    Симпатии:
    161
    Адрес:
    GABRIEL
    . Да замени всё на пост запросы! Не понимаю вообще зачем ты здесь гет передачу данных осуществляешь, прямо не понимаю, гет передача не для этого нужна, я $_GET запросы у себя использую только в роуте, при определении страниц, категорий личных страниц и т.д а любые формы, отправляю пост запросами. Ну а когда всё на $_POST заменишь после отправки последнего пост запроса, сделай редирект. Да и вообще если ты хочешь чтобы у тебя всё было динамично так, сделай отправку формы на js с помощью ajax.

    Но можешь конечно извращенцем диким побыть и сделать что-то типа того:
    где нибудь вконце формировании страницы допиши
    PHP:
    1. <?php echo '
    2.    <script>
    3.         function redirect(){
    4.            var url = "http://zadanie/add_file.php";
    5.            $(location).attr(\'href\',url);
    6.         }
    7.        setTimeout(redirect, 5000);
    8.    </script>';
    9.  
    10. ?>
     
    #5 askanim, 11 июл 2016
    Последнее редактирование: 11 июл 2016
  6. nina_

    nina_ Новичок

    С нами с:
    3 июл 2016
    Сообщения:
    8
    Симпатии:
    0
    Хорошо. Что делать с сообщением, как его показывать на: http://zadanie/add_file.php?
     
  7. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.178
    Симпатии:
    161
    Адрес:
    GABRIEL
    Но вообще можешь сделать вот так, без редиректа, вывести что всё у тебя пучком форма отправлена и тд, но при пост запросах когда ты обновишь эту страницу, всё это пропадёт и форма будет пустая. и не будет видна выдачи, ни что форма отправлена ни что форма принята потому что условие

    PHP:
    1. if(isset($_POST['submit'])) {
    2.    // Тут твоя обработка и отправка твоей формы
    3.  
    4. }
    Просто не будет выполнено и страница не будет тронута, но когда ты отправишь форму нажатием по кнопки с именем 'submit' уже $_POST['submit'] будет существовать и твоё условие пройдёт, и форма будет исполнена и соответственно выведет тебе на экран результат, отправлена она или же ошибка форма не отправлена и тд. но я бы сделал на js с помощью ajax весь этот вывод там всё просто и лакончино, и вывод красивенький получается без перезагрузки странички :)
    --- Добавлено ---
    кстати если ты отправляешь форму методом гет то бишь в актион у тебя написан метод гет, то можешь сделать в принципе тоже самое и тоже должно прочухать
    PHP:
    1. if(isset($_GET['submit'])) {
    2.    // Тут твоя обработка и отправка твоей формы
    3. }
    где submit - это имя атрибута name у твоего html тега input с типом submit!


    Но я бы советовал всё же всё переделать на $_POST запросы, ибо если у тебя разрешён $_GET запрос, то к тебе прямо через отправку заголовка, можно отправить данные формы :) зная имя полей твоей формы :)

    Но опять же через пост можно сделать всё тоже самое :D Так что от роботов спасёт только капча :)
     
    #7 askanim, 11 июл 2016
    Последнее редактирование: 11 июл 2016
  8. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.178
    Симпатии:
    161
    Адрес:
    GABRIEL
    Но всё равно через $_POST как то удобней.
     
  9. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.213
    Симпатии:
    1.711
    Адрес:
    Молдова, г.Кишинёв
    @nina_ похоже я понял что тебе надо. Это flash сообщения, скажем кто-то успешно загрузил файл и ты его перенаправляешь на главную страницу (или другую которую нужно) и там выводишь сообщение об успешной отправке файлов. Реализуй это чрез сессии, когда файл успешно загружен, то добавь в сессию сообщение об этом, а на тех страницах где понадобиться выводить сообщения об загрузке или другие, там ты выводи их из сессии и после вывода удаляй, так оно появится только один раз.