@9StarRu

Как найти соответствие по email и записать данные в базу из JSON?

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

Хочу запускать скрипт по крону и проверять соответствие email из json с email зарегистрированных на сайте пользователей dle_users - email.

Образец json данных:

[{"id":323,"userId":676,"createdAt":"2019-08-23T13:05:56.830Z","status":"APPROVED","currency":"RUR","paySystem":"visa","paySystemGroup":"creditCard","total":69.00,"ipAddress":"246.227.2.4","OneTimeOffer":false,"ware":{"id":812,"title":"Заголовок.","type":"DIGITAL","userId":728},"income":297.08,"customer":{"id":8832,"fio":"Петрович","email":"test@test.ru"}}, {"id":324,"userId":677,"createdAt":"2019-08-23T14:05:56.830Z","status":"APPROVED","currency":"RUR","paySystem":"visa","paySystemGroup":"creditCard","total":69.00,"ipAddress":"246.227.2.4","OneTimeOffer":false,"ware":{"id":813,"title":"Заголовок.","type":"DIGITAL","userId":729},"income":297.08,"customer":{"id":8833,"fio":"Петрович","email":"test2@test.ru"}}, {"id":325,"userId":678,"createdAt":"2019-08-23T15:05:56.830Z","status":"APPROVED","currency":"RUR","paySystem":"visa","paySystemGroup":"creditCard","total":69.00,"ipAddress":"246.227.2.4","OneTimeOffer":false,"ware":{"id":814,"title":"Заголовок.","type":"DIGITAL","userId":730},"income":297.08,"customer":{"id":8834,"fio":"Петрович","email":"test3@test.ru"}}]


Json дерево

aOcZG.png

Всего в json ответе 10 позиций.

Мне нужно записать в базу данные id, ware->id, ware->title, income если найдено соответствие по email адресу.

Т.е. как-то нужно из json брать email и искать, не зарегистрирован ли на dle сайте пользователь с данным email адресом и если найден данный адрес, необходимо из json получить данные id, ware->id, ware->title, income и сохранить их в базу dle_users, в таблицу данного пользователя.

На сайте может быть зарегистрировано несколько тысяч пользователей. Обращаться к Json хочу как можно чаще по cron, чтобы на сайте была всегда актуальная информация.

Как верно реализовать такой функционал, чтобы система не висла и при повторном обращении к json, ранее полученные данные вновь не добавлялись в базу (видимо нужно выполнить проверку по id из json, т.к. он уникален)?

Еще, очень важно, в образце базы я не добавил поля под id, ware->id, ware->title, income т.к. не знаю как сделать это верно, если проверять ранее размещенные данные, то id из json нужно сохранять так, чтобы он был уникальным...

Помогите разобраться, пожалуйста. Направьте в нужном направлении.

Спасибо.

Ниже дамп базы данных, таблица dle_users

--
-- Структура таблицы `dle_users`
--

CREATE TABLE `dle_users` (
  `email` varchar(50) NOT NULL DEFAULT '',
  `password` varchar(255) NOT NULL DEFAULT '',
  `name` varchar(40) NOT NULL DEFAULT '',
  `user_id` int(11) NOT NULL,
  `news_num` mediumint(8) NOT NULL DEFAULT '0',
  `comm_num` mediumint(8) NOT NULL DEFAULT '0',
  `user_group` smallint(5) NOT NULL DEFAULT '4',
  `lastdate` varchar(20) NOT NULL DEFAULT '',
  `reg_date` varchar(20) NOT NULL DEFAULT '',
  `banned` varchar(5) NOT NULL DEFAULT '',
  `allow_mail` tinyint(1) NOT NULL DEFAULT '1',
  `info` text NOT NULL,
  `signature` text NOT NULL,
  `foto` varchar(255) NOT NULL DEFAULT '',
  `fullname` varchar(100) NOT NULL DEFAULT '',
  `land` varchar(100) NOT NULL DEFAULT '',
  `favorites` text NOT NULL,
  `pm_all` smallint(5) NOT NULL DEFAULT '0',
  `pm_unread` smallint(5) NOT NULL DEFAULT '0',
  `time_limit` varchar(20) NOT NULL DEFAULT '',
  `xfields` text NOT NULL,
  `allowed_ip` varchar(255) NOT NULL DEFAULT '',
  `hash` varchar(32) NOT NULL DEFAULT '',
  `logged_ip` varchar(46) NOT NULL DEFAULT '',
  `restricted` tinyint(1) NOT NULL DEFAULT '0',
  `restricted_days` smallint(4) NOT NULL DEFAULT '0',
  `restricted_date` varchar(15) NOT NULL DEFAULT '',
  `timezone` varchar(100) NOT NULL DEFAULT '',
  `news_subscribe` tinyint(1) NOT NULL DEFAULT '0',
  `comments_reply_subscribe` tinyint(1) NOT NULL DEFAULT '0',
  `twofactor_auth` tinyint(1) NOT NULL DEFAULT '0',
  `cat_add` varchar(500) NOT NULL DEFAULT '',
  `cat_allow_addnews` varchar(500) NOT NULL DEFAULT ''
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4;

--
-- Дамп данных таблицы `dle_users`
--

INSERT INTO `dle_users` (`email`, `password`, `name`, `user_id`, `news_num`, `comm_num`, `user_group`, `lastdate`, `reg_date`, `banned`, `allow_mail`, `info`, `signature`, `foto`, `fullname`, `land`, `favorites`, `pm_all`, `pm_unread`, `time_limit`, `xfields`, `allowed_ip`, `hash`, `logged_ip`, `restricted`, `restricted_days`, `restricted_date`, `timezone`, `news_subscribe`, `comments_reply_subscribe`, `twofactor_auth`, `cat_add`, `cat_allow_addnews`) VALUES
('test2@test.ru', '$2y$10$HizMAqnS70XtPyOAhEOBZunFUr0sTf6BxuhAF.jF5064WmVSiInS2', 'Admin', 1, 5, 2, 1, '1566571668', '1566008190', '', 1, '', '', '', '', '', '', 0, 0, '', '', '', 'a5d5341fa03117f2046f5a0b8f1589d0', '33.212.78.120', 0, 0, '', '', 0, 0, 0, '', '');

--
-- Индексы сохранённых таблиц
--

--
-- Индексы таблицы `dle_users`
--
ALTER TABLE `dle_users`
  ADD PRIMARY KEY (`user_id`),
  ADD UNIQUE KEY `name` (`name`),
  ADD UNIQUE KEY `email` (`email`);

--
-- AUTO_INCREMENT для сохранённых таблиц
--

--
-- AUTO_INCREMENT для таблицы `dle_users`
--
ALTER TABLE `dle_users`
  MODIFY `user_id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=2;
COMMIT;
  • Вопрос задан
  • 93 просмотра
Решения вопроса 1
glaphire
@glaphire Куратор тега PHP
PHP developer
1.
Мне нужно записать в базу данные id, ware->id, ware->title, income если найдено соответствие по email адресу.
- добавьте в таблицу dle_users колонки под эти данные (с префиксом, чтобы отличать их от остальных колонок, например paym_id, paym_ware_id, paym_title, paym_income) или создайте новую таблицу payment_info с такими же колонками плюс user_id как foreign key на id из таблицы dle_users.
2.
На сайте может быть зарегистрировано несколько тысяч пользователей.
- несколько тысяч - это сколько?) До 10 тысяч? До 100 тысяч? Это имеет значение, это влияет на решения, принимаемые в п.1. Для большой таблицы с активными данными и частой записью лучше не делать alter table.
3.
Обращаться к Json хочу как можно чаще по cron
- наименьшая единица времени в кроне - 1 минута. Насколько часто Вам нужно? Иногда раз в полчаса вполне достаточно - не будет лишней нагрузки, но тут вопрос к бизнес требованиям - на что влияет актуальность этих данных.
4. По какому критерию Вы инициируете запрос к стороннему сервису? Как я вижу, что вы дергаете данные по одному платежу/пользователю, неизвестно, как сторонний сервис отреагирует на много запросов за один раз.
Скрипты по крону не имеют ограничения по времени исполнения, но могут зафейлится по потреблению ресурсов или по стабильности ответов от стороннего сервиса. В целом идея такая:
1. Дергаете стороннее апи, получаете json ответ. По какому критерию не делать лишние запросы - я не понимаю из Вашего задания, но предположительно по paym_id, которые еще не обработаны.
2. Парсите ответ через json_decode в массив.
3. Находим в массиве имейл, проверяем есть ли в dle_users. Если есть - добавляем paym_id, paym_ware_id, paym_title, paym_income в базу.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы