За последние 24 часа нас посетили 63063 программиста и 1742 робота. Сейчас ищут 1190 программистов ...

Передача $_POST по массиву.

Тема в разделе "PHP для новичков", создана пользователем Invision, 8 май 2011.

  1. Invision

    Invision Активный пользователь

    С нами с:
    26 фев 2009
    Сообщения:
    1.437
    Симпатии:
    1
    Адрес:
    Томск
    Честно надоело писать привычным для себя способом передавая имена input`ов в переменную, проверять их итд
    На работе используют Yii Framework, понравилась реализация =)

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

    p.s простая идея к примеру использовать класс для добавления данных в бд. думаю реализовать что то типо:
    array('news_name' => 'Заголовок', 'news_date' => '2010-05-08 12:23:42'); // массив с данными
    InsertPost($array); // функция или класс для отправки данных
    ну и ключи это имена столбцов в бд.
    Естественно все проверяется фильтруется внутри функции / класса, разрешены только перечисленные поля итд. вообщем я вижу такой способ приемлемым... Но хз правильный ли он...Или же классику запроса толкать и вату катать ):
     
  2. Alex_pac

    Alex_pac Активный пользователь

    С нами с:
    11 апр 2011
    Сообщения:
    285
    Симпатии:
    1
    Адрес:
    Россия, Тольятти
    этот способ неудобен из-за ассоциативности самого массива.

    каждый раз надо ставить ключи к массиву.

    с числовыми массивами дело както по-проще обстоит.

    и вообще зачем целый класс для такой узкой задачи?

    надо разделять классы для работы с данными и для создания интерфейса к базе данных.

    над последним упорно трудятся в этой теме
     
  3. Invision

    Invision Активный пользователь

    С нами с:
    26 фев 2009
    Сообщения:
    1.437
    Симпатии:
    1
    Адрес:
    Томск
    А мне не понравился класс, совсем не то... А что если ключи по массиву это заголовки input`ов, задаешь только правило какие ключи разрешить добавлять. Куда проще составление однообразных запросов INSERT ... итд. Просто массив, фильтр, проверка, отправка. Готов даже поспорить насчет неудобства... Задача состоит в быстрой отправки данных из форм и ничего больше)

    Вижу это так:

    <form>
    <input name="new_name" type="text" value="text">
    <input name="new_text" type="text" value="text1">
    <input name="new_text2" type="text" value="text2">
    <input type="submit" value="Отправить">
    </form>

    Разрешаю: $arr = array('new_name', 'new_text', 'new_text2');

    Database::insertForm($_POST);
    Database::formFilter($arr);

    внутри класса обращение функции formFilter к insertForm и еще примочки =) Если нужны дополнительные атрибуты также отдельно вносить) хотя сейчас я расписал это и смотрится скорее всего как извращение, но оптимизировать то можно :)
     
  4. Invision

    Invision Активный пользователь

    С нами с:
    26 фев 2009
    Сообщения:
    1.437
    Симпатии:
    1
    Адрес:
    Томск
    Вот начертил сие чудо чтобы было понятно :)


    PHP:
    1. class Database {
    2.  
    3.     protected static $_filterForm = array();
    4.  
    5.     public static function validateForm($arr) {
    6.         return self::$_filterForm = $arr;
    7.     }
    8.  
    9.     public static function InsertForm($post) {
    10.        
    11.         foreach (self::$_filterForm as $k) {
    12.             if (!isset($post[$k])) {
    13.                 return false;
    14.             }
    15.         }
    16.        
    17.         return true;
    18.     }
    19.  
    20. }
    Работает проверка так:

    PHP:
    1. $arr = array('name1', 'name2');
    2. Database::validateForm($arr);
    3. Database::InsertForm($_POST);
    Дело за малым идея пошла в гору) Результат выложу скоро, жду критику)
     
  5. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    это куплеты из разных опер.
    Database делает sql-запросы, Validator (отдельный класс) проверяет формы.
     
  6. Alex_pac

    Alex_pac Активный пользователь

    С нами с:
    11 апр 2011
    Сообщения:
    285
    Симпатии:
    1
    Адрес:
    Россия, Тольятти
    Концепция MYSQL->INSERT FUNCTION

    DB::insert ($tableParams, $rows)

    PHP:
    1. <?php
    2.  
    3. /* одна строчка */
    4.  
    5. DB::insert ('`table` (`id`, `name`, `text`, `text2`)', array(
    6.     0, $_POST['new_name'], $_POST['new_text'], $_POST['new_text2']
    7. ));
    8.  
    9. /* много строчек в таблицу */
    10.  
    11. DB::insert ('`table` (`id`, `name`, `text`, `text2`)', array(
    12.     0, $_POST['new_name'], $_POST['new_text'], $_POST['new_text2'],
    13.     0, $_POST['new_name01'], $_POST['new_text01'], $_POST['new_text201']
    14. ));
    15.  
    16. /* много строчек в таблицу  текстовые параметры*/
    17.  
    18. DB::insert ('`table` (`id`, `name`, `text`, `text2`)', array(
    19.     0, 'новое имя 1', 'Новое описание 1', 'Новое сообщение 1',
    20.     0, 'новое имя 2', 'Новое описание 2', 'Новое сообщение 2'
    21. ));
    22.  
    23. /* id как поле по-умолчанию упоминание не требует */
    24.  
    25. DB::insert ('`table` (`name`, `text`, `text2`)', array(
    26.      'новое имя 1', 'Новое описание 1', 'Новое сообщение 1',
    27.      'новое имя 2', 'Новое описание 2', 'Новое сообщение 2'
    28. ));
    29.  
    30.  
    массив одномерный разбирается внутри функции на нужное колво строчек которое вычисляется по количеству запятых в параметре $tableParams

    все элементы массива проходят фильтр mysql_real_escape_string

    результатом работы функции будет конструирование и запуск запроса по формуле

    [sql]INSERT INTO $tableParams VALUES ( 'value1', 'value2', 'value3'), .... ( 'value1', 'value2', 'value3');[/sql]
     
  7. Invision

    Invision Активный пользователь

    С нами с:
    26 фев 2009
    Сообщения:
    1.437
    Симпатии:
    1
    Адрес:
    Томск
    Ок что если все отбросить и мне нужен тупо класс для работы с формами. потянет? Не расчитывая на замудренные запросы и другую лабуду
     
  8. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Идея хранить правила ввиде функций и применять их рекурсивно:
    PHP:
    1. <?php
    2. $cRules = array(
    3.      'login' => array('strlen($f) > 3 && strlen($f) < 16', 'htmlspecialchars($f) == $f'),
    4.      'password' => array('$f == preg_replace ("/[^\w\d\s_]*/","",$f)')
    5. );
    6. foreach ($cRules as $field=>$rules) {
    7.      foreach ($rules as $rule) {
    8.           $fn = create_function('$f', 'return (bool)('.$rule.');');
    9.           if ($fn($_POST[$field]) == false) {
    10.                echo $field, ' is wrong!';
    11.           }
    12.      }
    13. }
    в 5.3 можно лямбдой сделать
     
  9. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Т.е. таким образом мы избегаем плодить кучу if'ов, и если добавить ключи к правилам, можем знать, каким именно правилам не соответствует поле (типа lenght или html например).
     
  10. Invision

    Invision Активный пользователь

    С нами с:
    26 фев 2009
    Сообщения:
    1.437
    Симпатии:
    1
    Адрес:
    Томск
    хз говнокод написал или нет но вот вам кусок:



    PHP:
    1. <?php
    2.  
    3. class FormDatabase {
    4.  
    5.     protected static $_allowedName = array();
    6.     protected static $_formData = array();
    7.  
    8.     public static function getForm($post) {
    9.         return self::$_formData = $post;
    10.     }
    11.  
    12.     public static function allowedNameForm($arr) {
    13.         return self::$_allowedName = $arr;
    14.     }
    15.    
    16.     public static function checkNameForm() {
    17.         foreach (self::$_allowedName as $k) {
    18.             if (!isset(self::$_formData[$k])) {
    19.                 return false;
    20.             }
    21.         }
    22.         return true;
    23.     }
    24.    
    25.     public static function InsertForm($table) {
    26.         if(self::checkNameForm() == true) {
    27.             $value =  implode(', ', self::$_formData);
    28.             $colum =  implode(', ', self::$_allowedName);
    29.  
    30.             echo ("INSERT INTO $table ($colum) VALUES ($value)"); // тут будет формироваться запрос
    31.         }
    32.  
    33.        
    34.     }
    35.  
    36. }
    37.  
    38. ?>
    Вызываю так:


    PHP:
    1. FormDatabase::allowedNameForm(array('name1', 'name2')); // список разрешенных имен input`ов
    2. FormDatabase::getForm($_POST); // получаем результат из $_POST
    3. FormDatabase::InsertForm('test'); // передаем имя таблицы и отправляем данные в базу.
    По поводу InsertForm не совсем уверен, правильно ли разбиваю данные ключей и содержимое ключей. По эху просто вывел как будет запрос смотреться, вроде то что я и хотел :)

    Можно конечно помудрить и сделать все попроще отправив вида:

    FormDatabase::InsertForm($array_list, $_POST, 'test'); где уже все включено..
     
  11. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
  12. Invision

    Invision Активный пользователь

    С нами с:
    26 фев 2009
    Сообщения:
    1.437
    Симпатии:
    1
    Адрес:
    Томск
    блиа мой код = ржавый велосипед :)
     
  13. Invision

    Invision Активный пользователь

    С нами с:
    26 фев 2009
    Сообщения:
    1.437
    Симпатии:
    1
    Адрес:
    Томск
    А что если я хочу отказаться от всяких там ActiveRecord и пойти по другой тропе?)) Ребят ну мб кто то поддержит?)))

    т.к я учусь ремеслу программирования, хочется слепить свое и юзать, потом переписать поняв ошибки и опять... на готовом херня получится, вот по этому и спрашиваю, такое код для частного использования потянет? выполнив задачу только: проверить -> добавить
    Я ведь не пытаюсь написать сложную систему для работы с базой данных, в заголовке темы писал, просто взять -> проверить -> добавить.