php

Подписаться на эту метку по RSS

Вновь всплыла на форуме Макса тема о некорректной отдаче HTTP-заголовков. Видимо в прошлый раз я недостаточно рассмотрел проблему и, как следствие, она не была решена.

Цитирую:

У нас уже был случай, когда на странице пишется 404,
а в заголовке 200. По идее нужен контроль над отдачей заголовка.
Как выяснилось, существует загвоздка:

На уровне системы нет такого контроля - она лишь послушно раскладывает
адрес на сегменты. В других CMS этот процесс практически аналогичен -
можно добавить произвольные get-параметры в адрес и получить эту же
страницу.
Я вижу такой выход: по умолчанию система отдаёт 404. При подключении типов, если есть материал для отображения переопределяем на 200. Потом нужна проверка на лишние сегменты. И нужно в тех плагинах, где идёт подключение на сегмент сделать переопределение заголовка на 200.

Максим предложил такое решение:

Админ задаёт некий шаблон адреса, который считается верным, например:
category/*
category/*/next/*
/next/*
page/*
где / - разделитель сегментов, а * - произвольная часть сегмента. В этом примере адрес category/news будет валидным, а category/news/23 - нет.

То есть плагин при инициализации системы (хук init) проверяет текущий адрес на один из разрешенных шаблонов и если он соответствует любому варианту, то ничего не делает. Если же соответствия нет, переделывает type на page_404.

Нулевая тестовая версия плагина была реализована мной.

chaly_404.zip 0

На мой взгляд данные меры недостаточны и следует ввести ещё ряд проверок на правильность сегмента. Нужно обсудить и обдумать предложения по совершенствованию плагина.

Динамично развивающийся рынок диктует необходимость создания сайта как средства информирования и удержания целевой аудитории любой организации. Это также может быть собственный учёт, документооборот, иные Интернет-ресурсы. Для молодёжных организаций и общественных объединений сайт ещё более актуален, поскольку молодые люди привыкли получать всю информацию через Интернет.

В рамках настоящей работы создан и запущен в эксплуатацию сайт «Открой свои возможности», в настоящее время доступный в Интернете по адресу UrSSA.ru. Заказчиком данного проекта является Министерство по делам молодёжи УР и Республиканский совет студентов и аспирантов. Необходимо было получить работоспособный программный продукт в максимально короткие сроки. Ввиду того, что требования заказчика часто менялись и дополнялись, сформировать сводное техническое задание было практически невозможно.

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

Рассматривая техническую сторону вопроса, следует выделить систему управления содержанием сайта от отечественного разработчика – MaxSite CMS, как основное средство реализации проекта. Система реализована на CodeIgniter с поддержкой PHP и использует для хранения информации базу данных MySQL. Выбранная платформа позволяет использовать и другие решения, например, MS SQL, Postgre, Oracle, SQLite. Необходимо добавить, что использовалось много сторонних расширений, автором написаны собственные.

Также требовалось учесть, что система управления сайтом «Открой свои возможности» должна быть простой. Обслуживание и развитие сайта предполагается силами студентов, обычно ещё не имеющих опыта работы с подобными системами.

Оценим временные затраты на создание описанного выше продукта. Наиболее ответственная часть работы – установка и настройка системы управления на сервере. Этот процесс занял около двух часов. Далее возникла создания графического шаблона будущего сайта. Дизайнеру потребовалось на это около пяти часов. Для оценки работы дизайнера необходимы специальные знания. Творческий процесс трудно лимитировать. Было решено считать такой результат вполне удовлетворительным в плане быстроты. Завершающий этап разработки сайта – вёрстка, программирование и «подгонка» шаблона под систему управления. В рамках этого этапа был создан графический вывод данных, всё было «увязано» с системой управления. На это потребовалось приблизительно семь часов. В результате было выяснено, что в нашем случае создать нужный заказчику сайт при использовании типовых решений можно приблизительно за неделю. Данный подход позволяет заметно сократить время разработки. Следует отметить, что при использовании типовых свободно распространяемых решений профессиональному разработчику будет достаточно одних суток.

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

Проверка регистрационных данных

Воскресенье, 6 декабря 2009 г.
Рубрика: Сайтостроительство
Метки: | |

Часть функций, их основа честно откуда-то спёрта. Мне не удалось разыскать источник поэтому выложу в открытый доступ. Функции для проверки регистрационных данных комъюзеров.

Функция проверки на существование мыла в таблице пользователей.

function is_email_exists($email)
{
$ret = false;
$CI = &get_instance();
$CI->db->from('users');
$CI->db->select('users_email');
$CI->db->limit(1);
$CI->db->where( array('users_email' => $email));
$query = $CI->db->get();
if( $query->num_rows() )
{
$row = $query->row();
if( $row->users_email == $email ) $ret = true;
}
return $ret;
}

Получение ИДа пользователя по его нику.

function get_id_by_nik($name)
{
$ret = true;
$id = 0;
$CI = &get_instance();
$CI->db->from('comusers');
$CI->db->select('comusers_id');
$CI->db->limit(1);
$CI->db->where( array('comusers_nik' => $name));
$query = $CI->db->get();
if( $query->num_rows() )
{
$row = $query->row();
$id = $row->comusers_id;
}
return (int) $id;
}
Проверка на существование логина юзера

function is_users_login($login)
{
$ret = true;
$CI = &get_instance();
$CI->db->from('users');
$CI->db->select('users_login');
$CI->db->limit(1);
$CI->db->where( array('users_login' => $login));
$query = $CI->db->get();
if( $query->num_rows() )
{
$row = $query->row();
if( $row->users_login == $login )
{
$ret = false;
}
else
{
$ret = true;
}
}
return $ret;
}
Проверка на существование ника пользователя

function is_users_nik($login)
{
$ret = true;
$CI = &get_instance();
$CI->db->from('users');
$CI->db->select('users_nik');
$CI->db->limit(1);
$CI->db->where( array('users_nik' => $login) );
$query = $CI->db->get();
if( $query->num_rows() )
{
$row = $query->row();
if( $row->users_nik == $login )
{
$ret = false;
}
else
{
$ret = true;
}
}
return $ret;
}
Проверка на существование ника комъюзера

function is_comusers_nik($login, $userid)
{
$ret = true;
$CI = &get_instance();
$CI->db->from('comusers');
$CI->db->select('comusers_nik');
$CI->db->limit(1);
$CI->db->where( array('comusers_nik' => $login) );
$query = $CI->db->get();
if( $query->num_rows() )
{
$row = $query->row();
if ( ( $row->comusers_nik == $login ) and
( get_id_by_nik($row->comusers_nik) != $userid ) and ( $row->comusers_nik!='' ) )
{
$ret = false;
}
else
{
$ret = true;
}
}
return $ret;
}

Функция, которую нужно вызывать в файле your-template/type/users-form.php вместо стандартной $res_post=mso_comuser_edit(); нужно выполнить присваивание $res_post=russ_mso_comuser_edit();

function russ_mso_comuser_edit($args = array())
{
global $MSO;
if ( !isset($args['css_ok']) ) $args['css_ok'] = 'comment-ok';
if ( !isset($args['css_error']) ) $args['css_error'] = 'comment-error';
# id комюзера, который в сессии
if ( isset($MSO->data['session']['comuser']) and $MSO->data['session']['comuser'] )
$id_session = $MSO->data['session']['comuser']['comusers_id'];
else $id_session = false;
if ( $post = mso_check_post(array('f_session_id', 'f_submit', 'f_comusers_activate_key')) ) // это активация
{
# защита рефера
mso_checkreferer();
# защита сессии - если не нужно закомментировать строчку!
if ($MSO->data['session']['session_id'] != $post['f_session_id']) mso_redirect();
// получаем номер юзера id из f_submit[]
$id = (int) mso_array_get_key($post['f_submit']);
if (!$id) return '
'. t('Ошибочный номер пользователя'). '
';
# проверяем id в сессии с сабмитом
if ($id != $id_session)
return '
'. t('Ошибочный номер пользователя'). '
';

$f_comusers_activate_key = trim($post['f_comusers_activate_key']);
if (!$f_comusers_activate_key) return '
'. t('Неверный (пустой) ключ'). '
';
// нужно проверить если у указанного комюзера не равные ключи
// если они равны, то ничего не делаем
$CI = & get_instance();
$CI->db->select('comusers_activate_string, comusers_activate_key');
$CI->db->from('comusers');
$CI->db->where('comusers_id', $id);
$CI->db->limit(1);
$query = $CI->db->get();
if ($query->num_rows() > 0)
{
$comuser = $query->result_array(); // данные комюзера
if ($comuser[0]['comusers_activate_string'] == $comuser[0]['comusers_activate_key'])
{
// уже равны, активация не требуется
return '
'. t('Активация уже выполнена'). '
';
}
else
{
// ключи в базе не равны
// сверяем с переданным ключом из формы
if ($f_comusers_activate_key == $comuser[0]['comusers_activate_key'])
{
// верный ключ - обновляем в базе
$CI->db->where('comusers_id', $id);
$res = ($CI->db->update('comusers',
array ('comusers_activate_string' => $f_comusers_activate_key ) )) ? '1' : '0';
$CI->db->cache_delete_all();
if ($res)
return '
'. t('Активация выполнена!'). '
';
else
return '
'. t('Ошибка БД при добавления ключа активации'). '
';
}
else
{
return '
'. t('Ошибочный ключ активации'). '
';
}
}
}
else // вообще нет такого комюзера
return '
'. t('Ошибочный номер пользователя'). '
';
}
elseif ( $post = mso_check_post(array('flogin_session_id', 'flogin_submit', 'flogin_user', 'flogin_password',
'flogin_redirect')) )
{
// логинимся через стандартную _mso_login()
_mso_login();
return;
}

// это форма?
elseif ( $post = mso_check_post(array('f_session_id', 'f_submit', 'f_comusers_email', 'f_comusers_password',
'f_comusers_nik', 'f_comusers_url', 'f_comusers_icq', 'f_comusers_msn', 'f_comusers_jaber',
'f_comusers_date_birth', 'f_comusers_description', 'f_comusers_avatar_url')) ) // это обновление формы
{
if (!is_login_comuser())
return '
'. t('Ошибочные данные пользователя'). '
';

# защита рефера
mso_checkreferer();
# защита сессии - если не нужно закомментировать строчку!
if ($MSO->data['session']['session_id'] != $post['f_session_id']) mso_redirect();
// получаем номер юзера id из f_submit[]
$id = (int) mso_array_get_key($post['f_submit']);
if (!$id) return '
'. t('Ошибочный номер пользователя'). '
';
# проверяем id в сессии с сабмитом
if ($id != $id_session)
return '
'. t('Ошибочный номер пользователя'). '
';


$f_comusers_email = trim($post['f_comusers_email']);
$f_comusers_password = trim($post['f_comusers_password']);
if (!$f_comusers_email or !$f_comusers_password)
return '
'. t('Необходимо указать email и пароль'). '
';

// проверим есть ли такой комюзер
$CI = & get_instance();
$CI->db->select('*');
$CI->db->from('comusers');

# CodeIgniter экранирует where, даже когда только условия в полях
$CI->db->where('comusers_activate_string=comusers_activate_key', '', false); // активация должна уже быть

$CI->db->where(array('comusers_id'=>$id,
'comusers_email'=>$f_comusers_email,
'comusers_password'=>$f_comusers_password
));
$CI->db->limit(1);
$query = $CI->db->get();
if ($query->num_rows() > 0)
{
// все ок - логин пароль верные
$comuser = $query->result_array(); // данные комюзера
$f_comusers_avatar_url = mso_strip($post['f_comusers_avatar_url'], false,
array('\\', '|', '?', '%', '*', '`'));
$allowed_ext = array('gif', 'jpg', 'jpeg', 'png'); // разрешенные типы
$ext = strtolower(str_replace('.', '', strrchr($f_comusers_avatar_url, '.'))); // расширение файла
if ( !in_array($ext, $allowed_ext) ) $f_comusers_avatar_url = ''; // запрещенный тип файла

if (!isset($post['f_comusers_notify'])) $post['f_comusers_notify'] = 0;

if ( !( is_users_login($post['f_comusers_nik']) and is_comusers_nik($post['f_comusers_nik'], $id) and is_users_nik($post['f_comusers_nik']) ) )
return '
'. t('Необходимо указать правильный ник'). '
';
$upd_date = array (
'comusers_nik' => strip_tags($post['f_comusers_nik']),
'comusers_url' => strip_tags($post['f_comusers_url']),
'comusers_icq' => strip_tags($post['f_comusers_icq']),
'comusers_msn' => strip_tags($post['f_comusers_msn']),
'comusers_jaber' => strip_tags($post['f_comusers_jaber']),
'comusers_date_birth' => strip_tags($post['f_comusers_date_birth']),
'comusers_description' => strip_tags($post['f_comusers_description']),
'comusers_avatar_url' => $f_comusers_avatar_url,
'comusers_notify' => $post['f_comusers_notify'],

);

# pr($upd_date );
$CI->db->where('comusers_id', $id);
$res = ($CI->db->update('comusers', $upd_date )) ? '1' : '0';
$CI->db->cache_delete_all();
// mso_flush_cache(); // сбросим кэш

if ($res)
return '
'. t('Обновление выполнено!'). '
';
else
return '
'. t('Ошибка БД при обновлении'). '
';
}
else return '
'. t('Ошибочный email и пароль'). '
';
} // обновление формы
}
Изменений минимум, но они касаются именно проверок. При обновлении Максом данной функции следует вносить изменения и в эту. На данный момент она предназначена для версии 0.34. Хотя не думаю, что будут изменения в будущем.

Поиск

Статистика

Rambler's Top100