Самым простым (короткий, понятный код) способом записать полученные из POST данные в MySQL сохранив названия полей?
Прошу помощи!
От сервиса приема платежей, html запросом на мой push.php приходят данные вида:
{"SALEDATE":"2021-08-25 4:11:32", "REFNO":"23456", "REFNOEXT":"", "ORDERNO":"7", ...., ,
"HASH":"4aa30dc0d6f67293bee9cee168b90524"}
в которых больше 50 полей. За один раз приходит только один набор данных (одна строка БД)
Мне нужно все эти поля (их там больше 50 штук) записать в БД MySQL в столбцы с такими же именами. Во всех примерах предлагают конструкцию, где каждый параметр POST (!)вручную нужно ассоциировать с нужным полем БД
Но это же как то неправильно, что ли... есть ли какой то "правильный" способ записать все полученное в POST в поля БД в столбцы с теми же именами?
Целостность полученных данных предварительно проверяется через HASH. Соответственно, есть 100% уверенность, что все поля БД в пришедшем POST будут в наличии и с правильным форматом данных
=======================
Немного усложню задачу, но это дополнительно и не обязательно. К примеру поля ORDERNO и REFNO в БД писать не нужно и в БД нет колонок с такими именами. Т.е. пишем только те данные из POST, которые есть в таблице.
Ответы (2 шт):
каждый параметр POST (!)вручную нужно ассоциировать с нужным полем БД
Это проблему легко решить, если применить такую штуку как программирование.
То есть мы пишем небольшую программу, которая собирает запрос для нас.
Нам нужен будет только список имён полей, которые мы хотим добавить в запрос. Как для того чтобы вставлять только нужные, так и для безопасности. Поскольку без такого списка мы тут же нарвёмся на SQL инъекцию.
После этого мы легко сможем получить список имён полей через запятую, отформатированный для mysql, ну а получить строку из знаков вопроса и совсем просто. Таким образом мы получим готовый к исполнению запрос
INSERT INTO table (поля через запятую) VALUES (?,?, ...)
Ну и собственно код:
$columns = ["SALEDATE", "REFNO", "REFNOEXT", "ORDERNO", ...,];
$insert = '';
$values = '';
$params = [];
foreach ($columns as $col) {
if (isset($input[$col])) {
$insert .= ($insert ? "," : "") . "`$col`";
$values .= ($values ? "," : "") . "?";
$params[] = $input[$col];
}
}
$sql = "INSERT INTO table ($insert) VALUES ($values)";
дальше обычным порядком выполняем запрос, например для PDO (и mysqli начиная с версии 8.1)
$pdo->prepare($sql)->execute($params);
или mysqli старых версий:
$stmt = $db->prepare($sql);
$types = $types ?: str_repeat("s", count($params));
$stmt->bind_param($types, ...$params);
$stmt->execute();
CREATE PROCEDURE parse_and_save_json_to_table (param JSON)
BEGIN
SELECT CONCAT('INSERT INTO test SET ',
GROUP_CONCAT(columnname,
'=''',
JSON_UNQUOTE(JSON_EXTRACT(param, CONCAT('$.', columnname))),
'''')) query
FROM JSON_TABLE(JSON_KEYS(param),
'$[*]' COLUMNS( columnname VARCHAR(64) PATH '$')) columns
INTO @sql;
PREPARE stmt FROM @sql;
EXECUTE stmt;
DROP PREPARE stmt;
END
По просьбе товарища @Ипатьев - DEMO с универсальным решением, которому чхать на символы, требующие экранирования.