1. Создаем CSV-файл следующего содержания:
Код:
- Код: Выделить всё
"Пользователь 1","пароль1","пользователь1@домен1.ru",2,"ru",0
"Пользователь 2","пароль2","пользователь2@домен2.ru",2,"ru",0
"Пользователь 3","пароль3","пользователь3@домен3.ru",2,"ru",0
Здесь необходимые для регистрации поля идут в следующем порядке: имя пользователя → пароль → адрес электронной почты → ID группы → язык → тип.
Называем этот файл users_to_add.csv и закачиваем его в корневую директорию форума. Можно назвать файл иначе, но тогда соответствующее имя нужно будет прописать в PHP-файле, который идет ниже.
2. Создаем PHP-файл следующего содержания:
Код php:
- Код: Выделить всё
<?php
/**
* @ignore
*/
@set_time_limit(0);
//@ignore_user_abort(true);
@ini_set('memory_limit', '64M');
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);
include_once($phpbb_root_path . 'includes/functions_user.' . $phpEx);
// Start session management
$user->session_begin();
$auth->acl($user->data);
$user->setup();
$users_start = request_var('us', 0);
$users_step = request_var('up', 50);
$users_data = array();
$users_counter = 0;
$handle = fopen('users_to_add.csv', 'r');
while (($data = fgetcsv($handle, 0, ',')) !== false)
{
$num = count($data);
for ($c = 0; $c < $num; $c++)
{
$users_data[$users_counter][$c] = $data[$c];
}
$users_counter++;
}
fclose($handle);
//include($phpbb_root_path . 'users_to_add.' . $phpEx);
$users_list = '';
$total_users = count($users_data);
$users_this_step = min($users_start + $users_step, $total_users);
$users_this_step = ($users_this_step == 0) ? $total_users : $users_this_step;
$new_start = $users_start;
$users_fields_name = array('username', 'user_password', 'user_email', 'group_id', 'user_lang', 'user_type', 'user_regdate');
for ($i = $users_start; $i < $users_this_step; $i++)
{
$users_fields_values = array($users_data[$i][0], phpbb_hash($users_data[$i][1]), $users_data[$i][2], '2', 'en', '0', time());
for ($j = 0; $j < count($users_fields_name); $j++)
{
$users_data[$i][$j] = (empty($users_data[$i][$j])) ? $users_fields_values[$j] : $users_data[$i][$j];
$users_data[$i][$users_fields_name[$j]] = $users_fields_values[$j];
unset($users_data[$i][$j]);
}
$user_id = user_add($users_data[$i]);
if ($user_id !== false)
{
$users_list .= (($users_list == '') ? '' : ', ') . $users_data[$i]['username'];
}
$new_start++;
}
$message_text = 'Следующие пользователи были добавлены в базу данных:<br /><br />' . $users_list;
if ($new_start >= $total_users)
{
$message = 'Все указанные пользователи были успешно добавлены!<br /><br />' . $message_text;
$template->assign_vars(array(
'MESSAGE_TITLE' => 'Добавление пользователей',
'MESSAGE_TEXT' => $message
)
);
page_header('Добавление пользователей');
$template->set_filenames(array('body' => 'message_body.html'));
page_footer();
}
else
{
$meta_url = append_sid("{$phpbb_root_path}users_add.$phpEx", "us=$new_start&up=$users_step");
meta_refresh(3, $meta_url);
$message = 'Процесс добавления пользователей еще не закончен. Данная страница автоматически обновится через несколько секунд. Пожалуйста, подождите…<br /><br />' . $message_text;
trigger_error($message);
exit;
}
?>
Называем этот файл users_add.php и закачиваем в корневую директорию форума.
3. Направляем браузер на файл users_add.php. Добавление пользователей будет происходить по 50 человек за один проход. Количество добавляемых пользователей можно увеличить, исправив соответствующее число в строке $users_step = request_var('up', 50);.
Внимание! Никакой гарантии работоспособности данного скрипта не дается. За идею скрипта скажите спасибо вот этому чуваку.
На нашем движке вот что пишет...
Общая ошибка
- Код: Выделить всё
SQL ERROR [ mysqli ]
Incorrect string value: '\xFF\xFE"\x00!\x04...' for column 'username' at row 1 [1366]
SQL
BACKTRACE
FILE: (not given by php)
LINE: (not given by php)
CALL: msg_handler()
FILE: [ROOT]/includes/db/dbal.php
LINE: 757
CALL: trigger_error()
FILE: [ROOT]/includes/db/mysqli.php
LINE: 189
CALL: dbal->sql_error()
FILE: [ROOT]/includes/functions_user.php
LINE: 251
CALL: dbal_mysqli->sql_query()
FILE: [ROOT]/users_add.php
LINE: 57
CALL: user_add()
Нужна помощь в адаптации данного скрипта... можно добавлять много пользователей одновременно. Кодировка файлов была в UTF-8 без бом.
UPD
Нашел вон че:
Для добавления пользователей существует функция 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);
?>
Еще способ:
Добавление пользователей на форум phpBB3
Часто форум используется не как отдельный ресурс, а в связке с сайтом. При этом, если на сайте есть своя система пользователей, то разумно будет объединить регистрацию и авторизацию пользователей на сайте и на форуме. Поэтому сегодня я хочу показать пример скрипта, который будет добавлять пользователей на форум. Вы можете использовать данный скрипт на сайте, либо дублирую пользователей сайта на форуме, либо полностью переместив пользователей на форум.
Итак, сразу приведу готовый вариант кода, а затем объясню основные его части более подробно.
- Код: Выделить всё
<?php
/**
* Add user to forum © FladeX
*/
define('IN_PHPBB', true);
$phpbb_root_path = (defined('PHPBB_ROOT_PATH')) ? PHPBB_ROOT_PATH : './forum/';
$phpEx = substr(strrchr(__FILE__, '.'), 1);
include($phpbb_root_path . 'common.' . $phpEx);
include($phpbb_root_path . 'includes/functions_user.' . $phpEx);
// User's data
$user_row['username'] = 'test_user';
$user_row['user_password'] = phpbb_hash("forumadmins.ru");
$user_row['user_email'] = 'mail@example.com';
$user_row['group_id'] = 2;
$user_row['user_type'] = 0;
// Adding user
user_add($user_row, false);
?>
Первым делом нужно задать константу IN_PHPBB - без неё скрипт просто прекратит выполнение. Затем указывается папка с форумом. В моём случае форум был в папке forum, а скрипт располагался в корне сайта, то бишь на один уровень выше. Переменная $phpEx содержит расширение файлов скриптов, почти всегда это php, поэтому данную строку менять не надо.
Определив все константы, подключаем необходимые нам файлы. В common.php содержатся почти все основные параметры, нужные phpBB для работы, поэтому его подключаем в первую очередь. Вообще при написании каких-либо дополнений для phpBB обязательно подключайте этот файл, без него никак. Затем нам понадобится файл, содержащий набор функций для работы с пользователями - это functions_user.php из папки includes.
Теперь всё готово к работе и мы можем добавить пользователя на форум. Для этого нужно указать логин пользователя, пароль и почту. В примере в качестве логина используется test_user, в качестве пароля forumadmins.ru, а в качестве почты mail@example.com. При использовании для собственных нужд подставляйте туда нужные вам данные, например полученные от формы регистрации на сайте. Ещё два параметра, которые я не упомянул, это group_id и user_type, их значение постоянное. Группа под номером 2 соответствует группе "Зарегистрированные пользователи", а тип пользователя 0 - активированному пользователю. В завершении вызываем функцию user_add и передаём ей в качестве аргумента массив с вышеперечисленными данными пользователя. Всё, новый пользователь появился на форуме, может логиниться и писать сообщения.
Уточню на всякий случай, почему нельзя добавлять пользователя напрямую через базу данных. Дело в сложной системе прав доступа и групп пользователей на форуме. Если добавить пользователя напрямую в таблицу phpbb_users, то у него не будет ни прав доступа, ни назначенных групп. Встроенная функция в phpBB для добавления пользователей учитывает всё это, поэтому при таком способе никаких проблем не будет.