[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Универсальный обработчик $_POST
m4a1fox
Доброго всем дня аль вечера. Собственно так как я только начинаю копаться в ООП, вот стало интересно! Наверно у многих (но у меня точно) самое большое затруднение в ООП вызывает форма. Обработка ее, проверка на пустоту, добавление в БД значений и так далее, что еще может быть только с формой. Так вот собственно вопрос. Чисто интересно, есть ли такой или возможно написать класс для работы с формой таким образом что бы он делал все выше перечисленное на полном автомате, то есть, что я хочу сказать, если есть такой класс и есть некая форма, то реально ли добавить только один дополнительный include в саму форму а класс его так же будет обрабатывать... То есть что бы класс был универсален? Спасибо за ответы!



Спустя 3 минуты, 21 секунда (24.07.2011 - 15:59) bulgakov написал(а):
Ммм... немного расплывчатый вопрос, что ты хочеш делать с данными пришедшими из формы? Работа с базами данных? mysqli, pdo. Проверки на пустоту и прочее тучи функций есть, что сложного принять данные из формы, проверить и присвоить их переменной? Не понимаю... И при чем тут ООП?

Спустя 1 минута, 34 секунды (24.07.2011 - 16:01) ADiel написал(а):
Какая же у меня мания оптимизации =)
Цитата
Доброго всем дня аль вечера

Заменить на
Цитата
Доброго времени суток

biggrin.gif

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

В классе можно реализовать примерно эти методы: http://php.spb.ru/php/regexp.html

Спустя 7 минут, 1 секунда (24.07.2011 - 16:08) m4a1fox написал(а):
bulgakov
Что я имею ввиду, вот есть класс обработки данных из формы (допустим 3 поля)
Как это выглядит у меня (напомню я только начинаю учить ООП)

function __construct($name, $pass) {
$this->name = !empty($name)?mysql_real_escape_string($name):NULL;
$this->pass = !empty($pass)?mysql_real_escape_string($pass):NULL;
$this->encode = !empty($pass)?md5($pass):NULL;
}

И заносим это в БД

function insert_user() {
$sql = "INSERT INTO `".self::$table."` SET
`name` = '"
.$this->clean_text($this->name)."',
`pass` = '"
.$this->clean_text($this->pass)."',
`encode` = '"
.$this->encode."'
"
;
return connect_Db::sql($sql);
}


Вот! То есть ели я захочу добавить еще одно поле например - email, то мне придется вручную переписать кусок класса, то есть нужно будет что бы уже методвы были вот такие

function __construct($name, $pass, $email) {
$this->name = !empty($name)?mysql_real_escape_string($name):NULL;
[
b]$this->email = !empty($email)?mysql_real_escape_string($email):NULL;[/b]
$this->pass = !empty($pass)?mysql_real_escape_string($pass):NULL;
$this->encode = !empty($pass)?md5($pass):NULL;
}
и другой метод соответственно -

function insert_user() {
$sql = "INSERT INTO `".self::$table."` SET
`name` = '"
.$this->clean_text($this->name)."',
`pass` = '"
.$this->clean_text($this->pass)."',
`encode` = '"
.$this->encode."',
`email` = '"
.$this->email."'
";
return connect_Db::sql($sql);
}

Так же?
А мне интересно реально ли написать класс кот. бы сам все это делал! А мне осталось бы только вставить в форму новый input.

Спустя 3 минуты, 53 секунды (24.07.2011 - 16:11) ADiel написал(а):
Для этого и нужны модели в MVC. В модели мы можем описать правила для var, а в шаблоне сделать просто
$model = new Model;
echo CHtml::textField($model->var);

(пример для YiiFramework)

Т.е. здесь присутствует модель, объект модели с предопределнными правилами проверки перед отправкой, генератор html полей формы

Спустя 5 минут, 36 секунд (24.07.2011 - 16:17) m4a1fox написал(а):
ADiel
Хм... MVC - говорите. Но мне кажется не в этом дело. Я то пока что работаю только с одним классом и одной формой... Хотя даже если и MVC то как класс должен выгдядеть. Я думаю что тут необходимы переворачивать массивы и разбираться с $_POST.

Спустя 5 минут, 29 секунд (24.07.2011 - 16:23) ADiel написал(а):
Ну здесь уже не один класс. Должен быть контроллер как минимум, библиотека правил, сама модель, обработчик, класс работы с базой данных... По сути изобретение фреймворка, велосипедFramework =)

Я бы не стал писать в бд все, что приходит постом. Нужно делать какой то паттерн входящих данных.

А поля лучше делать массивом, например
<input type = "text" name = "loginform[password]" />
<input type = "text" name = "loginform[login]" />

И получим на входе массив $_POST['loginform'], а если тправляем сразу несколько форм, или сохранем несколько моделей в одной форме, будет очень удобно.

Спустя 9 минут, 53 секунды (24.07.2011 - 16:32) m4a1fox написал(а):
ADiel
Ну и ладно! Часика полтора у меня есть, все равно отдыхаю, почему бы не побезобразничать. Значица так. Что касается обработки. Начало (только не ржать)

public $key;

public function __construct($post){
foreach ($post as $key=>$value){
$this->key[$key] = !empty($value)?$value:NULL;
}
}


Спустя 3 минуты, 2 секунды (24.07.2011 - 16:35) Guest написал(а):
Количество сайтов в сети растёт в геометрической прогрессии и некоторые программисты удивляются, почему потратив столько времени и гордясь тем что сайт работает по принципу MVC и код круче крутого уокера. Но однако нисмотря на силы, вложенные в раскрутку, нет посещаемости, ведь столько сил потрачено на написание удобной формы регистрации причём на ajax с подтверждением по почте. Вот тут и есть корень зла. А зачем мне, ленивому пользователю регистрироваться если на следующей ссылке в гугле я получу всё, что мне нужно без всякого напряга.
Однако новички, с бараньим упорством, продолжают лепить формы регистрации, а тот главный вопрос - для кого сделан сайт, для себя или для пользователя, даже не возникает.
Есть много способов решить проблемму без всяких напрягов пользователя, но то ли фантазии не хватает, то ли эго мешает.
Это ИМХО и сорри если оффтоп.

Спустя 2 минуты, 1 секунда (24.07.2011 - 16:37) ADiel написал(а):
А если массив? Добавь is_array и рекурсию
Guest, Конечно оффтоп! Мы тут над хорошей вещью думаем, а ты влез не по теме.
m4a1fox, отключи возможность писать гостям в теме =)

Кстати, зачем нам нужны пустыен значения, может просто не добавлять их в массив класса? И я не думаю, что в $this->key будут ключи. Может data назвать его или еще как?

Спустя 2 минуты, 42 секунды (24.07.2011 - 16:40) m4a1fox написал(а):
Гостю - а если это форма для добавления новости в админке???? Я же писал в начале, форма - всему голова biggrin.gif
ADiel
Цитата
Добавь is_array и рекурсию

А конкретнее?

Спустя 40 секунд (24.07.2011 - 16:41) m4a1fox написал(а):
Цитата
отключи возможность писать гостям в теме

Ни знаю как!!! sad.gif

Спустя 1 минута, 55 секунд (24.07.2011 - 16:43) m4a1fox написал(а):
Ладно! Собственно как буду мучаться... Вот метод

public $key;
public $error = '<font color=red>Some errors isset</font>';

public function __construct($post){
foreach ($post as $key=>$value){
if(!empty($value)){
$this->key[$key] = !empty($value)?$value:NULL;
}else{
return $this->error;
}

}
}

function Show(){
return $this->key;
}
}

$ex = new Experement($_POST);


И теперь форма

echo $ex->__construct($_POST);
print_r($ex->Show());

?>
<form action="" method="post">
<
input name="name" type="text" />
<
input name="text" type="text" />
<
input type="submit" name="send" />
</
form>

Вот теперь сколько бы не добавлял input'ов в массиве они все равно будут!!!

Спустя 2 минуты, 11 секунд (24.07.2011 - 16:45) ADiel написал(а):
Вот проверка и возвращение многомерного массива.
Если массив должен быть одномерным, можно убрать
$data[$key] = $this->verifyArr($value);






class Example
{

public $key = array();

function __construct($post){
$this->key = $this->verifyArr($post);
}

private function verifyArr($arr) {
$data = array();
foreach ($arr as $key=>$value) {
if (is_array($value))
$data[$key] = $this->verifyArr($value);
else
$data[$key] = !empty($value)?$value:NULL;
}
return $data;
}


}


$array = new Example($_POST);

var_dump($array->key);


Спустя 6 минут, 41 секунда (24.07.2011 - 16:52) m4a1fox написал(а):
ADiel
Хорошо! Это как бы понятно.... а дальше гораздо интереснее.... Как занести все это в БД????
Прикиним -

public function Insert(){
$sql = "INSERT INTO `".self::$table."`
SET `"
.(вот тут первые значения массива)."` = '".(вот тут второе значение)."'
"
;
echo $sql;
}

И по окончанию, кол-ва значений в массиве - это должно останавливаться.... ))))
Мдя.... написал аж сам растроился... По ходу это - нереально!

Спустя 1 минута, 41 секунда (24.07.2011 - 16:53) ADiel написал(а):
Рано сдаешься. Реально.
Небезопасно так сразу писать в бд. Нужно писать правила проверки для полей ИМХО

Тут к нам на помощь приходят паттерны таблицы.
т.е. мы пишем в бд только то, что предопределено в самой таблице. Так же в verifyArr лучше сделать экранирование кавычек для предотвращение sql инъекций

Спустя 1 минута, 28 секунд (24.07.2011 - 16:55) m4a1fox написал(а):
ADiel
Ща сделам! Вот так

public function Insert(){
$sql = "INSERT INTO `".self::$table."`";
$tree = $this->key;
foreach($tree as $key=>$value){
$sql .= '"'.$key.'" = "'.$value.'",';
}

echo $sql;
}

Гляньте а?! А я курить! :)

Спустя 1 минута, 54 секунды (24.07.2011 - 16:57) ADiel написал(а):
ну если о безопасности не задумываться совсем, то да.
Только опять же... is_array.
Пример если массив, пишем в другую таблицу.. Уже реляционность получается =)

Спустя 3 минуты, 17 секунд (24.07.2011 - 17:00) m4a1fox написал(а):
Только есть одна проблема - с запятой в самом конце. И да, пока что совсем не думаю о безопасности!

Спустя 5 минут, 24 секунды (24.07.2011 - 17:05) ADiel написал(а):
/**
*
@packade Велосипед 0.0.0.1а
*/

$tmp = array();
foreach($tree as $key=>$value){
$tmp[]= '"'.$key.'" = "'.$value.'"';
}
$sql = implode(",",$tmp);


Логичнее разделить на класс проверок и конструктор sql запросов


$tree = $this->key; не стоит делать. Мы копируем массив, следовательно умножаем количество памяти, занятой $this->key на 2

Конструктор запросов будет выглядеть идеально так:
$sql = new Constructor("tablename");
$sql->command = "INSERT";
$sql->values($array);
$sql->insert($limit);

Спустя 5 минут, 27 секунд (24.07.2011 - 17:11) m4a1fox написал(а):
ADiel
Давай те не забывать что еще есть и send(submit)

public function Insert(){
$sql = "INSERT INTO `".self::$table."` SET ";
$tree = $this->key;
foreach($tree as $key=>$value){
if($key != 'send'){
$sql .= "`".$key."` = '".$value."', ";
}
}

echo $sql;
}

Вот как тут заменить???

P.S Прикололо

/**
*
@packade Велосипед 0.0.0.1а
*/


Так же сделаю )

Спустя 1 минута, 17 секунд (24.07.2011 - 17:12) ADiel написал(а):
Я ошибку допустил сначала. Посмотри мой пост

Спустя 5 минут, 3 секунды (24.07.2011 - 17:17) m4a1fox написал(а):
Что-то с implode у меня не ладится!

Спустя 42 секунды (24.07.2011 - 17:18) ADiel написал(а):
Что не так?
Посмотри еще раз на пост. я там правил код. Сначала была ошибка

Спустя 3 минуты, 30 секунд (24.07.2011 - 17:21) m4a1fox написал(а):
Вроде получилось с implode

public function Insert(){
$sql = "INSERT INTO `".self::$table."` SET ";
$tmp = array();
$tree = $this->key;
foreach($tree as $key=>$value){
if($key != 'send'){
$tmp[] = "`".$key."` = '".$value."'";
}
}

$sql .= implode(", ",$tmp);
return $sql;
}


Спустя 3 минуты, 8 секунд (24.07.2011 - 17:24) ADiel написал(а):
Вот пишу код, правлю, а потом школота в плохом смысле этого слова, прашивает, почему за них код никто не пишет =)

Ответ очевиден, я думаю, сорри за оффтоп

Спустя 3 минуты, 38 секунд (24.07.2011 - 17:28) m4a1fox написал(а):
ADiel
Это где такое, а то я могу и на свой счет это записать! biggrin.gif

Спустя 8 минут, 27 секунд (24.07.2011 - 17:37) ADiel написал(а):
Везде. Дают весь код в тегах CODE без разметки вперемешку с html и пишут, типа мне нужно сюда добавить rand(1, 10) функций

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

Дальше по теме что?

Спустя 11 минут, 28 секунд (24.07.2011 - 17:48) m4a1fox написал(а):
ADiel
Цитата
Дальше по теме что?

Вот такой бок вылезает! Если значения пусты, и нажать отправить то вот это выходит на экран

Warning: Invalid argument supplied for foreach() in Y:\home\localhost\www\oop\class\class.experement.php on line 47
INSERT INTO `experement` SET

Смотрим 47 строчку и что мы видим

public function Insert(){
$sql = "INSERT INTO `".self::$table."` SET ";
$tmp = array();
$tree = $this->key;
--
foreach($tree as $key=>$value){--
if($key != 'send'){
$tmp[] = "`".$key."` = '".$value."'";
}
}

$sql .= implode(", ",$tmp);
echo $sql;
//return connect_Db::sql($sql);
}

выделил двойным тире с обоих сторон. То есть если массив пуст - то естественно ошибка. Вот метод для проверки

public function __construct($post){
foreach ($post as $key=>$value){
if(!empty($value)){
$this->key[$key] = !empty($value)?$value:NULL;
}else{
return $this->error;
}

}
}


Спустя 2 минуты, 14 секунд (24.07.2011 - 17:50) m4a1fox написал(а):
Вот так ошибка ушла и вроде все заработало

public function __construct($post){
foreach ($post as $key=>$value){
if(!empty($value)){
$this->key[$key] = !empty($value)?$value:NULL;
}else{
return $this->error;
}

}

[b]return true;[/b]
}

Спустя 3 минуты, 6 секунд (24.07.2011 - 17:53) m4a1fox написал(а):
Вот так применяем

if(isset($_POST['send'])){
if($ex->__construct($_POST) === true){
echo $ex->Insert();
}else{
echo $ex->__construct($_POST);
}
}


Спустя 49 секунд (24.07.2011 - 17:54) ADiel написал(а):
зачем 2 раза !empty($value) ?

Спустя 3 минуты, 44 секунды (24.07.2011 - 17:58) m4a1fox написал(а):
ADiel
А.... не знаю! Привычка с тернарного вылезла! smile.gif А вы как считаете правильно? (ну понятно что считает что один раз) но где убрать?

Спустя 2 минуты, 19 секунд (24.07.2011 - 18:00) m4a1fox написал(а):
Ага! Вот так?

public function __construct($post){
foreach ($post as $key=>$value){
if(!empty($value)){
$this->key[$key] = $value;
}else{
return $this->error;
}
}

return true;
}

Спустя 2 минуты, 29 секунд (24.07.2011 - 18:03) ADiel написал(а):
Именно.

return $this->error; не думаю, что уместно.
return заканчивает выполнение функции

Спустя 6 минут, 12 секунд (24.07.2011 - 18:09) m4a1fox написал(а):
ADiel
Впереди планеты всей....) только изменил

public function __construct($post){
foreach ($post as $key=>$value){
if(!empty($value)){
$this->key[$key] = $value;
}else{
return false;
}
}

return true;
}

Спустя 28 минут, 29 секунд (24.07.2011 - 18:37) ADiel написал(а):
т.е. выходит, что в случае получения хоть одного пустого POST, прерываем выполнение и выдаем ошибку? А как же необязательные поля?

Спустя 4 часа, 30 минут, 14 секунд (24.07.2011 - 23:08) m4a1fox написал(а):
ADiel
Цитата
А как же необязательные поля?

Хм.... о них не подкмал.... будут предложения?

Спустя 13 минут, 56 секунд (24.07.2011 - 23:22) ADiel написал(а):
Паттерны. Завтра придумаю, как лучше реализовать.

Спустя 11 часов, 4 минуты, 22 секунды (25.07.2011 - 10:26) m4a1fox написал(а):
ADiel
Продолжаем????????
Что там про паттерны?

Спустя 29 минут, 39 секунд (25.07.2011 - 10:56) ADiel написал(а):
Да, вот только сейчас совсем нет времени писать код.
Короче смотри:
   - Класс проверки
- Абстрактная модель
- Модель
- Массив полей таблицы, содержащий правила проверки вида:


// Паттерн
$rules = array(
// Поле row1 обязательное для заполнения, только цифры
'row1'=>array("requrie", "numeric"),
// Поле 2 может быть пустым, должно содержать буквы
'row2'=>array("string"),
);


Для записи вызываем Модель, которая наследует функции абстракной модели, в которых прописаны дефолтные правила

Далее при проверке входящих данных, просто перебираем $rules и вызываем функции проверки

К примеру вызов проверок будет выглядеть так:
foreach ($model->rules as $var=>$rules) {
$this->errors[] = VerifyClass::post($_POST[$var], $rules);
}

if (empty($this->errors)) {
$model->genSql;
} else {
$this->getErrors();
}

Спустя 7 минут, 29 секунд (25.07.2011 - 11:03) m4a1fox написал(а):
ADiel
Хм... Надо разбираться!

Спустя 13 минут, 4 секунды (25.07.2011 - 11:16) ADiel написал(а):
Далее просто наращиваем VerifyClass проверками

Спустя 37 минут, 26 секунд (25.07.2011 - 11:54) m4a1fox написал(а):
Значит нужно создавать еще один файл!!!! То есть делаем так. Есть класс, кот. заносит информацию в БД. Но перед тем как заносить в БД, нужно провести проверку данных.... Пока что есть единственный вопрос.... Вот верите, до сих пор не могу понять необходимость абстрактных методов.... Зачем они нужны?

Спустя 8 минут, 12 секунд (25.07.2011 - 12:02) ADiel написал(а):
Для определения основного функционала. Например есть 2 класса, первый абстрактный

abstract class A {
private function verify($val) {
return $val;
}

private function delete($val) {
unset($val);
}

}


class B extends A {

public function test($var) {
if (!$this->verify($val))
$this->verify($val);
}

}



Это нужно, если еть много классов, имеющих схожие или одинаковые функции.

Спустя 1 минута, 50 секунд (25.07.2011 - 12:04) m4a1fox написал(а):
ADiel
то есть абстрактные метода - это по сути некий вид проверки?????

Спустя 40 минут, 58 секунд (25.07.2011 - 12:45) ADiel написал(а):
Нет. Это своего рода библиотека методов.

Спустя 53 минуты, 52 секунды (25.07.2011 - 13:38) m4a1fox написал(а):
ADiel
А! Если это библиотека методов(функций) тогда в ней можно создать некий метод, кот. не работает с реальными объектами... и потом применять его выполняя определенные действия... то есть по сути - функция в процедурном программировании....

Спустя 1 час, 59 минут, 11 секунд (25.07.2011 - 15:38) ADiel написал(а):
Именно. Будем вызывать статическую функцию

Спустя 6 дней, 37 минут, 44 секунды (1.08.2011 - 16:15) necto написал(а):
Нарвался тут случайно, но если тема еще актуальна то почитай PHP_praktika_sozdaniya_web_saitov, Кузнецов, в частности глава 6
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.