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

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

23.01.2020, 22:18. Показов 3628. Ответов 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
Эксперт PHP
 Аватар для Kerry_Jr
3106 / 2591 / 1219
Регистрация: 14.05.2014
Сообщений: 7,236
Записей в блоге: 1
23.01.2020, 22:45
Сергей1980, json_decode
1
 Аватар для Сергей1980
547 / 377 / 16
Регистрация: 17.12.2009
Сообщений: 991
23.01.2020, 22:49  [ТС]
Спасибо, эта функция десериализует Json и загоняет его в массив. А дальше то что) Портянки и склеивание из массива строку mySql? Не, этот вариант я знаю. Нужно покороче , сто процентов есть покороче решение. К примеру при помощи JSON_SET, но я пока не могу разобраться, параллельно читаю.
0
Эксперт PHP
 Аватар для Kerry_Jr
3106 / 2591 / 1219
Регистрация: 14.05.2014
Сообщений: 7,236
Записей в блоге: 1
23.01.2020, 22:59
Сергей1980, для JSON_SET вроде столбец должен иметь тип JSON в БД.
1
 Аватар для Сергей1980
547 / 377 / 16
Регистрация: 17.12.2009
Сообщений: 991
23.01.2020, 23:07  [ТС]
Ага, разбираюсь потихоньку...это действительно не то.

Смысл моего поста очень простой, не хочу на стороне php расписывать присвоение ключей и собирать/склеивать из Json (json_decode) рабочую строку MySql , наверняка есть способ поэлегантней и самое главное покороче . Вот его и ищу)
0
Эксперт PHP
 Аватар для Kerry_Jr
3106 / 2591 / 1219
Регистрация: 14.05.2014
Сообщений: 7,236
Записей в блоге: 1
23.01.2020, 23:13
Сергей1980, не встречал код, который сам поймет, что нужно обновить, а что использовать как условие для обновления. Все равно придется парсить. Если не нравится идея со склейкой строк, используйте подготовленные запросы.
1
 Аватар для Сергей1980
547 / 377 / 16
Регистрация: 17.12.2009
Сообщений: 991
23.01.2020, 23:17  [ТС]
Нашел типа такого варианта, вроде короткий и норм:

PHP
1
2
3
4
5
6
$exchangeRates = json_decode($json, true);
foreach($exchangeRates['rates'] as $key => $value) {
if($value) {
    mysqli_query($mysql,"UPDATE currencies SET dblRateCAD = '".$value."' WHERE strCode = '". $key ."' LIMIT 1");
    }
}
0
1152 / 554 / 320
Регистрация: 21.06.2012
Сообщений: 1,854
23.01.2020, 23:21
Цитата Сообщение от Сергей1980 Посмотреть сообщение
{"product_code":"1","product_name":"вело сипед","product_price":"14000"}
Сергей1980, где здесь признак того что поле должно участвовать в условии выборки или оно должно просто редактироваться? А если в условии должно участвовать несколько полей?

В вашем случае вы можете только написать собственную функцию. Готовое "такое" не бывает.
0
 Аватар для Сергей1980
547 / 377 / 16
Регистрация: 17.12.2009
Сообщений: 991
23.01.2020, 23:32  [ТС]
я понимаю. А какое на ваш взгляд самое короткое решение в контексте моего конкретного Json и строки запроса? Можете по конкретной задаче помочь? Конкретным кодом.

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

Добавлено через 2 минуты
Цитата Сообщение от sasha0012 Посмотреть сообщение
где здесь признак того что поле должно участвовать в условии выборки
первый топик можете посмотреть в данной теме, там вопрос по конкретному Json и конкретному запросу)
0
1152 / 554 / 320
Регистрация: 21.06.2012
Сообщений: 1,854
23.01.2020, 23:41
ну если так, то тогда так:
PHP
1
2
3
4
5
$json_arr = json_decode('{"product_code":"1","product_name":"велосипед","product_price":"14000"}', true);
$filed = array_keys($json_arr);
$value = array_values($json_arr);
 
echo "UPDATE `Products` SET `$filed[1]`='$value[1]',`$filed[2]`='$value[2]' WHERE `$filed[0]`='$value[0]'";
как говориться, "ручной режим". Ну если структура не меняется, то нормально.
1
 Аватар для Сергей1980
547 / 377 / 16
Регистрация: 17.12.2009
Сообщений: 991
23.01.2020, 23:48  [ТС]
ну да, такой вариант я изначально в качетстве примеров и видал)

Хотел избавиться от ручного перечисления типа
PHP
1
 SET `$filed[1]`='$value[1]',`$filed[2]`='$value[2]'
Искал какую нибудь встроенную функцию в php, типа SuperFunctionUpdate ($json, $КлючИндексДляОбновления){...}

Лады, напишу свою функцию,не проблема, но ведь стопудово есть что то такое по умолчанию в PHP или близкое ))
0
1152 / 554 / 320
Регистрация: 21.06.2012
Сообщений: 1,854
24.01.2020, 00:04
Цитата Сообщение от Сергей1980 Посмотреть сообщение
но ведь стопудово есть что то такое
нет, и в принципе не может быть. И я написал почему. Только по приведённому примеру существует 9 корректных реализаций запроса, и как функция поймёт что куда прописывать. Тогда нужно в параметры подсказки пихать. В итоге получится какая-то адская функция. Хотя возможно кто-то её и написал, но я сильно сомневаюсь что она когда нибудь станет встроенной по умолчанию в PHP.

Добавлено через 2 минуты
Цитата Сообщение от sasha0012 Посмотреть сообщение
Хотя возможно кто-то её и написал
а если учитывать сколько конфигураций запросов существует, то нет, никто не написал...
1
 Аватар для Сергей1980
547 / 377 / 16
Регистрация: 17.12.2009
Сообщений: 991
24.01.2020, 00:14  [ТС]
ну так то да, вариантов развития событий море. Ну я себе наваяю функцию, ок, спс. Мне под стандартный crud с одним параметром полем в качестве обновления. Выложу. Клиентская часть на java Android, бэкэнд пишу на PHP. Собираю все операции CRUD в один кулак /страницу,чтобы потом можно было копипастить с минимальными правками.

Напишу ,выложу, может с вашей стороны опытным взглядом что нить подправить нужно будет.
0
 Аватар для Сергей1980
547 / 377 / 16
Регистрация: 17.12.2009
Сообщений: 991
24.01.2020, 23:16  [ТС]
Налепил, вот функция :

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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 {
   $setBody ="{$fieldKey}={$fieldData}".",".$setBody;   
   }
} 
$query = "UPDATE ".$tableName." SET ".rtrim($setBody,",").$criteria;
echo $query;   
}
При обращении к ней в аргументах нужно указать всего три параметра, входной Json,название таблицы, и поле критерий по которому выбирается строка для обновления.

Вызов простой, ну к примеру так:
PHP
1
2
3
4
5
$json = '{"product_code":"1","product_name":"велосипед","product_price":"14000"}';
$tableName="Products";
$fieldCrit="product_code";
 
makeMysqlQuery($json,$tableName,$fieldCrit);
и на выходе получается вот что:
MySQL
1
UPDATE Products SET product_price=14000,product_name=велосипед WHERE product_code=1
Надо апострофами наверное обернуть названия полей и сами данные. Пока в mySql не пихал, не тестировал.

Добавлено через 1 час 24 минуты
ребят, подскажите как на выходе получить переменную, чтобы она выводилась в echo к примеру в двойных кавычках?
Ну примеру чтобы
$myVar = "собака";
в echo выводилась в виде "собака" с двойными кавычками
0
1152 / 554 / 320
Регистрация: 21.06.2012
Сообщений: 1,854
25.01.2020, 11:05
PHP
1
2
3
$myVar = '"собака"';
//или
$myVar = "\"собака\"";
1
Просто Лис
Эксперт Python
 Аватар для Рыжий Лис
5972 / 3734 / 1099
Регистрация: 17.05.2012
Сообщений: 10,791
Записей в блоге: 9
25.01.2020, 13:01
PHP
1
2
3
4
5
6
7
8
9
<?php
$data = json_decode('{"product_code":"1","product_name":"велосипед","product_price":"14000"}');
 
$mysqli = new mysqli("example.com", "user", "password", "database");
$stmt = $mysqli->prepare('UPDATE Products SET product_name=?, product_price=? WHERE product_code=?');
$stmt->bind_param($data['product_name'], 1);
$stmt->bind_param($data['product_price'], 2);
$stmt->bind_param($data['product_code'], 3);
$stmt->execute();
1
Эксперт PHP
 Аватар для Kerry_Jr
3106 / 2591 / 1219
Регистрация: 14.05.2014
Сообщений: 7,236
Записей в блоге: 1
25.01.2020, 13:15
Цитата Сообщение от Kerry_Jr Посмотреть сообщение
Если не нравится идея со склейкой строк, используйте подготовленные запросы.
Рыжий Лис, предлагал уже, но почему-то совет остался без внимания.
0
Просто Лис
Эксперт Python
 Аватар для Рыжий Лис
5972 / 3734 / 1099
Регистрация: 17.05.2012
Сообщений: 10,791
Записей в блоге: 9
25.01.2020, 13:49
Лучший ответ Сообщение было отмечено Сергей1980 как решение

Решение

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
<?php
abstract class Model {
    protected static $table = null;
    protected static $fields = null;
    protected static $_sql_update = null;
 
    public static function init() {
        $list = array('UPDATE', static::$table, 'SET');
        $values = array();
        for ($i = 1; $i < count(static::$fields); $i++) {
            $values[] = static::$fields[$i] . '=?';
        }
        $list[] = implode(', ', $values);
        $list[] = 'WHERE';
        $list[] = static::$fields[0] . '=?';        
        self::$_sql_update = implode(' ', $list);
        # echo self::$_sql_update;
    }
 
    public function update($mysqli, $data) {
        $stmt = $mysqli->prepare(self::$_sql_update);
        for ($i = 1; $i < count(static::$fields); $i++) {
            $stmt->bind_param($data[static::$fields[$i]], $i);
        }
        $stmt->bind_param($data[static::$fields[0]], count(static::$fields) - 1);
        $stmt->execute();
    }
}
 
class Product extends Model {
    protected static $table = 'Products';
    protected static $fields = array('product_code', 'product_name', 'product_price');
}
Product::init();
 
#$mysqli = new mysqli("example.com", "user", "password", "database");
$data = json_decode('{"product_code":"1","product_name":"велосипед","product_price":"14000"}');
 
$p = new Product();
$p->update($mysqli, $data);
1
 Аватар для Сергей1980
547 / 377 / 16
Регистрация: 17.12.2009
Сообщений: 991
25.01.2020, 13:51  [ТС]
Да я функцию уже написал выше, которая сама из json формирует строку запроса на обновление, вне зависимости от того ,сколько полей принимается в json. В качестве аргументов достаточно указать строку json, название таблицы и поле критерий в запросе. Вопрос по сути снят.
У меня с клиента может прилететь порядка 20 полей строки, поэтому биндить и подготавливать под каждый конкретный запрос страницу не хотелось.
Написал уже сам универсальную функцию,которая сама раскручивает json, любой таблицы:
PHP
1
function makeMysqlQuery($json,$tableName,$fieldCrit)
Чуть выше выложил, не надо каждое поле таблицы/вьюхи перечислять. Само все генерится.
Вопрос закрыт.
Спасибо в любом случае за варианты и пример экранирования.
0
Просто Лис
Эксперт Python
 Аватар для Рыжий Лис
5972 / 3734 / 1099
Регистрация: 17.05.2012
Сообщений: 10,791
Записей в блоге: 9
25.01.2020, 13:55
В json прилетают все поля таблицы или некоторые могут отсутствовать?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
25.01.2020, 13:55
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит переходные токи и напряжения на элементах схемы. . . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru