Как принять 100 полей с данными 3-мя строчками кода?

Как принять кучу данных идущих из какой-либо формы Вашего сайта, и сделать это всего 3-мя строчками?
Будь то форма с регистрацией, где Вы используете 5-10 полей и потом их принимаете и совершаете какие-то действия, будь то 50, 100 полей от какой-нибудь анкеты, все равно принимать мы их будет 3-мя строчками. Конечно же используя фреймворк CodeIgniter.

Будем принимать данные POST в цикле.

Давайте рассмотрим пример:

Например, у Вас есть админка для Вашего сайта, и Вы с помощью ее добавляете новости. Чтобы добавить новость Вам нужно заполнить какое-то кол-во полей и потом их обработать и записать в базу данных.
Например, вот такая у нас форма:

<form method="post" action="">
    <label>Введите название новости:</label>
    <input type="text" name="title" /><br />

    <label>Введите автора:</label>
    <input type="text" name="author" /><br />

    <label>Введите дату публикации:</label>
    <input type="text" name="date" /><br />

    <label>Введите текст новости:</label>
    <textarea name="news_text"></textarea><br />

    <label>Введите краткое описание:</label>
    <textarea name="news_description"></textarea><br />

    <label>Введите ключевые слова:</label>
    <input type="text" name="meta_keywords" /><br />

    <label>Введите мета описание:</label>
    <input type="text" name="meta_description" /><br />

    <input type="submit" name="add" />
</form>

Как выглядел бы обычный прием данных с этих полей и занесение их в базу данных
Например вот так:

$add['title'] = $this->input->post('title');
$add['author'] = $this->input->post('author');
$add['date'] = $this->input->post('date');
$add['news_text'] = $this->input->post('news_text');
$add['news_description'] = $this->input->post('news_description');
$add['meta_keywords'] = $this->input->post('meta_keywords');
$add['meta_description'] = $this->input->post('meta_description');

$this->db->insert('news',$add);

То есть, создаем массив add, и в его элементы принимаем все поля из формы по очереди. После принятия, заносим все эти данные в базу данных в таблицу news.
Элементы массива add называются также как и поля формы и так же как и поля в таблице news. Это важно!

А теперь как же принимать все эти данные, как я обещал, 3-мя строчками?
Ну например, вот так:

foreach($_POST as $ArrKey => $ArrStr) {
   $add[$ArrKey] = $this->input->post($ArrKey);
}

И у нас получается, что мы проходим по всему массиву POST, в котором хранятся эти данные из полей. ArrKey — хранит в себе название поля. И каждый раз проходя по данному циклу, у нас создаются новые элементы массива add, в которые подставленны свои значения.
Но сейчас мы получим не 7 элементов массива add с нашими полями, а 8. Почему 8? 8-ой элемент будет наша кнопка submit с именем add. Вот такой у нас будет последний элемент:

$add['add'] = $this->input->post('add');

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

foreach($_POST as $ArrKey => $ArrStr) {
   $add[$ArrKey] = $this->input->post($ArrKey);
   if(isset($add['add'])) unset($add['add']);
}

И тогда все будет ок :)

Вот конечный результат:

foreach($_POST as $ArrKey => $ArrStr) {
   $add[$ArrKey] = $this->input->post($ArrKey);
   if(isset($add['add'])) unset($add['add']);
}
$this->db->insert('news',$add);

Вот таким не хитрым способом — принятие данных POST в цикле, можно хорошенько избавить себя от гемороя при принятии данных из каких-либо форм. В данном случае у нас всего 7 полей, а представьте если бы это было 20,30,50 полей и каждое поле прописывать отдельно :) А вот таким циклом, будь у Вас 100 полей, Вы примите успешно все данные.

Важно! Название элементов массива, полей из формы и название полей в таблице должны быть одинаковые! Только в этом случае Вы добьетесь автоматизации!

Конечно же этот способ можно использовать и в обычном PHP.

Если урок Вам был полезен, нажмите на любую кнопку ниже— буду благодарен :) Всем удачи и следите за ходом событий ;)

Комменты

  • Извините, а как же фильтрация/валидация?

  • Написал магазин по вашей методике-все заработало,кроме помещения данных из формы в базу.Сделал все по урокам,проверил код по примерам,пробовал материал этой статьи использовать-в результате именно данные покупателя(имя,фамилия,емейл и др.) из формы в базу не передаются,данные самого заказа+дата и время нормально пишутся в базу.Выдается ошибка неопределенных переменных:

    Notice: Undefined variable: name in D:\…\Shop\views\pages\order.php on line 61

    Notice: Undefined variable: s_name in D:\…\Shop\views\pages\order.php on line 61

    Notice: Undefined variable: address in D:\…\Shop\views\pages\order.php on line 61

    Notice: Undefined variable: post_index in D:\…\Shop\views\pages\order.php on line 61

    Notice: Undefined variable: email in D:\…\Shop\views\pages\order.php on line 61

    Notice: Undefined variable: name in D:\…\Shop\views\pages\order.php on line 61

    Notice: Undefined variable: s_name in D:\…\Shop\views\pages\order.php on line 61

    Notice: Undefined variable: address in D:\…\Shop\views\pages\order.php on line 61

    Notice: Undefined variable: post_index in D:\…\Shop\views\pages\order.php on line 61

    Notice: Undefined variable: email in D:\…\Shop\views\pages\order.php on line 61

    • Дмитрий Валак: 07-04-2014 в 6:50

      Попробуйте принять данные из формы простым способом. Т.е. вместо цикла foreach, примите данные так: $name= $_POST[‘name’]; и т.д.

  • Здравствуйте, Дмитрий!
    Ваш урок по написанию интернет магазина мне очень помог, огромное Вам спасибо! Во всем интернете не описано так подробно, как у Вас. Но у меня возникла проблема, никак не могу разобраться, как в конце, при оформлении заказа, не добавлять содержание корзины и данные клиента в БД, а отправлять мне на почту. Данные клиента приходят, а вот содержание корзины никак не отправляются :(

    • Дмитрий Валак: 07-04-2014 в 6:49

      Здравствуйте. Попробуйте принять данные из формы простым способом. Т.е. вместо цикла foreach, примите данные так: $name= $_POST[‘name’]; и т.д.

      • Так принимаются, но только один товар, а если их несколько, то не получается…

  • У меня код из курса webmaster:
    foreach ($_POST as $ArrKey => $ArrStr) {
    $ArrKey = $_POST[$ArrKey];
    }
    не работает. В конце концов заработало только так:
    foreach ($_POST as $key => $item) {
    $$key = $_POST[$key];
    }
    Вопрос: почему?
    Благодарю за ответ.

  • Здравствуйте, Коментарий «Конечно же этот способ можно использовать и в обычном PHP.» не подскажите как это можно реализовать на обычном php?

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

  • Здравствуйте Дмитрий! Ваш видеоурок по созданию интернет магазине очень мне помог, ну по крайнем мере наверное поможет, курсач сдаю). У меня вопрос по Оформлению заказа(данные не передаются в бд). Сюда я пишу по тому, что в видеоуроке вы брали пример отсюда, но всеравно у меня не работает, с чем это может быть связанно?

  • Но таким образом мы не сможем использовать валидацию данных.

  • скажите пожалуйста а как например добавить потом кроме нашей формы еще и информацию о количестве товара в корзине, его название, цену и занести в базу вместе с инфотрмациею формы?

  • Дмитрий, можете показать код функции inser() и db() как они оформлены в данном коде? Ато таким новичка, как я, некоторые моменты не понятны!

    • Дмитрий Валак: 26-02-2013 в 12:06

      insert и db это не отдельные функции. Это идет работа с классом db и его метод insert, который вставляет информацию в БД.

  • Интересно. А что в классе описано?

  • Доброго времени суток.
    а не подскажите как делать категорию с подкатегориями? и как выводить это все?!

    • Дмитрий Валак: 25-08-2012 в 16:22

      Здравствуйте.
      Ну так если на словах — то вам надо в БД в таблице, где у Вас пункты меню, добавить поле куда будете записывать родителя конкретного пункта меню.
      Сначала выводите в цикле основные пункты меню, которые без родителей. Потом вторым циклом, внутри этого основного цикла, выводите пункты меню, у которых есть родитель и соответствует основному пункту меню.
      Ну как-то так, так сложно написать, но если подумать реализовать это не сложно.

  • Добрый день, Дмитрий.
    Действительно, Сodeigniter + Ajax очень интересно. Если у Вас есть платные уроки на эту тему — готов купить.
    Респект за данный проект.
    Больших Вам успехов на этом поприще!

    • Дмитрий Валак: 20-08-2012 в 16:46

      Здравствуйте Дмитрий.
      Спасибо. К сожалению, пока с технологией Ajax я не очень знаком, поэтому и уроков на эту тему нет.

  • Хотілобся побачити відеоуроки Сodeigniter + Ajax

  • Можно и так решить :)
        foreach ($_POST as $ArrKey => $ArrStr)
        $add[$ArrKey] = $ArrStr;
        unset ($add['add']);
        $this->db->insert('news',$add);
     

  • Кстати чуть не забыл, есть даже решение в одну строку!