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

Board index phpBBex 1.x Поддержка

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

Post #1by ЖЪРЧИК » 16.11.2014, 19:10

Нашел скрипт такой:
1. Создаем CSV-файл следующего содержания:

Код:
Code: Select all
    "Пользователь 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:
Code: Select all
    <?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);.

Внимание! Никакой гарантии работоспособности данного скрипта не дается. За идею скрипта скажите спасибо вот этому чуваку.

На нашем движке вот что пишет...

Общая ошибка
Code: Select all
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 (). Ее синтаксис следующий:

Code: Select all
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:
Code: Select all
< ?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);
 
?>
Code: Select all
< ?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

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

Итак, сразу приведу готовый вариант кода, а затем объясню основные его части более подробно.
Code: Select all
<?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 для добавления пользователей учитывает всё это, поэтому при таком способе никаких проблем не будет.
Last edited by ЖЪРЧИК on 16.11.2014, 20:19, edited 4 times in total.
плешивый кот
ЖЪРЧИК
Topic author, Гуру
Avatar
Reputation: 174
With us: 5 years 4 months

Post #2by Sumanai » 16.11.2014, 19:13

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

А на оригинальном? Кириллица в именах?
Использование поиска продлевает жизнь.
Это форум поддержки форка phpBBex. Поддержка по phpBB осуществляется в других местах.
Sumanai M
Гуру
Avatar
Reputation: 1669
With us: 6 years 10 months

Post #3by ЖЪРЧИК » 16.11.2014, 19:14

Sumanai, Да, хотелось бы сохранить. На оригинальном не проверял.
плешивый кот
ЖЪРЧИК
Topic author, Гуру
Avatar
Reputation: 174
With us: 5 years 4 months

Post #4by Sumanai » 16.11.2014, 19:30

Ну так проверьте. Кажется оно с кириллицей вообще работать не будет.
Использование поиска продлевает жизнь.
Это форум поддержки форка phpBBex. Поддержка по phpBB осуществляется в других местах.
Sumanai M
Гуру
Avatar
Reputation: 1669
With us: 6 years 10 months

Post #5by ЖЪРЧИК » 16.11.2014, 19:36

Code: Select all
Общая ошибка
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:
плешивый кот
ЖЪРЧИК
Topic author, Гуру
Avatar
Reputation: 174
With us: 5 years 4 months

Post #6by Sumanai » 16.11.2014, 19:40

Ищите рабочий, что ещё могу сказать.
Использование поиска продлевает жизнь.
Это форум поддержки форка phpBBex. Поддержка по phpBB осуществляется в других местах.
Sumanai M
Гуру
Avatar
Reputation: 1669
With us: 6 years 10 months

Post #7by ЖЪРЧИК » 16.11.2014, 19:44

Code: Select all
Общая ошибка
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:

Added after 12 minutes 15 seconds:
Не хватает фичи для добавления юзеров или рабочего скрипта... :oops:
Ладно, пороемся дальше...
плешивый кот
ЖЪРЧИК
Topic author, Гуру
Avatar
Reputation: 174
With us: 5 years 4 months

Post #8by Sumanai » 16.11.2014, 19:57

STK? Правда на 3.1 его нет.
Использование поиска продлевает жизнь.
Это форум поддержки форка phpBBex. Поддержка по phpBB осуществляется в других местах.
Sumanai M
Гуру
Avatar
Reputation: 1669
With us: 6 years 10 months

Post #9by ЖЪРЧИК » 16.11.2014, 20:09

Sumanai, прочел уже, а универсального способа нет для нового и старого? через phpmyadmin какие таблицы заполнять, коль вручную взяться?
плешивый кот
ЖЪРЧИК
Topic author, Гуру
Avatar
Reputation: 174
With us: 5 years 4 months

Post #10by Sumanai » 16.11.2014, 20:41

Конечно нету, в 3.1 много изменений.
Использование поиска продлевает жизнь.
Это форум поддержки форка phpBBex. Поддержка по phpBB осуществляется в других местах.
Sumanai M
Гуру
Avatar
Reputation: 1669
With us: 6 years 10 months

Post #11by dnHyper » 16.11.2014, 23:21

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

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

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

Так ша удачи :clap:
:drunk: Человек и пароход :drunk:
dnHyper
Мастер
Reputation: 46
With us: 6 years 8 months

Post #12by ЖЪРЧИК » 17.11.2014, 00:01

:think: осталось дело за малым - подождать, когда напишут такой скрипт и гайд. :insane:
плешивый кот
ЖЪРЧИК
Topic author, Гуру
Avatar
Reputation: 174
With us: 5 years 4 months

Post #13by dnHyper » 17.11.2014, 00:58

Ну если я найду в залежах код которым импортились юзвери, то протестирую и поделюсь. Но это точно не дело завтрашнего дня :hi:
:drunk: Человек и пароход :drunk:
dnHyper
Мастер
Reputation: 46
With us: 6 years 8 months


Return to Поддержка