Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Скриптовые языки программирования > PHP
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.04.2018, 18:09   #1
DanDiablo
Пользователь
 
Аватар для DanDiablo
 
Регистрация: 25.08.2015
Сообщений: 55
Злость Отправка формы НЕ работает, помогите!

Доброго времени суток, дамы и господа!

Помогите дурочку, мне то ест...

Есть простой скрипт отправки:
Код:
	<?php
		if (isset($_POST['name'])) {$name = $_POST['name'];}
		if (isset($_POST['user_email'])) {$user_email = $_POST['user_email'];}
		if (isset($_POST['tema'])) {$tema = $_POST['tema'];}
		if (isset($_POST['text'])) {$text = $_POST['text'];}
		if (isset($_POST['tel'])) {$tel = $_POST['tel'];}

		$to = "mail@gmail.com";
		$headers .= 'Content-type: text/html; charset=utf-8' . "\r\n";
		$headers .= "From: \"".$name."\" <".$email.">\r\n";
		$headers .= "Reply-To: $user_email\r\n";
		$subject = "Сайт название, тема: $tema";
		$message = "<b>Имя отправителя:</b> $name <br>
								<b>Телефон отправителя:</b> $tel <br>
								<b>Почта отправителя:</b> $user_email <br>
								<b>Сообщение:</b> <br> $text";
		$send = mail ($to, $subject, $message, $headers);
		
	?>
Я его модернизировал... И он работать перестал!

Код:

<?php
session_start();
    $errors = [];

    if (isset($_POST['name'])){
        $name = trim($_POST['name']);
        if(mb_strlen($name,'UTF-8') < 4){
            $errors[] = 'Имя должно быть не меньше 4 букв!';
        }
        if ($name !== '' && !preg_match('/[^а-яА-ЯЁё\s]+/msi',$name)){
            $errors[] = 'Имя должно быть русскими буквами!';
        }
    }

    if (isset($_POST['user_email'])){
        $user_email = trim($_POST['user_email']);
        if ($user_email === '' || !preg_match('/^[a-zA-Z0-9_\-.]+@[a-zA-Z0-9\-]+\.[a-zA-Z0-9\-.]+s/', $user_email)){
            $errors[] = 'Пожалуйста, введите почту!';
        }
    }

    if (isset($_POST['tema'])){
        $tema = trim($_POST['tema']);
        if (!preg_match('/[^а-яА-ЯЁё\s]+/msi',$tema)){
            $errors[] = 'Тема должна быть русскими буквами!';
        }
        if(mb_strlen($tema,'UTF-8') < 8){
            $errors[] = 'Тема должна быть не меньше 8 букв!';
        }
    }

    if (isset($_POST['text'])){
        $text = trim($_POST['text']);
        if(mb_strlen($text,'UTF-8') < 10){
        $errors[] = 'Сообщение должно быть не меньше 10 букв!';
        }
    }

    if (isset($_POST['tel'])){
        $tel = trim($_POST['tel']);
        if ($tel !== '' && !is_numeric($tel)){
            $errors[] = 'Пожалуйста, введите телефон!';
        }
    }

if ($errors) {
        $_SESSION['error'] = 'Пожалуйста, исправьте данные ошибки: <ul><li>' . implode('</li><li>', $errors) . '</li></ul>';
}
else{
  $to = "mail@gmail.com";
  $headers .= 'Content-type: text/html; charset=utf-8' . "\r\n";
  $headers .= "From: \"".$name."\" <".$user_email.">\r\n";
  $headers .= "Reply-To: $user_email\r\n";
  $subject = "Сайт название, тема: " . htmlspecialchars($tema, ENT_QUOTES, 'utf-8');
  $message = "<b>Имя отправителя:</b>" . htmlspecialchars($name, ENT_QUOTES, 'utf-8') . "<br>
								<b>Телефон отправителя:</b> $tel <br> 
								<b>Почта отправителя:</b> $user_email <br>
								<b>Сообщение:</b> <br>" . htmlspecialchars($text, ENT_QUOTES, 'utf-8');
  $send = mail ($to, $subject, $message, $headers);
 }

?>
Для вывода ошибок пользователя в форме такой вот код:

Код:

<?php
session_start();
?>

<?php
$error_form = $_SESSION['error'];
echo $error_form;
unset($_SESSION['error']);
?>
Письма не отправляются, ошибки пользователя не выводятся.
Блин, вот по чему?
Укажите ошибку, пожалуйста, и как вообще правильно сделать.

На самые простые ответы типа - читай документацию, отвечаю сразу - весь день сегодня на этом скрипте потерял.

Тестируется на Open Server, PHP 5.5

Благодарю за внимание!
DanDiablo вне форума Ответить с цитированием
Старый 17.04.2018, 18:35   #2
Andkorol
Старожил
 
Регистрация: 31.05.2010
Сообщений: 3,301
По умолчанию

В самый конец кода обработки формы добавить:
PHP код:
var_dump($errors$send);die; 
Что этот код выведет в браузер?
Andkorol вне форума Ответить с цитированием
Старый 17.04.2018, 20:58   #3
ADSoft
Старожил
 
Регистрация: 25.02.2007
Сообщений: 4,149
По умолчанию

Цитата:
Сообщение от DanDiablo Посмотреть сообщение
if ($errors) {
странное сравнение ля пустого массива например
могли бы кол-во элементов массива проверять COUNT($errors)>0
ADSoft вне форума Ответить с цитированием
Старый 18.04.2018, 10:42   #4
DanDiablo
Пользователь
 
Аватар для DanDiablo
 
Регистрация: 25.08.2015
Сообщений: 55
По умолчанию

Цитата:
Сообщение от ADSoft Посмотреть сообщение
странное сравнение ля пустого массива например
могли бы кол-во элементов массива проверять COUNT($errors)>0
Это я взял пример из книги, как раз глава обработка формы.

Код:
1 1   отобразить  форму 
fun ction  show_form ( $errors  )  { 
/ / Если  переданы  ошибки,  вывести  их  на  экран 
if  ( $errors)  { 
print  ' Please  correct  these  errors :  <ul><li> ' ;  
print  implode ( ' </l i><li> ' ,   $errors ) ;  
print  ' </li></ul> ' ;
Но Ваш способ я тоже пробовал (так как у меня не функция), результата нет.
Пожалуй, все же сменю на более правильный, спасибо.
DanDiablo вне форума Ответить с цитированием
Старый 18.04.2018, 11:01   #5
DanDiablo
Пользователь
 
Аватар для DanDiablo
 
Регистрация: 25.08.2015
Сообщений: 55
По умолчанию

Цитата:
Сообщение от Andkorol Посмотреть сообщение
В самый конец кода обработки формы добавить:
PHP код:
var_dump($errors$send);die; 
Что этот код выведет в браузер?
Стоило сказать сразу, что сайт сделан на старенькой сms, а я полез его облагораживать.

Догадавшись сегодня включить режим отладки, на форме увидел такие вот сообщения:

Код:
Notice: A session had already been started - ignoring session_start() in C:\OSPanel\domains\cadi\tmp\htm41F6.tmp on line 80

Notice: Undefined index: error in C:\OSPanel\domains\cadi\tmp\htm41F6.tmp on line 81
Но по данному адресу таких файлов не нашел, так что код привести не могу.
Но другие tmp с другими цифрами там лежат, странно.

Как я понимаю, через сессию ошибки передать не удастся?
Попробую поместить форму в php сразу.

Далее, догадавшись отключить ajax, после отправки увидел вот такое чудо:

Код:
array(5) { [0]=> string(58) "Р˜РјСЏ должно быть РЅРµ меньше 4 Р±СѓРєРІ!" [1]=> string(48) "Пожалуйста, введите почту!" [2]=> string(63) "Тема должна быть СЂСѓСЃСЃРєРёРјРё буквами!" [3]=> string(60) "Тема должна быть РЅРµ меньше 8 Р±СѓРєРІ!" [4]=> string(71) "Сообщение должно быть РЅРµ меньше 10 Р±СѓРєРІ!" } NULL
Можно ли сменить кодировку вывода ошибок?

Можно ли вообще сделать проверку на ошибки силами php или обойтись js?

Но хочется же все по уму людям сделать.
DanDiablo вне форума Ответить с цитированием
Старый 18.04.2018, 11:07   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

Цитата:
Сообщение от DanDiablo Посмотреть сообщение
увидел вот такое чудо:
перевод:
Код:
array(5) { 
[0]=> string(58) "Имя должно быть не меньше 4 букв!" 
[1]=> string(48) "Пожалуйста, введите почту!" 
[2]=> string(63) "Тема должна быть русскими буквами!" 
[3]=> string(60) "Тема должна быть не меньше 8 букв!" 
[4]=> string(71) "Сообщение должно быть не меньше 10 букв!" } NULL

Цитата:
Сообщение от DanDiablo Посмотреть сообщение
Но другие tmp с другими цифрами там лежат, странно.
почему tmp ?! Вас не взломали? Или это такая cms странная?
Serge_Bliznykov вне форума Ответить с цитированием
Старый 18.04.2018, 11:30   #7
DanDiablo
Пользователь
 
Аватар для DanDiablo
 
Регистрация: 25.08.2015
Сообщений: 55
По умолчанию

Ага, значит, дело все же в сессии, если не выводятся.

Некому взламывать, сайт на компе лежит, Open Server без доступа в сеть, на компе лицензионный антивирус (хоть какая то гарантия).

А файлы действительно есть htm2128.tmp и htmF39D.tmp

Сейчас мысль в голову пришла, cms - joomla 2.5, потому и php 5.5

Может, php не совместим? Но без проверки почта то отправляется (сохраняется в txt в папочку)!

Сейчас попробую форму в обработчик запихнуть, что бы без сессии обойтись.
DanDiablo вне форума Ответить с цитированием
Старый 18.04.2018, 13:20   #8
DanDiablo
Пользователь
 
Аватар для DanDiablo
 
Регистрация: 25.08.2015
Сообщений: 55
По умолчанию

Почти получилось, но почти не считается. Я как то в тупике.

Запихнул форму в php, ошибки заполнения формы появились.
Но прям сразу же, когда еще в форму курсор даже не поставил, не то что кнопу отправить нажать!

При обновлении страницы появляется данное сообщение:


Это получается, что форма уже как бы заполнена?

В этом виноват:
Код:
method="post" в форме?
Малость изменил код, что бы по умолчанию в переменные поставить пробел:

Цитата:
if (isset($_POST['name'])){
$name = trim($_POST['name']);
if(mb_strlen($name,'UTF-8') < 4){
$errors[] = 'Имя должно быть не меньше 4 букв!';
}
if ($name !== '' && !preg_match('/[^а-яА-ЯЁё\s]+/msi',$name)){
$errors[] = 'Имя должно быть русскими буквами!';
}
}else{
$name = '';
}
Не помогло...

Если фома с обработчиком в одном файле, то как правильно заполнить action=''?

В книге есть пример:

Код:
< form  method="POST"  action="$_SERVER[PHP_SELFJ "> 
Your  name :  <input  type="text"  name="my_name "> 
<br/> 
<input  type=" submit"  value=" Say  Hello"> 
</form>
Но
Код:
 $_SERVER[PHP_SELFJ не работает, фома ищет именно файл $_SERVER[PHP_SELFJ.
Думаю, php не совпадет.

Да, забыл добавить:

Цитата:
<?php
var_dump($errors, $send);die;
?>
Ломает страницу на мертво теперь, убрал пока что.

action пустым оставить?

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

Отправка все-таки не происходит.

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

Последний раз редактировалось DanDiablo; 18.04.2018 в 13:30.
DanDiablo вне форума Ответить с цитированием
Старый 18.04.2018, 13:27   #9
DanDiablo
Пользователь
 
Аватар для DanDiablo
 
Регистрация: 25.08.2015
Сообщений: 55
По умолчанию

Попытался обернут вот так, взял из похожего примера:

Код:
    $errors = [];
if (count($_POST)>0) {
    if (isset($_POST['name'])) {
        $name = trim($_POST['name']);
        if (mb_strlen($name, 'UTF-8') < 4) {
            $errors[] = 'Имя должно быть не меньше 4 букв!';
        }if ($name !== '' && !preg_match('/[^а-яА-ЯЁё\s]+/msi', $name)) {
            $errors[] = 'Имя должно быть русскими буквами!';
        }
    }

    if (isset($_POST['user_email'])) {
        $user_email = trim($_POST['user_email']);
        if ($user_email === '' || !preg_match('/^[a-zA-Z0-9_\-.]+@[a-zA-Z0-9\-]+\.[a-zA-Z0-9\-.]+s/', $user_email)) {
            $errors[] = 'Пожалуйста, введите почту!';
        }
    }

    if (isset($_POST['tema'])) {
        $tema = trim($_POST['tema']);
        if (!preg_match('/[^а-яА-ЯЁё\s]+/msi', $tema)) {
            $errors[] = 'Тема должна быть русскими буквами!';
        }
    }

    if (mb_strlen($tema, 'UTF-8') < 8) {
        $errors[] = 'Тема должна быть не меньше 8 букв!';
    }

    if (isset($_POST['text'])) {
        $text = trim($_POST['text']);
        if (mb_strlen($text, 'UTF-8') < 10) {
            $errors[] = 'Сообщение должно быть не меньше 10 букв!';
        }
    }

    if (isset($_POST['tel'])) {
        $tel = trim($_POST['tel']);
        if ($tel !== '' && !is_numeric($tel)) {
            $errors[] = 'Пожалуйста, введите телефон!';
        }
    }
}else{
    $name = '';
    $user_email = '';
    $tema = '';
    $text = '';
    $tel = '';
    $errors = [];

}
Не помогло... Куда то я не туда копаю...
DanDiablo вне форума Ответить с цитированием
Старый 18.04.2018, 13:37   #10
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

если обработчик тот же файл, то action надо оставить пустым.

вот простой пример (чужой)
поместите его в 1.php и вызовите
PHP код:
<?php
$opr 
= array('Молодец');
$one = array('Вы ошиблись');
$mvo = array(); // массив массивов, каждый из которых содержит ответ 1 или 0 и вопрос
$mvo[] = array(1,'Верите ли вы, что Сороконожка и тарантул являются ядовитыми насекомыми?');
$mvo[] = array(0,'Верите ли вы, что В России было два генералиссимуса: Суворов и Сталин?');
if (
count($_POST)) {
    
extract($_POST);
    
$oo $one;
    if (
$otvet==$mvo[$din][0]) $oo=$opr; else $oo=$one;
    
$di=mt_rand(0,count($oo)-1);
    echo 
$oo[$di];
    exit;
}
    
$din=mt_rand(0,count($mvo)-1);
?>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.js" type="text/javascript"></script>
<script>
$(document).ready(function() {
    $("#fnfm").submit(function(event){
        event.preventDefault();
    });
});
    function postda() {
$.post(
  "/1.php",
  {
    din: $("#din").val(),
    otvet: 1    
  },
  onAjaxSuccess
);
    }
    function postne() {
$.post(
  "/1.php",
  {
    din: $("#din").val(),
    otvet: 0
  },
  onAjaxSuccess
);
    }
    function onAjaxSuccess(data) {
$("#hahao").text(data);
    }
</script>
</script>
<form action="" method="post" id="fnfm">
<input type="hidden" name="din" id="din" value="<?php echo $din?>">
<?php
echo $mvo[$din][1];
?> 
<input type="submit" name="otvetda" value="Да" onclick="postda()">
<input type="submit" name="otvetne" value="Нет" onclick="postne()">
</form>
<div style="color:red" id="hahao"></div>
<br><a href="1.php">Еще раз задать вопрос?</a>
Цитата:
Сообщение от DanDiablo Посмотреть сообщение
Не помогло... Куда то я не туда копаю...
выложите ваш PHP файл с формой и обработчиком на PHP целиком.
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Отправка формы ts-alan ASP.NET 0 26.05.2015 21:21
Отправка формы userrrr PHP 52 28.12.2014 18:44
отправка формы weder PHP 4 02.05.2010 21:00
отправка формы L_M PHP 5 28.07.2009 12:01