Самым простым (короткий, понятный код) способом записать полученные из 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();
→ Ссылка
Автор решения: Akina
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


По просьбе товарища @Ипатьев - DEMO с универсальным решением, которому чхать на символы, требующие экранирования.

→ Ссылка