Запрос смена группы пользователя

InstantCMS 2.X

Запрос смена группы пользователя

#1 29 ноября 2023 в 10:05

В списке пользователей, делаю кнопку, по нажатию выскакивает модалка и там редактирование данного пользователя, все поля работают для редактирования, а вот группу пользователя не могу сменить, видимо из за того что базе лежит массив, как правильно прописать запрос на обновление группы пользователя ?

щас пишу так - 
$sql .=    «UPDATE cms_users SET groups='$str' WHERE id=$sql_id_user»;

вот что именно мне нужно написать в $str'? что бы например поменять группу на группу с id 7? как то нужно использовать — cmsCore::arrayToYaml  ?

#2 29 ноября 2023 в 10:22
  1. cmsModel::arrayToYaml([7])

Но это оставит пользователя только в группе 7, из остальных групп которые у него ранее были он будет удален. 

#3 29 ноября 2023 в 11:41

щас тестирую пишет вот такую ошибку 

Error updating record: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'groups='--- — 7 ' WHERE id=4' at line 1

Добавлено спустя 18 минут

прописал так — $sql =    «UPDATE `cms_users` SET `groups` = '$str', `lock_until` = NULL 
WHERE `cms_users`.`id` = $sql_id_user;»;  

всё заработало! спасибо

Добавлено спустя 45 минут

так же такой вопрос

делаю запрос так

$model_users = cmsCore::getModel('users');
 
 $sql_data_podderski = $_POST[«data_podderski»];
 $sql_id_user = $_POST[«id_user»]; 
 $str = cmsModel::arrayToYaml([$_POST[«user_gruup»]]);
 
 $sql3 = «UPDATE `cms_users` SET `lock_until` = NULL, `data_podderska` = '$sql_data_podderski' 
 WHERE `cms_users`.`id` = $sql_id_user;»;
 $sql4 = «UPDATE `cms_users` SET `groups` = '$str', `lock_until` = NULL 
 WHERE `cms_users`.`id` = $sql_id_user;»;
 $result = $model_users->db->query($sql3);
 $result2 = $model_users->db->query($sql4);

тоесть по сути 2 запроса, можно ли как то объединить в один ?

и нужно ли закрывать в конце (отключатся от базы данных ) типа так — $mysqli->close();    -  или уже сам метод Model это делает за нас ?

#4 29 ноября 2023 в 12:22

тоесть по сути 2 запроса, можно ли как то объединить в один ?

No Name

Если в where у вас одинаковая фильтрация в запросах, то вы можете после SET через запятую прописать все поля таблицы бд, которые хотите изменить, как это сделано с полями  `lock_until` = NULL, `data_podderska` = '$sql_data_podderski' .

и нужно ли закрывать в конце (отключатся от базы данных ) типа так — $mysqli->close();    -  или уже сам метод Model это делает за нас ?

No Name

mysqli сделает это за вас.

А вот из $_POST сразу в базу я бы не рекомендовал писать. Надо хоть как-то проверять полученные данные.

#5 29 ноября 2023 в 12:49

Спасибо

А вот из $_POST сразу в базу я бы не рекомендовал писать. Надо хоть как-то проверять полученные данные.

Loadырь

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

#6 29 ноября 2023 в 13:22

No Name, строить SQL запросы руками в InstantCMS не нужно, если только вы точно знаете, что делаете. И если вы строите запрос руками, то должны ВСЕГДА экранировать переменные. InstantCMS экранирует автоматически, если использовать методы модели правильно.

Есть конструктор запросов, есть готовые методы модели. Не всё, но многое есть в документации по моделям и в целом контроллерам и получения входящих переменных.

То, что подсказал Loadырь не решит до конца, поскольку группы там хранятся более для информативности. Основная связь с группами хранится в таблице cms_users_groups_members.

  1. // Если писать в контроллере/экшене/хуке
  2. $this->model_users->updateUser($user_id, [
  3. 'groups' => [7],
  4. 'lock_until' => null
  5. ]);
#7 30 ноября 2023 в 07:54

 Fuze, большое спасибо, прочитав ваши рекомендации получи вот такой код, думаю теперь все норм ?

  1. <?php
  2. if ($_SERVER["REQUEST_METHOD"] == "POST") {
  3.  
  4. $model_users = cmsCore::getModel('users');
  5.  
  6. $sql_data_podderski = $_POST["data_podderski"];
  7. $sql_id_user = $_POST["id_user"];
  8. $sql_id_user_gruup = $_POST["user_gruup"];
  9.  
  10. $model_users->updateUser($sql_id_user, [
  11. 'data_podderska' => $sql_data_podderski,
  12. 'lock_until' => null
  13. ]);
  14. $model_users->updateUser($sql_id_user, [
  15. 'groups' => [$sql_id_user_gruup],
  16. 'lock_until' => null
  17. ]);
  18. header("Location: ".$_SERVER["HTTP_REFERER"]);
  19. }
  20. ?>
#8 30 ноября 2023 в 12:33

думаю теперь все норм

No Name

Нет. Используйте штатные методы InstantCMS. Как вместо $_POST, так и редиректы, например вместо

  1. header("Location: ".$_SERVER["HTTP_REFERER"]);

Использовать

  1. return $this->redirectBack();

Вместо

  1. $sql_data_podderski = $_POST["data_podderski"];

Использовать

  1. $sql_data_podderski = $this->request->get('data_podderski', '');

И считается хорошим тоном НЕ называть переменные транслитом. В вашем случае вместо sql_data_podderski лучше её назвать support_date.

Кроме того, вы зачем два раза обновляете? За один раз почему нет?

  1. $this->model_users->updateUser($user_id, [
  2. 'data_podderska' => $sql_data_podderski,
  3. 'groups' => [7],
  4. 'lock_until' => null
  5. ]);

Ну и немного надо бы вам матчасть подтянуть, сразу станет чуть понятней.

#9 30 ноября 2023 в 13:42

 Fuze, большое спасибо, все получилось, кроме return $this->redirectBack();, не знаю может быть то что всё в модальном окне у меня происходит, 

хотя header(«Location: ».$_SERVER[«HTTP_REFERER»]); отрабатывает норм

Вы не можете отвечать в этой теме.
Войдите или зарегистрируйтесь, чтобы писать на форуме.
Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.