Аватар для Сергей1980
547 / 377 / 16
Регистрация: 17.12.2009
Сообщений: 994

Прием Json в качестве тела для последующего разбора и запроса типа UPDATE mysql

23.01.2020, 22:18. Показов 3766. Ответов 37

Студворк — интернет-сервис помощи студентам
Здравствуйте!
Подскажите пожалуйста, как лаконичней всего обработать Json и вставить данные из него в тело запроса передаваемого в mySql.

К примеру на страницу прилетает такой формат Json:

JSON
1
{"product_code":"1","product_name":"велосипед","product_price":"14000"}
Я хочу в php преобразовать данный Json в запрос на обновление, где ключом и индексом является "product_code":"1".

Чтобы из данного Json получился запрос mySql типа :

MySQL
1
UPDATE Products SET product_name="велосипед",product_price="14000" WHERE product_code="1"
Знаю, что есть лаконичные способы разбора Json средствами php c формированием запроса mySql, но не могу найти короткий.

Уверен, что в PHP уже давно появился встроенный сахар для таких манипуляций. Помогите плиз.
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
23.01.2020, 22:18
Ответы с готовыми решениями:

Почему метод GET не годится в качестве ajax-запроса для передачи json?
Здравстуйте. Сразу отмечу, что я в этом лишь новичек. Во-вторых, java тут, в большей степени, за уши притянута, но вполне возможно, что это...

Требуется рабочий пример для последующего разбора работы с observablecollection
Требуется рабочий пример для последующего разбора работы с observablecollection и его интерфейса INotifiPropertyChanged для сохранения,...

Можно ли использовать LINQ для разбора JSON?
У меня есть библиотека для "парсинга" JSON страницы, стыренная с http://json2csharp.com/#. Она выдает классы - скелеты для основы которая у...

37
 Аватар для Сергей1980
547 / 377 / 16
Регистрация: 17.12.2009
Сообщений: 994
25.01.2020, 15:48  [ТС]
Студворк — интернет-сервис помощи студентам
Рыжий лис, я до сих пор поражаюсь ,насколько семантически близок php и java)
Неплохой вариант, можно допилить потом в insert,delete. Положил в котомку)

Добавлено через 43 минуты
Цитата Сообщение от Рыжий Лис Посмотреть сообщение
В json прилетают все поля таблицы или некоторые могут отсутствовать?
я понимаю о чем вы.
Со стороны клиента прилетают уже нужные поля, которые надо обновлять. Завернутые в Json.
К примеру если у меня в форме на клиенте правится всего 4 поля (из 15ти существующих) , то только они и заворачиваются в Json вместе с ключевым полем и улетают на веб сервер.
Это я реализовал на стороне клиент Java.
Сервер принимает уже нужную строку Json с необходимым набором полей.
Которую потом разбирает и составляет запрос на обновление) Должен же и клиент поработать , не все тащить на сервер с последующим разбором.

Добавлено через 1 час 4 минуты
Чуть доработал функцию, установил проставление кавычек в формирующейся строке mySql, все работает, проверил на mySql:

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
function makeMysqlQuery($json,$tableName,$fieldCrit)
{
$keys=json_decode($json,true);
$criteria=null;// переменная для склейки условия после WHERE
$setBody=null; //переменная для склейки  после SET
foreach($keys as $fieldKey=>$fieldData){
  if ($fieldKey==$fieldCrit){
  $criteria= " WHERE "."\"$fieldCrit\""."="."\"$fieldData\"";  
  } else {
    $fldK="{$fieldKey}";
    $fldD="\"{$fieldData}\"";
    $setBody ="$fldK=$fldD".",".$setBody."";   
   }
} 
$query = "UPDATE ".$tableName." SET ".rtrim($setBody,",").$criteria;
echo $query;   
}
0
Просто Лис
Эксперт Python
 Аватар для Рыжий Лис
5973 / 3735 / 1099
Регистрация: 17.05.2012
Сообщений: 10,791
Записей в блоге: 9
25.01.2020, 15:53
https://www.php.net/manual/ru/... ection.php

Добавлено через 2 минуты
https://www.php.net/manual/ru/... string.php
1
 Аватар для Сергей1980
547 / 377 / 16
Регистрация: 17.12.2009
Сообщений: 994
25.01.2020, 16:04  [ТС]
Работаю через PDO , защита прописана на уровне mySql базы с ролями и пользователями, плюс как сами видите все движение идет через Json. С этой стороны SQL инъекция невозможна.
0
Просто Лис
Эксперт Python
 Аватар для Рыжий Лис
5973 / 3735 / 1099
Регистрация: 17.05.2012
Сообщений: 10,791
Записей в блоге: 9
25.01.2020, 16:08
Если вы продолжаете собирать sql руками - то инъекция возможна.

Добавлено через 33 секунды
Хотя, если вы доверяете данным в json...

Добавлено через 1 минуту
Речь даже не про инъекции, а про фильтрацию данных. Что произойдёт, если в имени товара будет содержаться двойная кавычка? Или одинарная?
0
 Аватар для Сергей1980
547 / 377 / 16
Регистрация: 17.12.2009
Сообщений: 994
25.01.2020, 16:12  [ТС]
Цитата Сообщение от Рыжий Лис Посмотреть сообщение
про фильтрацию данных. Что произойдёт, если в имени товара будет содержаться двойная кавычка? Или одинарная?
Так декодирование строки идет сначала, а только потом обертывание для передачи в mySql . Я за компом, давайте попробую ради интереса, эмулирую такую ситуацию. Сейчас опишусь
0
Просто Лис
Эксперт Python
 Аватар для Рыжий Лис
5973 / 3735 / 1099
Регистрация: 17.05.2012
Сообщений: 10,791
Записей в блоге: 9
25.01.2020, 16:15
PHP
1
makeMysqlQuery('{"product_code":"1","product_name":"велосипед \"рыжий\"","product_price":"14000"}', '1', '2');
Добавлено через 42 секунды
Так будет забавнее:
PHP
1
makeMysqlQuery('{"product_code":"1","product_name":"велосипед \"рыжий","product_price":"14000"}', '1', '2');
0
 Аватар для Сергей1980
547 / 377 / 16
Регистрация: 17.12.2009
Сообщений: 994
25.01.2020, 16:15  [ТС]
Да, вы правы, ради эксперимента велосипед назвал как "велосипед". Не прошло. Можно попробовать в квадратные скобки засунуть, сейчас попробую.
0
 Аватар для Сергей1980
547 / 377 / 16
Регистрация: 17.12.2009
Сообщений: 994
25.01.2020, 18:05  [ТС]
подскажите пожалуйста, как можно универсально экранировать входящее значение на MySql?

Ну к примеру ""ООО "Рога & Копытца "(// тратата //)" "

Добавлено через 16 минут
Или просто такого типа поле: ??Э"" ''/\ - """ &%^# передать на mysql как обычный текст

Добавлено через 1 час 13 минут
Разобрался, очень просто ларчик открывался, переписал метод:
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
function makeMysqlQuery($json,$tableName,$fieldCrit)
{
$keys=json_decode($json,true);
$criteria=null;// переменная для склейки условия после WHERE
$setBody=null; //переменная для склейки  после SET
foreach($keys as $fieldKey=>$fieldData){
  if ($fieldKey==$fieldCrit){
  $criteria= " WHERE "."\"$fieldCrit\""."="."\"$fieldData\"";  
  } else {
    $fldK="{$fieldKey}";
    $fldD="'"."{$fieldData}"."'";
    $setBody ="$fldK=$fldD".",".$setBody."";   
   }
} 
$query = "UPDATE ".$tableName." SET ".rtrim($setBody,",").$criteria;
echo $query;   
}
Добавлено через 5 минут
Красота, потестил на рабочей таблице, с большим количеством полей. Собрал значение как можно каверзное, залетело и обновилось на ура, созранный запрос типа:
UPDATE tbl_shipments SET svolume='',snetto='1535',sgross='2036',s hipment_complete='',eta_warehouse='2020-01-15',warehouse='Vnukovo',etd_custom='2020-01-13',eta_custom='2020-01-11',custom='Можайский',eta_pod='2020-01-10',etd_pol='2020-01-09',pod='Moscow',pol='New Delhi',shipment='тратата//;&*@#$$''""" ' ' \+- ())** .>^:::' WHERE "shipment_id"="35"
сервер сожрал и не поморщился.
Понимаю что можно было бы фигануть все при помощи bind и prepared statement , но тут выйдет масло масленное, и так подключение идет через PDO, а потом Json опять через него прогонять, думаю на существование данный пример имеет право.
0
Просто Лис
Эксперт Python
 Аватар для Рыжий Лис
5973 / 3735 / 1099
Регистрация: 17.05.2012
Сообщений: 10,791
Записей в блоге: 9
25.01.2020, 18:05
PHP
1
makeMysqlQuery('{"product_code":"1","product_name":"велосипед \'рыжий","product_price":"14000"}', '15', 'product_code');
0
 Аватар для Сергей1980
547 / 377 / 16
Регистрация: 17.12.2009
Сообщений: 994
25.01.2020, 18:13  [ТС]
в данном случае да, одинарная в начале и середине, как можно обойти?)
0
Просто Лис
Эксперт Python
 Аватар для Рыжий Лис
5973 / 3735 / 1099
Регистрация: 17.05.2012
Сообщений: 10,791
Записей в блоге: 9
25.01.2020, 18:30
Говорили уже:
Цитата Сообщение от Kerry_Jr Посмотреть сообщение
используйте подготовленные запросы.
А я даже пример привёл.
0
 Аватар для Сергей1980
547 / 377 / 16
Регистрация: 17.12.2009
Сообщений: 994
25.01.2020, 18:32  [ТС]
хочется дожать свою функцию, без prepared
0
Эксперт PHP
3900 / 3238 / 1353
Регистрация: 01.08.2012
Сообщений: 10,914
25.01.2020, 18:57
Цитата Сообщение от Сергей1980 Посмотреть сообщение
но ведь стопудово есть что то такое по умолчанию в PHP или близкое
Работа с БД в PHP вообще не особо удобная штука. Поэтому проще всего установить стороннюю библиотеку вроде https://github.com/catfan/Medoo , где вопросы удобства и безопасности давно продуманы.

Цитата Сообщение от Сергей1980 Посмотреть сообщение
свою функцию
Странное нежелание максимально обезопасить своё приложение.

Если без подготовленных запросов, тогда для экранирования в PDO есть своя функция:
https://www.php.net/manual/ru/pdo.quote.php
1
 Аватар для Сергей1980
547 / 377 / 16
Регистрация: 17.12.2009
Сообщений: 994
25.01.2020, 18:58  [ТС]
Дожал, по вашему каверзному примеру json отработало тоже)


PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
function makeMysqlQuery($json,$tableName,$fieldCrit)
{
$keys=json_decode($json,true);
$criteria=null;// переменная для склейки условия после WHERE
$setBody=null; //переменная для склейки  после SET
foreach($keys as $fieldKey=>$fieldData){
  if ($fieldKey==$fieldCrit){
  $criteria= " WHERE "."\"$fieldCrit\""."="."\"$fieldData\"";  
  } else {
    $fldK="{$fieldKey}";
    $fldD="'".addslashes($fieldData)."'";
    $setBody ="$fldK=$fldD".",".$setBody."";   
   }
} 
$query = "UPDATE ".$tableName." SET ".rtrim($setBody,",").$criteria;
echo $query;   
}
0
Просто Лис
Эксперт Python
 Аватар для Рыжий Лис
5973 / 3735 / 1099
Регистрация: 17.05.2012
Сообщений: 10,791
Записей в блоге: 9
25.01.2020, 19:01
PHP
1
makeMysqlQuery('{"product_code":"1\"","product_name":"велосипед","product_price":"14000"}', '15', 'product_code');
1
Эксперт PHP
3900 / 3238 / 1353
Регистрация: 01.08.2012
Сообщений: 10,914
25.01.2020, 19:02
Цитата Сообщение от Сергей1980 Посмотреть сообщение
addslashes
https://www.php.net/manual/ru/... lashes.php
Прочитайте абзац, который чуть выше заголовка "Список параметров".

И названия столбцов тоже надо фильтровать. Например, регуляркой удалять всё кроме англ. букв и подчёркиваний.
1
 Аватар для Сергей1980
547 / 377 / 16
Регистрация: 17.12.2009
Сообщений: 994
25.01.2020, 19:54  [ТС]
Цитата Сообщение от Рыжий Лис Посмотреть сообщение
makeMysqlQuery('{"product_code":"1"","pr oduct_name":"велосипед","product_price": "14000"}', '15', 'product_code');
Отработало вполне, скрипт выбросил exception , который у меня обрабатывается вполне и выводит echo "edit_error" )
Ваш пример , даже если и выполнится, затронет 0 строк на стороне mysql, это у меня тоже слушается)

Добавлено через 6 минут
Цитата Сообщение от Jodah Посмотреть сообщение
И названия столбцов тоже надо фильтровать. Например, регуляркой удалять всё кроме англ. букв и подчёркиваний.
да,спс,нужно прогнать регуляркой и сами ключи/названия столбцов. Можно в принципе вообще забить на json и организовать crud на xранимых процедурах одних,но пока мучаю json)

Добавлено через 30 минут
Цитата Сообщение от Jodah Посмотреть сообщение
Странное нежелание максимально обезопасить своё приложение.
Это отдельная функция, которую я сделал.
PDO у меня используется при аутентификации, так что с точки зрения инъекции тут рисков нет. Как и у всех есть риск взлома сессии если юзать через wifi (и то они все разные, так как я не пошел по пути хранения логина и пароля в сессии/либо в куках), а так хрен пробится.
0
Эксперт PHP
3900 / 3238 / 1353
Регистрация: 01.08.2012
Сообщений: 10,914
25.01.2020, 20:02
Цитата Сообщение от Сергей1980 Посмотреть сообщение
Это отдельная функция, которую я сделал.
Некорректно процитировал, я имел ввиду нежелание использовать подготовленные запросы. А так да, без сторонних библиотек приходится писать свои функции генерации запросов.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
25.01.2020, 20:02
Помогаю со студенческими работами здесь

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

Как mysql update выполнить через время после запроса?
у меня есть запрос который должен по истечению минуты только выполнять update а оно сразу выполняет игнорируя time ...

Проверка валидности разбора JSON (JSON.parse)
Пытаюсь разобрать некорректную json строку вот так: var response = JSON.parse(data); Как выполнить действия при условии что строка не...

Как создать автономную форму запроса для последующего занесения данных в БД Access ?
Проблема такая. Есть (точнее, будет) база Access. Структура базы проста: одна главная таблица, остальные подчинены непосредственно ей. Их...

Как обновить значение ключа в строке типа JSON mySQL
Доброго времени суток Форумчане. Возник вопрос такого рода. Есть таблица, в ней ячейка содержит объект JSON (его я записываю в ячейку...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
38
Ответ Создать тему
Опции темы

Новые блоги и статьи
Отчёт о затраченных материалах за определенный период с макетом печатной формы
Maks 21.04.2026
Отчёт из решения ниже размещён в конфигурации КА2. Задача: разработка отчёта по затраченным материалам за определённый период, с возможностью вывода печатной формы отчёта с шапкой и подвалом. В. . .
Отчёт о спецтехнике находящейся в ремонте
Maks 20.04.2026
Отчёт из решения ниже размещен в конфигурации КА2. Задача: отобразить спецтехнику, которая на данный момент находится в ремонте. Есть нетиповой документ "Заявка на ремонт спецтехники" который. . .
Памятка для бота и "визитка" для читателей "Semantic Universe Layer (Слой семантической вселенной)"
Hrethgir 19.04.2026
Сгенерировано для краткого описания по случаю сборки и компиляции скелета серверного приложения. И пусть после этого скажут, что статьи сгенерированные AI - туфта и не интересно. И это не реклама -. . .
Запрет удаления строк ТЧ документа при определённом условии
Maks 19.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "Аккумуляторы", разработанного в конфигурации КА2. У данного документа есть ТЧ, в которой в зависимости от прав доступа. . .
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru