X   Сообщение сайта
(Сообщение закроется через 3 секунды)



 

Здравствуйте, гость (

| Вход | Регистрация )

2 страниц V   1 2 >
Открыть тему
Тема закрыта
> Конструкции упрощающие кодинг
alexdrob
alexdrob
Topic Starter сообщение 17.8.2011, 18:31; Ответить: alexdrob
Сообщение #1


Предлагаю выкладывать конструкции различные которые упрощают кодинг.

вот например после изучения django пришло в голову сделать такие функции
[PHP]function GET($key, $d = '') {
return empty($_GET[$key]) ? $d : $_GET[$key];
}

function POST($key, $d = '') {
return empty($_POST[$key]) ? $d : $_POST[$key];
}[/PHP]
чем они хороши, вроде не чего сложного, но почти в каждом сайте есть формы, пусть та же форма обратной связи.

например есть поля name, email, phone, title, text
допустим поле text и email обязательны, а остальные нет, можно записать проверку так

[PHP]
if (POST('submit')) {
if ($email = POST('email') && $text = POST('text')) {
$name = POST('name');
$title = POST('title', 'Без заголовка');
$phone = POST('phone');

$mes = "Имя: $name
Телефон: $phone
E-mail: $email
Тема: $title
Сообщение: $text";
} else {
echo 'Не заполнены обязательные поля!';
}
}[/PHP]
так мы получим проверку на пустоту для email и text
и если поле $title не заполнено, то получим надпись Без заголовка.
0
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
Mulder_hb
Mulder_hb
сообщение 17.8.2011, 19:02; Ответить: Mulder_hb
Сообщение #2


ИМХО, сомнительная польза. Настоящая проверка, куда более сложная, а ваш вариант трудно расширяем+дублирование кода+если нам нужно не empty, а isset - дополнительное дублирование. Обычно пишется полноценная функция/метод валидации.
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
ZhukV
ZhukV
сообщение 17.8.2011, 19:16; Ответить: ZhukV
Сообщение #3


Следует заметить, что даная конструкция спокойно пройдет несуществующую переменную (если так и есть), и не вернет ошибки уровня E_NOTICE.

1. Ка можно избавиться от лишней нагрузки на сервер?
- Использовать статические переменные внутри функции.

[PHP]
ffunction me_function() {
static $cached = array();

if ($cached) {
return $cached;
}
// Open database connect
// Send query
// Fetch $result
$cached = $result;
return $cached;
}
[/PHP]
Возможно функция имеет какие-то параметры, и по ним идет фильтр:

[PHP]function me_function($key) {
static $cached = array();

if (isset($cached[$key])) {
return $cached[$key];
}
// Open database connect
// Send query
// Fetch $result
$cached[$key] = $result;
return $cached[$key];
}[/PHP]

Если в параметр в виде массива или обекта, то модно переобразовать в ключ, используя -- md5(serialize($key));

ОДИН ИЗ ЛУЧШИХ ВАРИАНТОВ СТАТИКИ В ФУНКЦИИ
[PHP]
function &me_static($key, $default_value = NULL) {
static $cached = array();
return isset($cached[$key]) ? $cached[$key] : $default_value;
}


/**
* Other function
*/
function me_function_1 () {
$cached = &me_static(__FUNCTION__);
if ($cached) {
return $cached;
}

mysql_query('', '', '');
/** ...... Other operations .... */
$cached = $result;
}
[/PHP]

Возможно кому то с начинающих будет тяжело понять статику функций, но не смертельно )))
Сдесь дело в том, что все полностью сохраняется в статической функции, и даже когда Вы вызывает кеш -- $cache = &me_static(__FUNCTION__), то во-первых,ключи не будут идентичными а будут разными, во-вотрых, все данные сохранятся в статической переменной $cached in function me_static


2. Ка можно задать твердые типы входящих данных (в функции)?
Иногда нужно твердо задать, что функция принимает только массив, или обект какого-то класса.
[PHP]function me_function(array $param, stdClass $param2) {
// ....
}

me_function(array(), 1); // Recovery fatal error [second argument]
$std = new stdClass;
me_function(1, $std); // Recovery fatal error [first argument]
me_function(array(), $t); // Good execute function[/PHP]

3. Ка можно сделать функцию на подобии preg_match а именно третего аргумента?

Третий аргумент в фукнции preg_match имеет жесткую ссылку.
Думаю с примера все будет видно!!
[PHP]function me_function(&$a) {
$a++;
}

$a = 1;
print $a;
me_function($a);
print $a;[/PHP]

НЕКОТОРЫЕ СОВЕТЫ КАК И ДЛЯ НАЧИНАЮЩИХ, ТАК И ДЛЯ ВСЕХ!

1. При работе с текстом (оссобено -- strlen, substr, strtolower....), лучше использовать функции multibyte, они намного точнее простых.
Имеються почти все функции мультибайта, и название точно таке же, вот только приставка имеется mb_
Example:
substr -> mb_substr
strlen -> mb_strlen
......

2. Можно не использовать регулярки для того, чтобы проверить email-и или урли.
Можно использовать функцию -- filter_var
Вот пример проверки почтового адреса
[PHP]
function _validate_email($email) {
return (bool) filter_var($email, FILTER_VALIDATE_EMAIL);
}
[/PHP]

3. При более сложных запросах пари загрузке страницы, лучше использовать кеш и обновлять кеш, если обновились данные.
Если имеется свой сервер, тогда желательно мемкеш, если же нету, тогда БД и сериализированные данные.
Создайте функции cache_get, cache_set, cache_delete, какими сможете управлять кешом. При таком подходе Вы сможете значительно уменшить нагрузку.


4. Я очень много где видел, что если делают сами сайт, то перед записю в БД , все тексты обрабатываються (Даже тот конченные ДЛЕ так делает )))))))))
Это неверно, поскольку если Вы захотите что-то поменять? переделать?
Лучше форматировать текст уже при выборке из базы, создать себе так себе функцию фильтра:
[PHP]function filter_text($text) {
return strip_tags($text, '<p> <br> <a> <ul> <li>'); // и тыкайте себе все разрешенные теги
}[/PHP]

5. Также видил, что когда происходит загрузка картинки на сервер, то ее обрезают при загрузке.
Лучше будет загрузить ее такой, какой она есть и при выводе обрезать, использую кеш в файловой структуре.

6. Если Вы хотите создать отличный сайт, который можна спокойно переделать, либо сделать из него КМС, либо ПО, то обезательно используйте уровень абстракции, которые разрешает унаследовать методы, свойста и перезаписывать их.

7. Если у Вас имеет огромную нагрузку, и страицы для анонымов всегда одинаковы, то тогда кешируйте полснотью все страницы.

Для тех кто имеет свои серваки:
1. Не поленуйтесь сделать RAID венчестеров. Это обезопасит Вас от потери данных, если один венчестер сгорит.
2. Если ОС -- Linux, то лучше использовать php5-dev, поскольку pecl сможет работать только под ним.
3. Поставте сервер memcache, (пакет линукса -- memecached, пакет пекла - memcache)
4. Если у Вас работает система кластера, тогда ОБЕЗАТЕЛЬНО используйте сервер NFS, тоесть оддать на растерзание какую-то одну папку на все ноды в кластере. Это нужно для того, что если Вы изменяете данные через один интерфейс, то другие ноды тоже его увидят, но работать будут под своими сисемами. ОБЕЗАТЕЛЬНО желательно на сервера НФС-а ставить РЕЙДЫ, поскольку нагрузка на венчак будет крутая.
5. Если у Вас к БД множество запросов (выборки больше чем вставки), то создайте slave server mysql. Можно создать на одном сервер, методом запуска двух демонов на разных сокетах или портах.


----------------------------------------------
П.С.
Эта тематика никогда не будет закрыта, так как каждые имееть какие-то новый способы.
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
alexdrob
alexdrob
Topic Starter сообщение 17.8.2011, 19:17; Ответить: alexdrob
Сообщение #4


(Mulder_hb @ 17.8.2011, 22:02) *
Настоящая проверка

настоящая проверка чего? какая разница если почту не верную впишут? это же не подстановка в функцию mail
это просто проверка заполнения полей.
в любом случае если вам нужно проверять регуляркой, вам придётся проверить вначале на isset а empty выполняет эту проверку.

(Mulder_hb @ 17.8.2011, 22:02) *
трудно расширяем

расширяем куда? это просто выкидывание дублирования в каждой строке записи вида
[PHP]$name = isset($_POST['name']) ? $_POST['name'] : '';[/PHP]
а дальше хотите валидацию, так проверяйте, вот с функцией
[PHP]$name = POST('name');
if (valud_name($name)) {[/PHP]
вот без
[PHP]$name = isset($_POST['name']) ? $_POST['name'] : '';
if (valud_name($name)) {[/PHP]

о проверке на шаблон я и не писал. если вы сделаете сразу так
[PHP]if (valud_name($_POST['name'])) {[/PHP]
будет ошибка если поле не заполнено.
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
Mulder_hb
Mulder_hb
сообщение 18.8.2011, 10:30; Ответить: Mulder_hb
Сообщение #5


(alexdrob @ 17.8.2011, 22:17) *
в любом случае если вам нужно проверять регуляркой, вам придётся проверить вначале на isset а empty выполняет эту проверку.

Если мне нужно проверить только на isset, придется писать еще 2 лишние функции. И того их уже 4.
(alexdrob @ 17.8.2011, 22:17) *
это просто выкидывание дублирования в каждой строке записи вида

Вместо записи
[PHP]$name = isset($_POST['name']) ? $_POST['name'] : '';[/PHP]
Вы пишите
[PHP]$name = POST['name'];[/PHP]
А смысл в чем? В скорости набора и только.
(alexdrob @ 17.8.2011, 22:17) *
будет ошибка если поле не заполнено.

Не будет. Потому что то, что вы делаете это и есть валидация. Почему вы первый шаг валидации вынесли в отдельную функцию и вызываете только ее? Вся валидация для клиентского кода должна производиться в одной функции. Вот это и есть расширяемость.
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
alexdrob
alexdrob
Topic Starter сообщение 18.8.2011, 12:15; Ответить: alexdrob
Сообщение #6


(Mulder_hb @ 18.8.2011, 13:30) *
Если мне нужно проверить только на isset, придется писать еще 2 лишние функции. И того их уже 4.

ну тут как бы немного не тот подход, тут на иссет не поможет проверка, так как она вернёт всё равно пустую строку, тут смысл немного в другом. если нужна проерка именно на иссет, просто не используйте функцию и всё, не кто ж не заставляет :)


(Mulder_hb @ 18.8.2011, 13:30) *
А смысл в чем? В скорости набора и только.

именно) говорю же взял из питона :) а тами 1 буква экономии считается экономией :D


(Mulder_hb @ 18.8.2011, 13:30) *
Вся валидация для клиентского кода должна производиться в одной функции.

рассмотрим пример из yii, мы проверяем есть ли переменная и потом передаём её куда то и проходим валидацию
[PHP]if(isset($_POST['Item']))
{
$valid=true;
foreach($items as $i=>$item)
{
if(isset($_POST['Item'][$i]))
$item->attributes=$_POST['Item'][$i];
$valid=$item->validate() && $valid;
}
if($valid) // все элементы корректны
// …некоторая обработка
}[/PHP]
из django, то же самое мы проверяем есть ли свойство, потом поучаем форму из него и потом валидация
[PHP]if request.method == 'POST':
form = GuildForm(request.POST)
if form.is_valid():
form.save()[/PHP]

это всё дело вкуса, я же ещё раз повторю, это простая проверка, помогающая не везде, нет не чего универсального)
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
LifeUP
LifeUP
сообщение 18.8.2011, 13:21; Ответить: LifeUP
Сообщение #7


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

[PHP]
function set_value($key)
{
return (isset($_POST[$key]) ? $_POST[$key] : '');
}
[/PHP]


<input type="text" name="text" value="<?php echo set_value('text') ?>" />
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
Mulder_hb
Mulder_hb
сообщение 18.8.2011, 13:34; Ответить: Mulder_hb
Сообщение #8


(alexdrob @ 18.8.2011, 15:15) *
ну тут как бы немного не тот подход, тут на иссет не поможет проверка, так как она вернёт всё равно пустую строку, тут смысл немного в другом. если нужна проерка именно на иссет, просто не используйте функцию и всё, не кто ж не заставляет

Тогда код получается не унифицированным. Тот, кто будет читать такой код, будет долго чесать затылок, почему в одном месте написано
[PHP]$name = POST('name');[/PHP]
а в другом
[PHP]$name = isset($_POST['name']) ? $_POST['name'] : '';[/PHP]
(alexdrob @ 18.8.2011, 15:15) *
рассмотрим пример из yii, мы проверяем есть ли переменная и потом передаём её куда то и проходим валидацию

Не выдирайте слова из контекста. Я писал, что для клиентского кода обработка должна проходить в одном месте, а не как у вас, сначала вызвать вашу функцию, потом валидацию, потом еще что-то. Так и забыть можно что-то вызвать. Т.е. если пишите подобную функцию, то вызваться одна должна не напрямую клиентским кодом, а через общую функцию валидации.
Но проверка в Yii с вашей не имеет ничего общего. В Yii валидация не зависит от типа входных данных, у вас зависит. В Yii можно легко расширить валидацию (в данном случае заменить на empty), у вас такая легкость не пройдет и т.д.
Но посыл в общем верный. Во всех движках, функции валидации выносятся отдельно и делаются они куда более абстрактными.
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
alexdrob
alexdrob
Topic Starter сообщение 18.8.2011, 14:24; Ответить: alexdrob
Сообщение #9


(Mulder_hb @ 18.8.2011, 16:34) *
сначала вызвать вашу функцию, потом валидацию,

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


(Mulder_hb @ 18.8.2011, 16:34) *
В Yii валидация не зависит от типа входных данных, у вас зависит.

у меня вообще нет валидации! это эамена строки
(Mulder_hb @ 18.8.2011, 16:34) *
$name = isset($_POST['name']) ? $_POST['name'] : '';

и не более того

(Mulder_hb @ 18.8.2011, 16:34) *
в Yii с вашей не имеет ничего общего

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

про Yii я сказал к тому, что Yii не проверяет на isset и empty
вы не имя переменной передаёте, а сам массив переменных, а можно и по отдельности имена, в любом случае сначала нужно убедится что массив или имена есть прежде чем передать.

ещё раз повторю, это просто упрощения когда это можно применить, когда нет не применяйте, вас не заставляют, нет универсальных на 100% средств.
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
ZhukV
ZhukV
сообщение 16.9.2011, 10:59; Ответить: ZhukV
Сообщение #10


Поржать конечно можно ))))
Как то удивительно, знающие люди свое дело и на таком починаються дебаты )))

Если уж нужно проверять еще и на существование переменной, тоесть проверить, было она передана или нет, то можно:

[PHP]
function POST($key, $default_value = NULL) {
return isset($_POST[$key]) ? $_POST[$key] : $default_value;
}

if (POST('me_var') == NULL) {
die('Error');
}

$var1 = POST('var1', 'default_value_var1');
[/PHP]


Но я думаю, что и так плохо.....
Это тупо такое обсуждать )))
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
2 страниц V   1 2 >
Открыть тему
Тема закрыта
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0


Свернуть

> Похожие темы

  Тема Ответов Автор Просмотров Последний ответ
Открытая тема (нет новых ответов) Кодинг, парсинг, автоматизация задач, импорт, разработка и доработка сайтов
Экономлю время!
8 a10ne 4888 2.11.2017, 14:26
автор: a10ne
Открытая тема (нет новых ответов) Верстка, PHP-кодинг, бесплатно, для партфолио!
0 -Oleg- 3482 5.12.2011, 14:05
автор: --Oleg--


 



RSS Текстовая версия Сейчас: 19.4.2024, 17:54
Дизайн