Обработчик php формы?

287
22 января 2018, 09:05

Есть форма, не могу понять как написать форму... Помогите пожалуйста

<form method="GET" action="#">
<input class="form-control" name="names" type="text" style="width:300px;" placeholder="Введите ваше имя">
<input class="form-control" type="text" name="email" style="width:300px;" placeholder="Ваш e-mail">
<div id="parentId">
    <div>
        <nobr>
            <input class="form-control" name="name[1]" type="text" style="width:300px;" placeholder="Название товара" />
            <input class="form-control" name="link[1]" type="text" style="width:300px;" placeholder="Ссылка на товар" />
            <input class="form-control" name="color[1]" type="text" style="width:300px;" placeholder="Цвет" />
            <input class="form-control" name="size[1]" type="text" style="width:300px;" placeholder="Размер товара" />
            <input class="form-control" name="price[1]" type="text" style="width:300px;" placeholder="Цена товара" />
            <input class="form-control" name="quantity[1]" type="text" style="width:300px;" placeholder="Количество" />
            <a class="btn btn-danger" onclick="return deleteField(this)" href="#">Удалить товар</a>
            <a class="btn btn-success" onclick="return addField()" href="#">Добавить товар</a>
        </nobr>
    </div>
</div>
<textarea class="form-control" name="textarea" cols="30" rows="10" style="width:300px;" placeholder="Например: если не будет размера 10, можно взять на размер больше."></textarea>
<input class="btn btn-primary" type="submit" value="Отправить" />
</form>
<script>
    var countOfFields = 1; // Текущее число полей
    var curFieldNameId = 1; // Уникальное значение для атрибута name
    var maxFieldLimit = 25; // Максимальное число возможных полей
    function deleteField(a) {
        if (countOfFields > 1) {
            // Получаем доступ к ДИВу, содержащему поле
            var contDiv = a.parentNode;
            // Удаляем этот ДИВ из DOM-дерева
            contDiv.parentNode.removeChild(contDiv);
            // Уменьшаем значение текущего числа полей
            countOfFields--;
        }
        // Возвращаем false, чтобы не было перехода по сслыке
        return false;
    }
    function addField() {
        // Проверяем, не достигло ли число полей максимума
        if (countOfFields >= maxFieldLimit) {
            alert("Число полей достигло своего максимума = " + maxFieldLimit);
            return false;
        }
        // Увеличиваем текущее значение числа полей
        countOfFields++;
        // Увеличиваем ID
        curFieldNameId++;
        // Создаем элемент ДИВ
        var div = document.createElement("div");
        // Добавляем HTML-контент с пом. свойства innerHTML
        div.innerHTML = "<nobr><input class=\"form-control\" name=\"name[" + curFieldNameId + "]\" type=\"text\" style=\"width:300px;\" placeholder=\"Название товара\"/> <input class=\"form-control\" name=\"link[" + curFieldNameId + "]\" type=\"text\" style=\"width:300px;\" placeholder=\"Ссылка на товар\"/>  <input class=\"form-control\" name=\"color[" + curFieldNameId + "]\" type=\"text\" style=\"width:300px;\" placeholder=\"Цвет\"/>  <input class=\"form-control\" name=\"size[" + curFieldNameId + "]\" type=\"text\" style=\"width:300px;\" placeholder=\"Размер товара\"/> <input class=\"form-control\" name=\"price[" + curFieldNameId + "]\" type=\"text\" style=\"width:300px;\" placeholder=\"Цена товара\"/> <input class=\"form-control\" name=\"quantity[" + curFieldNameId + "]\" type=\"text\" style=\"width:300px;\" placeholder=\"Количество\"/> <a class=\"btn btn-danger\" onclick=\"return deleteField(this)\" href=\"#\">Удалить товар</a> <a class=\"btn btn-success\" onclick=\"return addField()\" href=\"#\">Добавить товар</a></nobr>";
        // Добавляем новый узел в конец списка полей
        document.getElementById("parentId").appendChild(div);
        // Возвращаем false, чтобы не было перехода по сслыке
        return false;
    }
</script>

Сам обработтчик https://yadi.sk/d/g69DrsEA3RcY6y

<?php
$_SERVER['debug'] = true;
   $back = "<p><a href=\"javascript: history.back()\">Вернуться назад</a></p>";
   if(!empty($_POST['name']) and !empty($_POST['color']) and !empty($_POST['link']) 
   and !empty($_POST['quantity'])){
      $name = trim(strip_tags($_POST['name[]']));
      $link = trim(strip_tags($_POST['link[]']));
      $color = trim(strip_tags($_POST['color[]']));
      $size = trim(strip_tags($_POST['size[]']));
      $price = trim(strip_tags($_POST['price[]']));
      $quantity = trim(strip_tags($_POST['quantity[]']));
      $textarea = trim(strip_tags($_POST['textarea']));
      mail('never3d22@gmail.com', 'Письмо с адрес_вашего_сайта', 
      'Имя покупателя: '.$name.'<br />Ссылка на товар: '.$link.'<br />Цвет товара: '.$color.'<br />
      Размер: '.$size.' <br />Количество: '.$quantity.' <br />Сообщение '.$textarea,"Content-type:text/html;charset=windows-1251");
      echo "Ваше сообщение успешно отправлено!<Br> Вы получите ответ в 
      ближайшее время<Br> $back";
      exit;
   } 
   else {
      echo "Для отправки сообщения заполните все поля! $back";
      exit;
   }
?>
Answer 1

В вашем обработчике вы, используете метод POST, а в форме пишете method="GET" - по этому и не работает, напишите method="POST" и все заработает.
По поводу action - по сути его можно не указывать и не писать вообще, если обработчик будет на этой же странице, где и форма или запрос будет отправляться через AJAX.
Иначе, нужно обязательно указывать путь до обработчика.

Но проблема кроется в другом, вы передаете в input массив название[] и в $_POST придет массив с опять-же, массивами: name, link, color, size, price, quantity и т.д..

Для использования этих массивов нужно обращаться к пост так:

$name = $_POST['name']; 

Это массив с именами, если сделать дамп:

var_dump($name);

Нам вернет

array(2) {
   [1]=> string(1) "1" 
   [2]=> string(1) "2"
}

Следовательно и обращаться нужно как $name[1], $name[2]: Либо воспользоваться функцией join или implode - для склеивания массива в строку, данная функция за нас собирает массив в строку, через указанный разделитель первым агрументом (параметром) функции join или implode то -есть так:

join(' ',$name);

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

Иначе воспользоваться циклом foreach и используя конкатенацию . склеить все значения в переменную.

Answer 2

http://php.net/manual/ru/language.variables.external.php

Думаю проблема в том, что action="#" не верно указан

READ ALSO
PHP - FILTER_SANITIZE_FULL_SPECIAL_CHARS и амперсанд

PHP - FILTER_SANITIZE_FULL_SPECIAL_CHARS и амперсанд

Привет! В документации php заявлено, что фильтр FILTER_SANITIZE_FULL_SPECIAL_CHARS эквивалентен вызову htmlspecialchars(), но по факту данный фильтр не экранирует амперсанд,...

227
Как установить icu and intl?

Как установить icu and intl?

Нужна помощьНе могу установить пакеты для работы с фреймворком

231
Функция mail не отправляет письмо

Функция mail не отправляет письмо

Здравствуйте, есть функция:

242