Добрый день. Помогите, пожалуйста, разобраться. Есть форма загрузки файла на сервер - add_file.php: PHP: <?php session_start(); include('function.php'); Autorize(); if ($_GET['file'] == 'upload') { echo "<script>alert(\"Файл загружен\");</script>"; } else if($_GET['file'] == 'un_upload') { echo "<script>alert(\"Ошибка загрузки файла\");</script>"; } ?> HTML: ...<div class="item"> <form name="form_add_file" action="upload_file.php" method="post" enctype="multipart/form-data"> <input type="file" name="filename"> <br/> <br/> <br/> <textarea type="text" name="comment" id="comment" onfocus="if(document.form_add_file.comment.value=='введите сообщение'){ document.form_add_file.comment.value='' }" onblur="if(document.form_add_file.comment.value==''){ document.form_add_file.comment.value='введите сообщение' }" onkeyup="limiter();" cols="68" rows="10" maxlength="2000">введите сообщение</textarea> <br/> <br/> <input class="submit" type="submit" value="Загрузить" name="submit"><br> </form> </div> А также обработчик этой формы - upload_file.php: PHP: include('connect.php'); if (isset($_POST['comment'])) { if (is_uploaded_file($_FILES["filename"]["tmp_name"])) { $name = $_FILES["filename"]["name"]; $date = date('Y-m-d'); $comment = $_POST['comment']; $link = $name; if (move_uploaded_file($_FILES["filename"]["tmp_name"], "img/" . $name)) { $sql = "INSERT INTO `files` (`id`, `name`, `date`, `comment`, `link`) VALUES ('','" . $name . "','" . $date . "','" . $comment . "','" . $link . "')"; $date_insert = mysql_query($sql); if ($date_insert == 'true') { header('Location:add_file.php?file=upload'); exit(); } else { header('Location:add_file.php?file=un_upload'); exit(); } } else { echo("Ошибка загрузки файла"); } } else { echo("Ошибка загрузки файла"); } } Как сделать так, чтобы сообщение об успешной/неуспешной отправке появлялось только один раз, а не срабатывало при каждой перезагрузке браузера. Необходимо, наверное, удалить get - параметр после срабатывания js? Мне это не удалось. Скорее всего есть другие способы показать сообщение об успешной/неуспешной загрузке файла?
Когда человек отправляет POST или GET запрос, то он его может повторить если нажмёт обновить браузер. Чтобы не отправлять POST опять после получения ответа, можно сделать перенапрвление на другой адрес и в нём указать параметры по которым будет понятно какое сообщение вывести, вот уже этот запрос можно будет повторить, так как он просто будет отображать результат, а не отправлять опять форму например. Вот такая хитрость. С POST делаем GET и всё.
Как вариант, передай еще один параметр, который будет, как 'флаг'. В случае повторного обновления страницы, перенапровлял на другую.
У меня нет проблемы с повторной отправкой формы, т.к. чтобы данные записались в бд, необходимо снова вручную прикрепить файл. Дело в том, что: прикрепляю файл (первый файл) -> отправляю форму (другой файл) -> в зависимости о результата (успешная/неуспешна) отправка показываю сообщение (в первом файле), строка url при этом выглядит: http://zadanie/add_file.php?file=upload соответственно. И, конечно, если я обновлю браузер, то сообщение об успешной отправке повториться, т.к. get - параметр так и висит при обновлении в строке. Вопрос: Как мне его удалить (get - параметр и привести url к виду http://zadanie/add_file.php), после того как произошла отправка формы? Возможно, стоит применить другой подход для вывода сообщения? Подскажите, пожалуйста, какой? --- Добавлено --- Подскажите, пожалуйста, как в условии можно задать, что это будет повторное обновление страницы?
. Да замени всё на пост запросы! Не понимаю вообще зачем ты здесь гет передачу данных осуществляешь, прямо не понимаю, гет передача не для этого нужна, я $_GET запросы у себя использую только в роуте, при определении страниц, категорий личных страниц и т.д а любые формы, отправляю пост запросами. Ну а когда всё на $_POST заменишь после отправки последнего пост запроса, сделай редирект. Да и вообще если ты хочешь чтобы у тебя всё было динамично так, сделай отправку формы на js с помощью ajax. Но можешь конечно извращенцем диким побыть и сделать что-то типа того: где нибудь вконце формировании страницы допиши PHP: <?php echo ' <script> function redirect(){ var url = "http://zadanie/add_file.php"; $(location).attr(\'href\',url); } setTimeout(redirect, 5000); </script>'; ?>
Но вообще можешь сделать вот так, без редиректа, вывести что всё у тебя пучком форма отправлена и тд, но при пост запросах когда ты обновишь эту страницу, всё это пропадёт и форма будет пустая. и не будет видна выдачи, ни что форма отправлена ни что форма принята потому что условие PHP: if(isset($_POST['submit'])) { // Тут твоя обработка и отправка твоей формы } Просто не будет выполнено и страница не будет тронута, но когда ты отправишь форму нажатием по кнопки с именем 'submit' уже $_POST['submit'] будет существовать и твоё условие пройдёт, и форма будет исполнена и соответственно выведет тебе на экран результат, отправлена она или же ошибка форма не отправлена и тд. но я бы сделал на js с помощью ajax весь этот вывод там всё просто и лакончино, и вывод красивенький получается без перезагрузки странички --- Добавлено --- кстати если ты отправляешь форму методом гет то бишь в актион у тебя написан метод гет, то можешь сделать в принципе тоже самое и тоже должно прочухать PHP: if(isset($_GET['submit'])) { // Тут твоя обработка и отправка твоей формы } где submit - это имя атрибута name у твоего html тега input с типом submit! Но я бы советовал всё же всё переделать на $_POST запросы, ибо если у тебя разрешён $_GET запрос, то к тебе прямо через отправку заголовка, можно отправить данные формы зная имя полей твоей формы Но опять же через пост можно сделать всё тоже самое Так что от роботов спасёт только капча
@nina_ похоже я понял что тебе надо. Это flash сообщения, скажем кто-то успешно загрузил файл и ты его перенаправляешь на главную страницу (или другую которую нужно) и там выводишь сообщение об успешной отправке файлов. Реализуй это чрез сессии, когда файл успешно загружен, то добавь в сессию сообщение об этом, а на тех страницах где понадобиться выводить сообщения об загрузке или другие, там ты выводи их из сессии и после вывода удаляй, так оно появится только один раз.