Как добавить пользователей напрямую

Список разделов phpBBex 1.x (поддерживается) Поддержка 1.x

Описание: У вас проблемы с phpBBex 1.x и вам необходима помощь? Спрашивайте здесь!
Правила раздела: Одна тема — один вопрос или группа связанных вопросов. Обязательно формируйте внятный заголовок, максимально отражающий суть вопроса. Подробно описывайте проблему. Не забудьте указать версию phpBBex и какие моды установлены, по возможности добавьте скриншоты проблемы или ссылку на страницу с проблемой.
Модератор: Поддержка

Сообщение #1 ЖЪРЧИК » 16.11.2014, 19:10

Нашел скрипт такой:
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&amp;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 для добавления пользователей учитывает всё это, поэтому при таком способе никаких проблем не будет.
Последний раз редактировалось ЖЪРЧИК 16.11.2014, 20:19, всего редактировалось 4 раз(а).
ЖЪРЧИК
Автор темы
Аватара
Репутация: 174
С нами: 10 лет 3 месяца

Сообщение #2 Sumanai » 16.11.2014, 19:13

ЖЪРЧИК:На нашем движке вот что пишет...

А на оригинальном? Кириллица в именах?
Sumanai M
Аватара
Репутация: 1677
С нами: 11 лет 9 месяцев

Сообщение #3 ЖЪРЧИК » 16.11.2014, 19:14

Sumanai, Да, хотелось бы сохранить. На оригинальном не проверял.
ЖЪРЧИК
Автор темы
Аватара
Репутация: 174
С нами: 10 лет 3 месяца

Сообщение #4 Sumanai » 16.11.2014, 19:30

Ну так проверьте. Кажется оно с кириллицей вообще работать не будет.
Sumanai M
Аватара
Репутация: 1677
С нами: 11 лет 9 месяцев

Сообщение #5 ЖЪРЧИК » 16.11.2014, 19:36

Код: Выделить всё
Общая ошибка
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]/phpbb/db/driver/driver.php
LINE: 855
CALL: trigger_error()

FILE: [ROOT]/phpbb/db/driver/mysqli.php
LINE: 194
CALL: phpbb\db\driver\driver->sql_error()

FILE: [ROOT]/phpbb/db/driver/factory.php
LINE: 329
CALL: phpbb\db\driver\mysqli->sql_query()

FILE: [ROOT]/includes/functions_user.php
LINE: 275
CALL: phpbb\db\driver\factory->sql_query()

FILE: [ROOT]/users_add.php
LINE: 57
CALL: user_add()

:cry:
ЖЪРЧИК
Автор темы
Аватара
Репутация: 174
С нами: 10 лет 3 месяца

Сообщение #6 Sumanai » 16.11.2014, 19:40

Ищите рабочий, что ещё могу сказать.
Sumanai M
Аватара
Репутация: 1677
С нами: 11 лет 9 месяцев

Сообщение #7 ЖЪРЧИК » 16.11.2014, 19:44

Код: Выделить всё
Общая ошибка
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()

Тоже самое, если ники латиницей. :think:

Добавлено спустя 12 минут 15 секунд:
Не хватает фичи для добавления юзеров или рабочего скрипта... :oops:
Ладно, пороемся дальше...
ЖЪРЧИК
Автор темы
Аватара
Репутация: 174
С нами: 10 лет 3 месяца

Сообщение #8 Sumanai » 16.11.2014, 19:57

STK? Правда на 3.1 его нет.
Sumanai M
Аватара
Репутация: 1677
С нами: 11 лет 9 месяцев

Сообщение #9 ЖЪРЧИК » 16.11.2014, 20:09

Sumanai, прочел уже, а универсального способа нет для нового и старого? через phpmyadmin какие таблицы заполнять, коль вручную взяться?
ЖЪРЧИК
Автор темы
Аватара
Репутация: 174
С нами: 10 лет 3 месяца

Сообщение #10 Sumanai » 16.11.2014, 20:41

Конечно нету, в 3.1 много изменений.
Sumanai M
Аватара
Репутация: 1677
С нами: 11 лет 9 месяцев

Сообщение #11 dnHyper » 16.11.2014, 23:21

Я писал скрипт-граббер выдеравший с Юкоз форума всё (темы, пользователей, почты…) :oops: Проще говоря делающий локальную копию (не было доступа к бэкапам, а админ форума то ли забухал то ли помер, хз).

Так вот, по опыту полученному от процесса написания оного скажу, — использовать нужно только user_add. Никаких прямых включений в БД. Никаких кусков из интернета с «рабочими» кодами. Я их натестировался вдостоль и они в 90% случаев оказались говном :rambo: .

Лишь добавляя через user_add новых пользователей можно избавить себя от дальнейшей головной боли с правами, невозможностью зайти юзверю и т.д.

Так ша удачи :clap:
dnHyper
Репутация: 46
С нами: 11 лет 7 месяцев

Сообщение #12 ЖЪРЧИК » 17.11.2014, 00:01

:think: осталось дело за малым - подождать, когда напишут такой скрипт и гайд. :insane:
ЖЪРЧИК
Автор темы
Аватара
Репутация: 174
С нами: 10 лет 3 месяца

Сообщение #13 dnHyper » 17.11.2014, 00:58

Ну если я найду в залежах код которым импортились юзвери, то протестирую и поделюсь. Но это точно не дело завтрашнего дня :hi:
dnHyper
Репутация: 46
С нами: 11 лет 7 месяцев


Вернуться в Поддержка 1.x