Форум программистов, компьютерный форум, киберфорум
PHP для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.53/15: Рейтинг темы: голосов - 15, средняя оценка - 4.53
 Аватар для Сергей1980
547 / 377 / 16
Регистрация: 17.12.2009
Сообщений: 991

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

23.01.2020, 22:18. Показов 3678. Ответов 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
Сообщений: 991
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
Сообщений: 991
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
Сообщений: 991
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
Сообщений: 991
25.01.2020, 16:15  [ТС]
Да, вы правы, ради эксперимента велосипед назвал как "велосипед". Не прошло. Можно попробовать в квадратные скобки засунуть, сейчас попробую.
0
 Аватар для Сергей1980
547 / 377 / 16
Регистрация: 17.12.2009
Сообщений: 991
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
Сообщений: 991
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
Сообщений: 991
25.01.2020, 18:32  [ТС]
хочется дожать свою функцию, без prepared
0
Эксперт PHP
3899 / 3237 / 1353
Регистрация: 01.08.2012
Сообщений: 10,909
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
Сообщений: 991
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
3899 / 3237 / 1353
Регистрация: 01.08.2012
Сообщений: 10,909
25.01.2020, 19:02
Цитата Сообщение от Сергей1980 Посмотреть сообщение
addslashes
https://www.php.net/manual/ru/... lashes.php
Прочитайте абзац, который чуть выше заголовка "Список параметров".

И названия столбцов тоже надо фильтровать. Например, регуляркой удалять всё кроме англ. букв и подчёркиваний.
1
 Аватар для Сергей1980
547 / 377 / 16
Регистрация: 17.12.2009
Сообщений: 991
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
3899 / 3237 / 1353
Регистрация: 01.08.2012
Сообщений: 10,909
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
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! в-строка - входное арифметическое выражение в инфиксной(обычной). . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru