phpBB3Программное создание пользователей

Это пользователи вашего сайта Во время перехода на phpBB 3 из какой-либо системы или интеграции с другими разработками у Вас может возникнуть желание научиться программно добавлять пользователей.

Можно изучить структуру базы данных и отправлять соответствующие SQL-запросы. При этом нужно будет добавлять данные в таблицы users table, profile_fields_data table, groups table, и config, а также придется следить за целостностью данных и постараться ничего не испортить.

Но существует и более удобный способ...

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

Для добавления пользователей существует функция user_add (). Ее синтаксис следующий:

user_add($user_row, $cp_data = false)

Первый аргумент $user_row — это массив, содержащий данные добавляемого пользователя в ассоциативном массиве. Если дополнительные параметры для добавляемого пользователя не указаны, то будут использованы значения по умолчанию.

Второй аргумент $cp_data (опциональный параметр) — это массив, содержащий стандартные поля профиля.

Функция user_add () возвращает идентификатор только что добавленного пользователя.

Обязательны к заполнению следующие элементы массива $user_row: username, password, group_id, user_email, user_type. Все остальные поля необязательны.

Рассмотрим простой пример добавления пользователя в базу данных phpBB 3:

< ?php
// Заполняем ассоциативный массив.
// Естественно, все указанные значения должны быть
// получены заранее.
$user_row = array(
    'username'              => $username,
    'user_password'         => phpbb_hash($password),
    'user_email'            => $email_address,
    'group_id'              => (int) $group_id,
    'user_timezone'         => (float) $timezone,
    'user_dst'              => $is_dst,
    'user_lang'             => $language,
    'user_type'             => $user_type,
    'user_actkey'           => $user_actkey,
    'user_ip'               => $user_ip,
    'user_regdate'          => $registration_time,
    'user_inactive_reason'  => $user_inactive_reason,
    'user_inactive_time'    => $user_inactive_time,
);
 
// Вся информация собрана - добавляем пользователя.
// Будут затронуты следующие таблицы: users table, profile_fields_data table,
// groups table, and config table.
$user_id = user_add($user_row);
 
?>

Давайте теперь рассмотрим процесс добавления пользователя с более подробным расписыванием каждого элемента:

< ?php
 
// Имя пользователя
$username = 'v673';
 
// Пароль пользователя в открытом виде.
// Конечно же, перед добавлением в базу данных
// он будет хешироваться.
$password = 'HaRd_PaSsWoRd';
 
// E-mail адрес нашего пользователя
$email_address = 'my_email@domain_name.ru';
 
// По умолчанию, 4 - номер группы для зарегистрированных пользователей, и
// 5 - для COPPA-пользователей(http://coppa.org).
$group_id = ($coppa) ? 5 : 4;
 
// Но так как ID по умолчанию может смениться, то мы обязаны предварительно сделать
// запрос к базе данных для получения идентификатора.
// Учтите, что после первого выполнения данный запрос закешируется.
$group_name = ($coppa) ? 'REGISTERED_COPPA' : 'REGISTERED';
$sql = 'SELECT group_id
        FROM ' . GROUPS_TABLE . "
        WHERE group_name = '" . $db->sql_escape($group_name) . "'
            AND group_type = " . GROUP_SPECIAL;
$result = $db->sql_query($sql);
$row = $db->sql_fetchrow($result);
$group_id = $row['group_id'];
 
// Временная зона для пользователя, в GMT формате.
$timezone = '-6';
 
// Язык пользователя. Указывается двухбуквенное сокрашение.
$language = 'en';
 
// Тип пользователя. Может быть USER_INACTIVE или USER_NORMAL,
// в зависимости от того, нужно ли пользователю после его создания самостоятельно
// активировать свой аккаунт.
$user_type = USER_INACTIVE;
 
// Если мы устанавливаем пользователя, как неактивного (USER_INACTIVE),
// то мы должны сгенерировать его активационный код.
// Можете использовать любой алгоритм генерации, какой только сможете
// придумать.
$user_actkey = md5(rand(0, 100) . time());
$user_actkey = substr($user_actkey, 0, rand(8, 12));
 
// IP-адрес пользователя.
$user_ip = $user->ip;
 
// Дата регистрации пользователя в UNIX-формате.
$registration_time = time();
 
// Причина неактивности выводится в администраторском аккаунте при
// выводе списка пользователей.
// Может быть следующей: INACTIVE_REGISTER, INACTIVE_PROFILE,
// INACTIVE_MANUAL and INACTIVE_REMIND.
// Нет необходимости указывать этот параметр, если пользователь
// станет сразу активным после регистрации.
$user_inactive_reason = INACTIVE_REGISTER;
 
// Время, после которого пользователь неактивен.
// То есть это фактически дата последнего входа в систему.
// Указываем текущее UNIX-время.
$user_inactive_time = time();
 
// Создаем непосредственно ассоциативный массив.
$user_row = array(
    'username'              => $username,
    'user_password'         => phpbb_hash($password),
    'user_email'            => $email_address,
    'group_id'              => (int) $group_id,
    'user_timezone'         => (float) $timezone,
    'user_dst'              => $is_dst,
    'user_lang'             => $language,
    'user_type'             => $user_type,
    'user_actkey'           => $user_actkey,
    'user_ip'               => $user_ip,
    'user_regdate'          => $registration_time,
    'user_inactive_reason'  => $user_inactive_reason,
    'user_inactive_time'    => $user_inactive_time,
);
 
// Далее система все берет на себя.
// Пользователь будет автоматически добавлен в соответствующие
// таблицы в базе данных.
$user_id = user_add($user_row);
 
?>

Вот мы и рассмотрели в общих чертах как автоматизировать добавление пользователей в phpBB 3.

Материал подготовлен на основе соответствующей статьи в phpBB Development Wiki.


Есть мысли на этот счет:
screamer 22.10.2009 19:01 пишет:

Стас, огромное тебе спасибо! Возился 4 часа с програмным добавлением пользователя, наткнулся на твой болг, и через 20 минут решил проблему!!! Щас добавлю ленту!

Классный блог! Еще раз спасибо!

    v673 23.10.2009 07:21 пишет:

    Спасибо, screamer! Очень приятно. Собственно ради такой помощи этот блог и создан, и я рад, что не зря писал эту статью. Хорошие отзывы всегда приятно слышать. :-)

screamer 22.10.2009 19:42 пишет:

А теперь не подскажешь как через user_add или еще как то добавить аватар? Или только вставлять путь напрямую в БД?

    v673 23.10.2009 07:24 пишет:

    Есть два варианта:

  • Очевидный. Загрузить аватар в соответствующее место на диске и отредактировать поле в таблице пользователей.
  • Правильный. Посмотреть как это реализовано в коде самого phpBB. Возможно, они сделали специальную удобную функцию.
screamer 23.10.2009 14:00 пишет:

Функций я к сожалению не нашел. Решил проблему «очевидным» способом. Правда пришлось разбиратся в хеше имени картинки. Но все же решение найденно!

Денис 29.10.2009 10:17 пишет:

а есть такая возможность в phpbb и этой функции делать разные имя входа например «login123» и отображаемое на форуме имя пользователя(«Вася Пупкин»)?.чтобы например при вводе логина login123 сообщения пользователя отображались под «Вася Пупкин»

md5alx 29.10.2009 14:39 пишет:

Добрый день !!!

Классная статья спору нет,

не могли бы мне написать как подключить данный php более подробно если Вам не трудно конечно

С Уважением, Александр

    v673 29.10.2009 17:39 пишет:

    Данный программный код — всего лишь пример. Его нельзя взять и подключить к phpBB. Просто на основе его можно понять как происходит программное добавление пользователей.

    Если вы хотите автоматизировать этот процесс, то вам необходимо для начала подключить программное окружение в phpBB, а уж затем выполнять приведенный мной код. Если вы разбираетесь в программировании, то рекомендую статью Add custom page в phpBB Development Wiki.

md5alx 29.10.2009 15:12 пишет:

Я так понял, что данный скрипт нужно добавить через Управление модулями или как ??? На данный момент у меня не получается. Помогите создавать пользователей в ручном режиме.

За ранее спасибо.

    v673 29.10.2009 17:41 пишет:

    Вы не первый кто сталкивается с подобной проблемой.

    Если Вам нужно добавлять пользователей в ручном режиме из администраторского интерфейса, то все гораздо проще. По умолчанию в phpBB такой функциональности нет, но существуют готовые модули, которые добавляют такую функцию.

    К сожалению, я не помню названия подобного модуля, но, я думаю, вы легко сможете его найти на русскоязычных форумах поддержки phpBB.

    v673 05.11.2009 22:48 пишет:

    Да, именно он. Спасибо большое — буду знать.

Денис 05.02.2010 10:36 пишет:

Спасибо :) ++1 к твоей карме

Дмитрий 21.07.2010 08:34 пишет:

Добрый день, спасибо за статью.

Подскажите, какие файлы из комплекта phpBB3 нужно подключить с отдельному сайту, чтобы работали функции phpbb_hash ($password) и user_add ($user_row)?

Дмитрий 21.07.2010 08:37 пишет:

Да, и не будет ли конфликтов, если пытаться добавить уже существующего пользователя на форуме? как можно это предусмотреть?

Дмитрий 21.07.2010 10:25 пишет:

Разобрался,

полный рабочий код:

// интеграция с форумом

define ('PHPBB_ROOT_PATH', './forum/');

define ('IN_PHPBB', true);

$phpbb_root_path = (defined ('PHPBB_ROOT_PATH')) ? PHPBB_ROOT_PATH : './';

$phpEx = substr (strrchr (__FILE__, '.'), 1);

include ($phpbb_root_path . 'common.' . $phpEx);

require_once ('./forum/config.php');

require_once ('./forum/includes/functions.php');

require_once ('./forum/includes/functions_user.php');

require_once ('./forum/includes/db/dbal.php');

require_once ('./forum/includes/db/mysql.php');

// добавляем пользователя на форум:

$us=explode ('@',$_POST['email']);

$username = $us[0];

$password = $_POST['pass'];

$email_address = $_POST['email'];

$group_id = '2';

$timezone = '-3';

$language = 'ru';

$user_type = USER_NORMAL;

$user_ip = $_SERVER['REMOTE_ADDR'];

$registration_time = time ();

$user_inactive_time = time ();

$user_row = array (

'username' => $username,

'user_password' => phpbb_hash ($password),

'user_email' => $email_address,

'group_id' => (int) $group_id,

'user_timezone' => (float) $timezone,

'user_dst' => $is_dst,

'user_lang' => $language,

'user_type' => $user_type,

'user_actkey' => $user_actkey,

'user_ip' => $user_ip,

'user_regdate' => $registration_time,

'user_inactive_reason' => $user_inactive_reason,

'user_inactive_time' => $user_inactive_time,

);

// Вся информация собрана — добавляем пользователя.

// Будут затронуты следующие таблицы: users table, profile_fields_data table,

// groups table, and config table.

$forum_user_id = user_add ($user_row);

Есть что сказать?
Ваше имя:
Ваш e-mail:
Ваш сайт:
Ваше мнение:




земляные работы в Донецке