Задать пароль пользователе в ручную. Новый пароль создаеться но валидация проходит только со старым.

Здравствуйте!
Что может зы проблема.
Редактирую профиль пользователя через самописную форму.
Когда обновляю пароль юзера. Следующим методом.

    if(empty($_POST['m_uep_pas'])==false &&  empty($_POST['m_uep_pasr'])==false){
    db_query("UPDATE users SET
        name =  '%s',
        pass =  '%s',
        mail =  '%s'
        WHERE users.uid=%d ;",
            $_POST['m_uep_name'],
            md5($_POST['m_uep_pas']),
            $_POST['m_uep_mail'],
            $user->uid
            );
}

Новый пароль в базу записывается(в МД5). Но когда делаю логофф возращаеться(в таблицу "users") старый пароль что не так?
Похоже эта процедура выполняется стандартной функцией друпал?

Коментарі

Сделал так...

$mm_new_pass = md5($_POST['m_uep_pas']);
    $m_new_user = array();
    $m_change = false;
    if(empty($_POST['m_uep_mail'])==false){
        $m_change = true;
        $m_new_user['name'] = $_POST['m_uep_name'];
    }
    if(empty($_POST['m_uep_pas'])==false &&  empty($_POST['m_uep_pasr'])==false)
    {
        $m_change = true;
        $m_new_user['pass'] = $mm_new_pass;
    }
 
    if(empty($_POST['m_uep_mail'])==false)
    {
        $m_change = true;
        $m_new_user['mail'] = $_POST['m_uep_mail'];
    }
 
    $m_new_user['status'] = 1;
    if($m_change)
    {
        user_save($user, $m_new_user);
    }

Но метод работает как то не стабильно.
Может быть есть другие методы?

неправильно вообще в самом начале - Зачем делать через самописную форму?
Можно стандартную форму вывести в любом месте, добавить к ней поля и изменить по разному

$_POST['m_uep_pas'] - отсюда ничего брать не нужно. Если вы все делаете через FORM API, то и результаты заполнения формы нужно драть из $form_state

Вот есть пошаговая инструкция работы с формами

Так же в Друпале есть стандарты кодирования, например, FALSE/TRUE/NULL - пишутся заглавными буквами.
Этот участок кода

if(empty($_POST['m_uep_mail'])==false)
    {

Лучше писать так: (возле равно пробелы, а скобка на одной строке с операторами, пробел после if)
if (empty($_POST['m_uep_mail']) == FALSE) {
Работать будут оба варианты, но единый формат легче понимаем сообществом

Зачем делать через самописную форму?

Ну вот появилась такая задача.

Форма "рисуется" не через форм API а выводиться в шаблоне.
через(hook_menu->>>return theme()) и так далее.
Там на форме около 30 полей. Большинство из них массивы.

Не ужели не как нельзя "припаять" пароль пользователю стандартным методом?
Или же перехватывать мою форма в form_alter() а потом добавлять поля ввода пароля?

ну так можно в любом месте выводить форму не шаблоном, а именно FORM API, это не просто конструктор, это еще и валидатор и проверка "чего там пользователи отправили" и в тоже время богатый выбор ХУКОВ
В вашем случае можно без Хук_алтер, можно вызвать конструктор формы - http://api.drupal.ru/api/function/user_register/6 он вернет базовую форму, далее вы добавляете нужные поля. добавляете свои обработчики и у вас готовая "правильная" форма

function my_module_form($form_state) {
  $form = user_register();
  //добавляем свои 30 полей
  return form;
}
 
function my_module_form_validate($form, &$form_state) {
  //проверяем что нужно
  user_register_validate($form, &$form_state);
}
 
function my_module_form_submit($form, &$form_state) {
  //сохраняем
  user_register_submit($form, &$form_state);
}

И кстати форма обрабатывается через hook_menu()+(POST+FILES)

Задача такая. Программно поменять ник и/или пароль пользователю.

так зарегистрировать или обновить?
Для обновить есть другая форма, которую можно подстроить под себя выше указанным способом.
И для поменять ник нужно еще проверить если у пользователя права менять ник "change own username" или если это админ, то "administer users"

1. Будь-яку форму необхідно створювати через FormAPI
2. Виводити в шаблоні також можна треба через drupal_get_form(). Якщо треба пишете для форми ф-ії темізаці. Але форма створюється через FormAPI
3. Що таке поле масив? О_о Поле є поле. В структурі FormAPI всі елементи дійсно, як масиви, але наскільки я розумію, Ви не використовуєте FormAPI.
4. Форма має обраблятись через функцію-обробник, а не через hook_menu

Рекомендую почитати Ван Дюка і доки на дру.орг. Просто Ви хочете реалізувати задачу не знаючи API, а це нереально.

Так задача проста обновление полей в таблице users

Вы установили "монстра" CMS и не пользуетесь теми мегабайтами кода которые постоянно выкушивают память сервера и нагружают мускул - это крайне неправильно!!!

FORM API и стандартные hook/validate/submit - это единоверное решение в Друпале!

Drupal делает откат моих изменений. Как это устранить?

Друпал не умеет делать откат :)
У него всего одна таблица с пользователями если там что-то изменить, то друпал не будет знать старое значение т.к. у него нет бекапов или архивов.
Возможно у вас запись не прошла успешно

Нет. Все таки делает.

Все вроде бы проблема решена.
Через
load_user()
save_user()

нет все таки не делает :)

А не делает для текущего пользователя из объекта global $user?
Или свободно загружаемого (user_load($my_user));?

Потому что я редактирую текущего пользователя global $user

Новый пароль в базу записывается(в МД5).
Но когда делаю логофф возращаеться(в таблицу "users") старый пароль что не так?

На основе чего сделаны 2 этих утверждения? Вы смотрели запись в БД?
И у Вас таблицы в БД - без префикса лежат? //в запросах все же лучше использовать {#table_name#} вместо #table_name#

Вы смотрели запись в БД?
Конечно.

Т.е. я правильно понимаю, что последовательность действий такова:
1. Вы открыли ПХПМайАдмин - и проверили, что хеш пароля в БД - старый.
2. Сделали апдейт пароля в скрипте.
3. Обновили ПХПМайАдмин - и хеш пароля стал другим.
4. Логофф с сайта
5. В ПХПМайАдмин хеш пароля вернулся на первоначальный.

//Естественно, вместо ПХПМайАдмин может выступать любой другой клиент к БД.

Просто если это все так, и Вы ненароком не правите другую БД, то... поведение очень странное. Попробуйте тогда взять чистую инсталляцию Друпала без модулей и добавить туда Ваш модуль и посмотреть как будет вести себя такая сборка.

Soul Вы все правильно поняли.