Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Проверка на обращение к файлу (https://javascript.ru/forum/misc/72554-proverka-na-obrashhenie-k-fajjlu.html)

xlebosolniy 07.02.2018 20:13

Проверка на обращение к файлу
 
Здравствуйте. Можно ли сделать проверку на обращение к .php файлу? То есть, если обращение происходит, то выполняется определенное действие для пользователя, который обратился к файлу?

laimas 07.02.2018 20:21

Цитата:

Сообщение от xlebosolniy
Можно ли сделать проверку на обращение к .php файлу?

Можно, но выполнить какие-то действия можно при асинхронном запросе, в противном случае отменять действие по умолчанию, выполнить что-то, затем только переход по запрошенному адресу.

xlebosolniy 07.02.2018 20:28

А есть пример этой проверки обращения?

laimas 07.02.2018 20:41

Запрашиваемый URL и проверяйте, а вот что это за запрос, чтобы приводить пример неизвестно. Описывайте задачу полностью что и как, приводя примеры своего кода.

xlebosolniy 07.02.2018 20:50

Если идет обращение к файлу forms.php, то должно срабатывать перенаправление location.href = '#Modal';

пытался делать перенаправление через header('location'), использовал все возможные средства, ничего не помогает, думаю может такое решение хоть как-то поможет

laimas 07.02.2018 20:58

Цитата:

Сообщение от xlebosolniy
пытался делать перенаправление через header('location')

Так вам на сервере это надо определить? Код показывать надо. Что запрашивает - ссылка, в которой такой URL или нечто иное?

xlebosolniy 07.02.2018 21:11

Если пользователь отправляет сообщение в форме обратной связи, то идет обращение к файлу 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';

laimas 07.02.2018 21:25

Цитата:

Сообщение от xlebosolniy
Если пользователь отправляет сообщение в форме обратной связи, то идет обращение к файлу forms.php, если обращение произошло, то нужно его перенаправить на другую страницу.

Если обращение произошло, а значит пользователь на странице forms.php и если перенаправить, на этой странице требуется только такой код:

header('location:/index.php#openModal');
exit;


А еще проще прописать такое перенапрваление в .htaccess, если исходить из вашей логики.

Но как же тогда можно попасть на страницу forms.php?

Вы ничего не путаете в пояснении, может быть перенаправление нужно если запрос страницы без отправления формы?

xlebosolniy 07.02.2018 21:34

Делаю так, перенаправление не работает.

Заполняем и отправляем форму:
<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, чтобы проинформировать отправителя о том, что его заявка отправлена. Способами описанными выше не получается это сделать

laimas 07.02.2018 22:13

Я вас же спрашиваю об отправке формы, а вы кодом отвечаете. Вопрос отношения к 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 ...


Надеюсь правильно понял, чего делается.

xlebosolniy 07.02.2018 23:21

Про 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

laimas 07.02.2018 23:48

Цитата:

Сообщение от xlebosolniy
сделал вывод, что header('location... должен быть в самом вверху, а если установить его сверху и прописать exit;, то получается что дальше выполняться код не будет и сообщение не сгенерируется?

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

Что касается сообщений. JS код показанный, это просто вывод панели сообщений. А форма отправляется естественным образом, то есть пользователь будет направлен на другую страницу, если action формы не является адресом текущей страницы.

В момент отправки формы нельзя тоже выдать сообщение, хотя отправку формы можно и задержать на время достаточное для прочтения сообщения. Просто на этот момент еще не известно примет ли сервер форму.

Заставить клиента показать сообщение, что форма принята, сервером можно, но так как это не асинхронная отправка формы, то это будет перенаправление пользователя, пусть даже на эту же страницу. Но в этом случае надо:
- запомнить данные формы
- обеспечить задержку перенаправления после прочтения пользователем сообщения (это не сложно сделать перенапраяляя через мета тег)
- после перенаправления обработать форму

Но ведь данные формы еще надо и проверить, а не так как у вас, и если будут ошибки ввода, это значит надо возвращать форму пользователю и с ошибками.

И так пока не будет ошибок. После этого отправить почту, опять куда-то перенаправить и выдать сообщение последнее.

Но как и кто должен определить текст сообщений если сервер просто заставляет клиента через хеш открывать панель?

Неужели так важно при получении формы выдать что она получена, чтобы столько скакать по страницам? Отправляйте форму асинхронным запросом, тогда и ошибки заполнения, и что форма принята, все это будет без перезагрузки страницы, и уже только после отправки почты одно перенаправление (но клиентом) с выдачей "ждите...".

И почитайте о формировании почтовых отправлений, такого - "From:admin", "Reply-To: Заявка", не может быть.

xlebosolniy 08.02.2018 00:00

так никто и не прыгает по страницам вроде) форма проверяется на ошибки, а перенаправление всего одно, чтобы открыть модальное окно. Ладно, буду разбираться, спасибо)

laimas 08.02.2018 00:16

Цитата:

Сообщение от xlebosolniy
а перенаправление всего одно

Значит я запутался в описании :).

Ну тогда так (без Ajax):

пришла форма - проверяем ошибки ввода и что прислали, обязательно, это:

$name=$_POST['name'];
$phone=$_POST['phone'];
$email=$_POST['email'];
$service=$_POST['service'];
....

не проверка, а рассадник спама или еще страшнее.

Если есть ошибки, страница forms.php выводит опять форму, но с заполненными полями и с сообщениями об ошибках.

А в самом конце, после отправки почты перенаправление на индексную страницу с хеш указанным - header(). Вот только где и как определяется текст ... Если панель присутствует уже на странице и с текстом, а скрипт ее вызывающий просто отображает ее, тогда можно текст на индексной странице определить через сессию.

xlebosolniy 08.02.2018 00:46

Текст показывается в модальном окне по ссылке http://f0184040.xsph.ru/#openModal, вопрос в том, как сделать открытие этой страницы http://f0184040.xsph.ru/#openModal чтобы показать сообщение после отправки письма

laimas 08.02.2018 00:52

Ну если это окошко для вывода только одного этого сообщения тогда нет проблемы с текстом.

Я же писал как, вот такая логика у скрипта должна быть:

проверка формы
если есть ошибки возврат формы и ошибок
иначе - отправка почты и перенаправление на указанный адрес.

Проблемы как конкретно реализовать это?

xlebosolniy 08.02.2018 01:27

Проверяется несколько пунктов, которые должны быть обязательные, если содержат ошибки или не заполнены- возврат. В данный момент мне нужно конкретно после отправки формы выводить это сообщение 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:... тоже ничего не понял, где бы не разместил его, все равно никуда не перенаправляется)

laimas 08.02.2018 09:38

Цитата:

Сообщение от xlebosolniy
Проверяется несколько пунктов, которые должны быть обязательные, если содержат ошибки или не заполнены- возврат.

Где это? if (!empty($name)) {$msg =$msg."\nИмя: ".$name;} - это что-ли проверка? Пробел переданный полем уже не является пустым значением. Если так проверять данные извне, я могу вам гарантировать, что превращу ваш домен в рассадник спама.

$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.

Если у вас нет перенаправления, то структура кода, логика ее, у вас неверна.

xlebosolniy 08.02.2018 12:45

Я опять запутался.
Вот у меня сейчас вот так:
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";	}

laimas 08.02.2018 13:13

А зачем писать $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';
}

xlebosolniy 08.02.2018 18:57

Цитата:

А зачем писать $name,$phone,$email в файл, да еще таким образом задавать строку? Так и задавать - $txt=$name, $phone, $email; или через точку.
У меня же прописано
$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 прописывать ничего не надо?

laimas 08.02.2018 19:11

Цитата:

Сообщение от xlebosolniy
или нужен пробел после запятой?

В кавычки зачем помещать строки?

$txt = $name . $phone . $email;


А пробелы между операндами на значение не влияют.

Цитата:

Сообщение от xlebosolniy
У Вас написано "include 'form.htm';" - нужно исправить на .php, верно?

Не обязательно. Форма это чистый html код будет, только с небольшими вставками РНР кода, а значит пусть это и будет html тип, удобнее будет в редакторе. В РНР подключить можно любой файл, даже и без расширения. Как работает парсер при подключении читать здесь.

Цитата:

Сообщение от xlebosolniy
location можно с маленькой писать или нужно с большой?

Не важно, как нравится, вам важен переход, а не как браузер будет интерпретировать имя этого заголовка.

Цитата:

Сообщение от xlebosolniy
в .htaccess прописывать ничего не надо?

Не надо. Если перенаправления нет, включить вывод ошибок, явно есть ошибки в коде, и скорее всего уже был вывод в браузер, если до этого ОК, а перенаправления нет.

xlebosolniy 08.02.2018 19:51

Выводилась ошибка 500, но она вызывалась как я понял из-за этой строчки echo 'Ошибка отправления почты, попробуйте повторить позже.'; пока в конце не было точки с запятой.
А чтобы вывести ошибки в файл отдельный нужно следовать этой инструкции https://help.sweb.ru/entry/137/ ?

xlebosolniy 08.02.2018 19:58

А, вроде разобрался)
Добавил в самое начало form.php
ini_set('error_reporting', E_ALL);
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);

заполнил форму, отправил и ничего не показало, значит ошибок нет или как?)

laimas 08.02.2018 21:02

Если ошибок нет, проверяйте путь.

xlebosolniy 08.02.2018 21:40

Ну путь вроде правильный, даже если выставить как пример https://www.yandex.ru/ все равно ничего или так нельзя?

xlebosolniy 08.02.2018 23:26

Все, разобрался) Спасибо огромное за помощь)


Часовой пояс GMT +3, время: 15:23.