Проверка на обращение к файлу
Здравствуйте. Можно ли сделать проверку на обращение к .php файлу? То есть, если обращение происходит, то выполняется определенное действие для пользователя, который обратился к файлу?
|
Цитата:
|
А есть пример этой проверки обращения?
|
Запрашиваемый URL и проверяйте, а вот что это за запрос, чтобы приводить пример неизвестно. Описывайте задачу полностью что и как, приводя примеры своего кода.
|
Если идет обращение к файлу forms.php, то должно срабатывать перенаправление location.href = '#Modal';
пытался делать перенаправление через header('location'), использовал все возможные средства, ничего не помогает, думаю может такое решение хоть как-то поможет |
Цитата:
|
Если пользователь отправляет сообщение в форме обратной связи, то идет обращение к файлу forms.php, если обращение произошло, то нужно его перенаправить на другую страницу.
Пытаюсь сделать таким образом: [SPOILER] <?php header('location: http://f0184040.xsph.ru/#openModal'); $backurl="/index.php#openModal"; $name=$_POST['name']; $phone=$_POST['phone']; $email=$_POST['email']; $service=$_POST['service']; $inn=$_POST['inn']; $auction=$_POST['auction']; $period=$_POST['period']; $amount=$_POST['amount']; $mess=$_POST['mess']; $dopinf=$_POST['dopinf']; $to .= "<mail@mail.ru>"; $subject = "Заявка с сайта"; if (!empty($name)) { $msg =$msg."\nИмя: ".$name; } if (!empty($phone)) { $msg =$msg."\nТелефон для связи: ".$phone; } if (!empty($email)) { $msg =$msg."\nEmail: ".$email; } if (!empty($service)) { $msg =$msg."\nТип услуг: ".$service; } if (!empty($inn)) { $msg =$msg."\nИНН: ".$inn; } if (!empty($auction)) { $msg =$msg."\nСсылка или № аукциона: ".$auction; } if (!empty($period)) { $msg =$msg."\nСрок гарантии: ".$period; } if (!empty($amount)) { $msg =$msg."\nСумма обеспечения: ".$amount; } if (!empty($mess)) { $msg =$msg."\nСообщение / вопрос: ".$mess; } if (!empty($dopinf)) { $msg =$msg."\n ".$dopinf; } $headers = array(); $headers[] = "Content-type: text/plain; charset=utf-8"; $headers[] = "From:admin"; $headers[] = "Reply-To: Заявка"; if (mail($to, $subject, $msg, implode("\r\n", $headers) )) { ////////////////////////////////////////////// $txt="$name,$phone,$email "; $fp = fopen("mail.txt", "a+"); $fw = fwrite($fp, $txt); fclose($fp); ///////////////////////////////////////////// echo "location.href = '#openModal'";} else { echo "False"; } /*echo "<script language='Javascript'> window.location = '/index.php#openModal' </script>"; */ ?>[/SPOILER] Использую header('location') - не работает Пытаюсь так сделать: if (mail($to, $subject, $msg, implode("\r\n", $headers) )) { ////////////////////////////////////////////// $txt="$name,$phone,$email "; $fp = fopen("mail.txt", "a+"); $fw = fwrite($fp, $txt); fclose($fp); ///////////////////////////////////////////// echo "location.href = '#openModal'";} else { echo "False"; } Тоже не работает. Вот у меня и появился вопрос, возможно ли и насколько качественно будет если сделать через js проверку на обращение к файлу forms.php, если обращение произошло, то применяется перенаправление location.href = '#openModal'; |
Цитата:
header('location:/index.php#openModal'); exit; А еще проще прописать такое перенапрваление в .htaccess, если исходить из вашей логики. Но как же тогда можно попасть на страницу forms.php? Вы ничего не путаете в пояснении, может быть перенаправление нужно если запрос страницы без отправления формы? |
Делаю так, перенаправление не работает.
Заполняем и отправляем форму: <form id="oboloc" class="form-horizontal" method="post" action="forms.php"> <input class="type" name="type" value="1" type="hidden"> <div> <div class="col-xs-12 col-sm-12 col-md-12 col-lg-12 f-group var0 var1 var2 var3"> <input type="text" class="form-control" name="name" placeholder="Контактное лицо" required> </div> </div> <div> <div class="col-xs-12 col-sm-12 col-md-12 col-lg-12 f-group var1 var2 var3"> <input type="text" class="form-control phone or" name="phone" placeholder="Телефон с кодом или" required> </div> <div class="col-xs-12 col-sm-12 col-md-12 col-lg-12 f-group var0 var1 var2 var3"> <input type="text" class="form-control email or" name="email" placeholder="e-mail" required> </div> </div> <div> <div class="col-sm-12 col-md-12 col-lg-12 f-group var2 var3"> <input type="text" class="form-control only-numbers inn" name="inn" maxlength="12" placeholder="ИНН" required> </div> <div class="col-xs-12 col-sm-12 col-md-12 col-lg-12 f-group var2 var3"> <input type="text" class="form-control" name="auction" placeholder="Ссылка или № аукциона" required> </div> </div> <div> <div class="col-xs-12 col-sm-12 col-md-12 col-lg-12 f-group var0 var1 var2 var3"> <textarea class="form-control" name="mess" placeholder="Сообщение / вопрос"></textarea> </div> </div> <div id="kn001" class="f-group var0 var1 var2 var3"> <div class="col-xs-12 col-sm-12 col-md-12 col-lg-12 center"> <input type="button" class="btn btn-primary form" value="Отправка"> <input type="reset" class="btn btn-default" value="Очистить форму"> </div> </div> </form> action="forms.php" - получается попадаем на эту страницу, которая отправляет сообщение. Сообщение отправилось, нужно перенаправить на страницу #openModal, чтобы проинформировать отправителя о том, что его заявка отправлена. Способами описанными выше не получается это сделать |
Я вас же спрашиваю об отправке формы, а вы кодом отвечаете. Вопрос отношения к JS не имеет, не в этом разделе его надо было задавать.
header('location: http://f0184040.xsph.ru/#openModal'); и далее код, это уже неверно, обязательно нужно делать выход - exit; после передачи заголовка. Но что это за заголовок? А это что означает - action="forms.php" - получается попадаем на эту страницу, которая отправляет сообщение.? Как это, если не видно асинхронных запросов, а значит с этой страницы либо уйти на другую, либо нет смысла в таком перенаправлении. echo "location.href = '#openModal'"; - а это попытка тогда чего? Во-первых работать не будет, ибо это просто строка, а не js-код. Во-вторых как одним значением можно определить два состояния - первый заголовок с #openModal, и вторая попытка тоже с #openModal? Вообще по уму должно быть так - страница должна отвечать только на POST запросы, то есть если вызов ее будет через адресную строку, то либо перенапрваление, либо выход и ..., решайте. if($_SERVER['REQUEST_METHOD']=='POST') { //основной код //Здесь же и перенаправления, и если #openModal запускает на клиенте окно сообщений, и нужно передать их два, //то это либо два перехода по разным адресам, либо на один и тот же адрес, //но с передачей дополнительного параметра определяющего текст сообщения. //Если такой параметр нежелателен в адресе, можно передать через сессию. //Не самый лучший вариант и разумнее ограничится одним сообщением - результатом "принято и свяжемся". //А вот если форма отправляется асинхронным запросом (ajax), тогда возможны любые диалоги //и передавать хеш в адресе не потребуется } //else ... Надеюсь правильно понял, чего делается. |
Про JS я имел ввиду следующее:
$('.btn').click(function(){ locatio[/CSS]n.href = '#openModal'; }); при нажатии на кнопку, открывается страница по адресу - http://f0184040.xsph.ru/#openModal Мне было интересно, можно ли вместо нажатия на кнопку, поставить проверку на обращение к файлу forms.php. То есть, когда человек заполняет форму обратной связи и нажимает "отправить", он же обращается к файлу form.php, который генерирует письмо и отправляет его на почту? Судя по мануалу - http://php.net/manual/ru/function.header.php сделал вывод, что header('location... должен быть в самом вверху, а если установить его сверху и прописать exit;, то получается что дальше выполняться код не будет и сообщение не сгенерируется? А мне нужно, чтобы было отправлено сообщение и тому, кто отправил получил сообщение о том, что его заявка отправлена, а сообщение это можно получить по ссылке - http://f0184040.xsph.ru/#openModal |
Цитата:
Что касается сообщений. JS код показанный, это просто вывод панели сообщений. А форма отправляется естественным образом, то есть пользователь будет направлен на другую страницу, если action формы не является адресом текущей страницы. В момент отправки формы нельзя тоже выдать сообщение, хотя отправку формы можно и задержать на время достаточное для прочтения сообщения. Просто на этот момент еще не известно примет ли сервер форму. Заставить клиента показать сообщение, что форма принята, сервером можно, но так как это не асинхронная отправка формы, то это будет перенаправление пользователя, пусть даже на эту же страницу. Но в этом случае надо: - запомнить данные формы - обеспечить задержку перенаправления после прочтения пользователем сообщения (это не сложно сделать перенапраяляя через мета тег) - после перенаправления обработать форму Но ведь данные формы еще надо и проверить, а не так как у вас, и если будут ошибки ввода, это значит надо возвращать форму пользователю и с ошибками. И так пока не будет ошибок. После этого отправить почту, опять куда-то перенаправить и выдать сообщение последнее. Но как и кто должен определить текст сообщений если сервер просто заставляет клиента через хеш открывать панель? Неужели так важно при получении формы выдать что она получена, чтобы столько скакать по страницам? Отправляйте форму асинхронным запросом, тогда и ошибки заполнения, и что форма принята, все это будет без перезагрузки страницы, и уже только после отправки почты одно перенаправление (но клиентом) с выдачей "ждите...". И почитайте о формировании почтовых отправлений, такого - "From:admin", "Reply-To: Заявка", не может быть. |
так никто и не прыгает по страницам вроде) форма проверяется на ошибки, а перенаправление всего одно, чтобы открыть модальное окно. Ладно, буду разбираться, спасибо)
|
Цитата:
Ну тогда так (без Ajax): пришла форма - проверяем ошибки ввода и что прислали, обязательно, это: $name=$_POST['name']; $phone=$_POST['phone']; $email=$_POST['email']; $service=$_POST['service']; .... не проверка, а рассадник спама или еще страшнее. Если есть ошибки, страница forms.php выводит опять форму, но с заполненными полями и с сообщениями об ошибках. А в самом конце, после отправки почты перенаправление на индексную страницу с хеш указанным - header(). Вот только где и как определяется текст ... Если панель присутствует уже на странице и с текстом, а скрипт ее вызывающий просто отображает ее, тогда можно текст на индексной странице определить через сессию. |
Текст показывается в модальном окне по ссылке http://f0184040.xsph.ru/#openModal, вопрос в том, как сделать открытие этой страницы http://f0184040.xsph.ru/#openModal чтобы показать сообщение после отправки письма
|
Ну если это окошко для вывода только одного этого сообщения тогда нет проблемы с текстом.
Я же писал как, вот такая логика у скрипта должна быть: проверка формы если есть ошибки возврат формы и ошибок иначе - отправка почты и перенаправление на указанный адрес. Проблемы как конкретно реализовать это? |
Проверяется несколько пунктов, которые должны быть обязательные, если содержат ошибки или не заполнены- возврат. В данный момент мне нужно конкретно после отправки формы выводить это сообщение http://f0184040.xsph.ru/#openModal
С этим я мучаюсь уже второй день, поэтому если где-то даже есть косяки, которые не влияют на вывод этого текста, то хотелось бы сначала сделать текст, а потом уже все остальное разгребать) пытался делать вот так: if (mail($to, $subject, $msg, implode("\r\n", $headers) )) { ////////////////////////////////////////////// $txt="$name,$phone,$email"; $fp = fopen("mail.txt", "a+"); $fw = fwrite($fp, $txt); fclose($fp); ///////////////////////////////////////////// echo "location.href = '#openModal'";} else { echo "False"; } что перенаправить или хотя бы вывести текст через алерт Есть одна форма у меня: if(@mail($sendto, $subject, $msg, $headers)) { echo "<script>alert('Заявка успешно отправлена. Ожидайте звонка в указанное Вами время.'); location.href='index.html';</script>"; } else { echo "<center><img src='images/ne-otpravleno.png'></center>"; } Которая после удачной отправки выдает текст и перезагружает страницу, вот по такому принципу пытался сделать и в этой форме) по поводу header('Location:... тоже ничего не понял, где бы не разместил его, все равно никуда не перенаправляется) |
Цитата:
$post = array_map('trim', $_POST); Только после этого можно проверить пусто ли значение $post['name']. А в поле адреса не должно быть лишнего. И формирование самой отправки никуда не годится. Например тему сообщения нужно кодировать, на нее не распространяется заголовок указывающий кодировку. Читайте, в интернете об этом столько написано, что читать и не перечитать. У вас форма отдается клиенту на другой странице, и страница form.php в случае ошибки должна возвращать форму. Из этого следует, что форму удобно иметь в виде подключаемого шаблона и с учетом заполнения. То есть, в html шаблоне формы должны быть php вставки: <input type="text" class="form-control" name="name" value="<?=htmlspecialchars($name)?>" placeholder="Контактное лицо" required> и т.д. При подавлении вывода предупреждений (а на севере это должно быть так), на первой странице при подключении шаблона формы php-переменные будут раны null. А на странице form.php они определены и при ошибках, и подключении формы для возврата пользователю, поля форы будут заполнены данными введенными пользователем. Логика кода: if(@mail($sendto, $subject, $msg, $headers)) { echo "<script>alert('Заявка успешно отправлена. Ожидайте звонка в указанное Вами время.'); location.href='index.html';</script>"; } else { echo "<center><img src='images/ne-otpravleno.png'></center>"; } вообще не понятна, вернее тут полное отсутствие логики. Никаких собачек для подавления функции mail не нужно, эта функция не отправляет почту, она только отдает сформированное отправление sendmail, и возвращает только true/false, в зависимости от того принял ли sendmail почту для отправки или нет. Весь этот код заменим на: header('location:/index.php#openModal'); А так как это последнее по логике в коде, значит exit можно не выполнять. В данном случае переход решает и проблему повторной отправки формы по F5. Если у вас нет перенаправления, то структура кода, логика ее, у вас неверна. |
Я опять запутался.
Вот у меня сейчас вот так: if (mail($to, $subject, $msg, implode("\r\n", $headers) )) { $txt="$name,$phone,$email "; $fp = fopen("mail.txt", "a+"); $fw = fwrite($fp, $txt); fclose($fp); echo "Отправляется...";} else { echo "False"; } Это нужно заменить на header('location:/index.php#openModal'); ? Или вот так (и правильно ли вообще): if(mail($to, $subject, $msg, implode("\r\n", $headers) )) { $txt="$name,$phone,$email "; $fp = fopen("mail.txt", "a+"); $fw = fwrite($fp, $txt); fclose($fp); echo header('location:/index.php#openModal'); } else { echo "False"; } |
А зачем писать $name,$phone,$email в файл, да еще таким образом задавать строку? Так и задавать - $txt=$name, $phone, $email; или через точку. Что базы нет?
echo "Отправляется...", это бесполезное, ибо никакого отправления вы не получите, отправление отдано sendmail, все, перенаправление. Но если обрабатывать непринятие почтового отправления, то так: if(mail(...)) { //какой-то код header('location:/index.php#openModal'); //это передача заголовка, никаких echo header быть не может //и учтите, что указывается относительный путь и он должен быть правильным } else { echo 'Ошибка отправления почты, попробуйте повторить позже.' //если не было ошибок приема формы, то есть форма не подключалась, то подключить, иначе пользователь не сможет повторить отправление if(!$error) include 'form.htm'; } |
Цитата:
$txt="$name,$phone,$email"; или нужен пробел после запятой?) Получается я сделал вот так: if (mail($to, $subject, $msg, implode("\r\n", $headers) )) { $txt="$name, $phone, $email"; $fp = fopen("mail.txt", "a+"); $fw = fwrite($fp, $txt); fclose($fp); header('location: /index.php#openModal'); //это передача заголовка, никаких echo header быть не может //и учтите, что указывается относительный путь и он должен быть правильным } else { echo 'Ошибка отправления почты, попробуйте повторить позже.'; //если не было ошибок приема формы, то есть форма не подключалась, то подключить, иначе пользователь не сможет повторить отправление if(!$error) include 'form.php'; } У Вас написано "include 'form.htm';" - нужно исправить на .php, верно? location можно с маленькой писать или нужно с большой? Смотрю вот тут http://redirekt.info/article/pishem-...hp-header.html везде с большой пишется. Но все равно перенаправляться не хочет, пытался как с маленькой та и с большой. Брал ссылки из примеров, тоже ни в какую, а в .htaccess прописывать ничего не надо? |
Цитата:
$txt = $name . $phone . $email; А пробелы между операндами на значение не влияют. Цитата:
Цитата:
Цитата:
|
Выводилась ошибка 500, но она вызывалась как я понял из-за этой строчки echo 'Ошибка отправления почты, попробуйте повторить позже.'; пока в конце не было точки с запятой.
А чтобы вывести ошибки в файл отдельный нужно следовать этой инструкции https://help.sweb.ru/entry/137/ ? |
А, вроде разобрался)
Добавил в самое начало form.php ini_set('error_reporting', E_ALL); ini_set('display_errors', 1); ini_set('display_startup_errors', 1); заполнил форму, отправил и ничего не показало, значит ошибок нет или как?) |
Если ошибок нет, проверяйте путь.
|
Ну путь вроде правильный, даже если выставить как пример https://www.yandex.ru/ все равно ничего или так нельзя?
|
Все, разобрался) Спасибо огромное за помощь)
|
Часовой пояс GMT +3, время: 15:23. |