Честно надоело писать привычным для себя способом передавая имена input`ов в переменную, проверять их итд На работе используют Yii Framework, понравилась реализация =) Подумываю также отправлять данные по массиву и уже работать с его ключами, но всегда терзают смутные сомнения что получится не то что я ожидаю) По этому я решил прибегнуть старой методики побеседовать на этом форуме, мб есть уже реализация, просто глянуть глазком что да как работает) p.s простая идея к примеру использовать класс для добавления данных в бд. думаю реализовать что то типо: array('news_name' => 'Заголовок', 'news_date' => '2010-05-08 12:23:42'); // массив с данными InsertPost($array); // функция или класс для отправки данных ну и ключи это имена столбцов в бд. Естественно все проверяется фильтруется внутри функции / класса, разрешены только перечисленные поля итд. вообщем я вижу такой способ приемлемым... Но хз правильный ли он...Или же классику запроса толкать и вату катать ):
этот способ неудобен из-за ассоциативности самого массива. каждый раз надо ставить ключи к массиву. с числовыми массивами дело както по-проще обстоит. и вообще зачем целый класс для такой узкой задачи? надо разделять классы для работы с данными и для создания интерфейса к базе данных. над последним упорно трудятся в этой теме
А мне не понравился класс, совсем не то... А что если ключи по массиву это заголовки 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 и еще примочки =) Если нужны дополнительные атрибуты также отдельно вносить) хотя сейчас я расписал это и смотрится скорее всего как извращение, но оптимизировать то можно
Вот начертил сие чудо чтобы было понятно PHP: class Database { protected static $_filterForm = array(); public static function validateForm($arr) { return self::$_filterForm = $arr; } public static function InsertForm($post) { foreach (self::$_filterForm as $k) { if (!isset($post[$k])) { return false; } } return true; } } Работает проверка так: PHP: $arr = array('name1', 'name2'); Database::validateForm($arr); Database::InsertForm($_POST); Дело за малым идея пошла в гору) Результат выложу скоро, жду критику)
это куплеты из разных опер. Database делает sql-запросы, Validator (отдельный класс) проверяет формы.
Концепция MYSQL->INSERT FUNCTION DB::insert ($tableParams, $rows) PHP: <?php /* одна строчка */ DB::insert ('`table` (`id`, `name`, `text`, `text2`)', array( 0, $_POST['new_name'], $_POST['new_text'], $_POST['new_text2'] )); /* много строчек в таблицу */ DB::insert ('`table` (`id`, `name`, `text`, `text2`)', array( 0, $_POST['new_name'], $_POST['new_text'], $_POST['new_text2'], 0, $_POST['new_name01'], $_POST['new_text01'], $_POST['new_text201'] )); /* много строчек в таблицу текстовые параметры*/ DB::insert ('`table` (`id`, `name`, `text`, `text2`)', array( 0, 'новое имя 1', 'Новое описание 1', 'Новое сообщение 1', 0, 'новое имя 2', 'Новое описание 2', 'Новое сообщение 2' )); /* id как поле по-умолчанию упоминание не требует */ DB::insert ('`table` (`name`, `text`, `text2`)', array( 'новое имя 1', 'Новое описание 1', 'Новое сообщение 1', 'новое имя 2', 'Новое описание 2', 'Новое сообщение 2' )); массив одномерный разбирается внутри функции на нужное колво строчек которое вычисляется по количеству запятых в параметре $tableParams все элементы массива проходят фильтр mysql_real_escape_string результатом работы функции будет конструирование и запуск запроса по формуле [sql]INSERT INTO $tableParams VALUES ( 'value1', 'value2', 'value3'), .... ( 'value1', 'value2', 'value3');[/sql]
Ок что если все отбросить и мне нужен тупо класс для работы с формами. потянет? Не расчитывая на замудренные запросы и другую лабуду
Идея хранить правила ввиде функций и применять их рекурсивно: PHP: <?php $cRules = array( 'login' => array('strlen($f) > 3 && strlen($f) < 16', 'htmlspecialchars($f) == $f'), 'password' => array('$f == preg_replace ("/[^\w\d\s_]*/","",$f)') ); foreach ($cRules as $field=>$rules) { foreach ($rules as $rule) { $fn = create_function('$f', 'return (bool)('.$rule.');'); if ($fn($_POST[$field]) == false) { echo $field, ' is wrong!'; } } } в 5.3 можно лямбдой сделать
Т.е. таким образом мы избегаем плодить кучу if'ов, и если добавить ключи к правилам, можем знать, каким именно правилам не соответствует поле (типа lenght или html например).
хз говнокод написал или нет но вот вам кусок: PHP: <?php class FormDatabase { protected static $_allowedName = array(); protected static $_formData = array(); public static function getForm($post) { return self::$_formData = $post; } public static function allowedNameForm($arr) { return self::$_allowedName = $arr; } public static function checkNameForm() { foreach (self::$_allowedName as $k) { if (!isset(self::$_formData[$k])) { return false; } } return true; } public static function InsertForm($table) { if(self::checkNameForm() == true) { $value = implode(', ', self::$_formData); $colum = implode(', ', self::$_allowedName); echo ("INSERT INTO $table ($colum) VALUES ($value)"); // тут будет формироваться запрос } } } ?> Вызываю так: PHP: FormDatabase::allowedNameForm(array('name1', 'name2')); // список разрешенных имен input`ов FormDatabase::getForm($_POST); // получаем результат из $_POST FormDatabase::InsertForm('test'); // передаем имя таблицы и отправляем данные в базу. По поводу InsertForm не совсем уверен, правильно ли разбиваю данные ключей и содержимое ключей. По эху просто вывел как будет запрос смотреться, вроде то что я и хотел Можно конечно помудрить и сделать все попроще отправив вида: FormDatabase::InsertForm($array_list, $_POST, 'test'); где уже все включено..
А что если я хочу отказаться от всяких там ActiveRecord и пойти по другой тропе?)) Ребят ну мб кто то поддержит?))) т.к я учусь ремеслу программирования, хочется слепить свое и юзать, потом переписать поняв ошибки и опять... на готовом херня получится, вот по этому и спрашиваю, такое код для частного использования потянет? выполнив задачу только: проверить -> добавить Я ведь не пытаюсь написать сложную систему для работы с базой данных, в заголовке темы писал, просто взять -> проверить -> добавить.