Mecitan
@Mecitan
Уверенный пользователь клавиатуры

Как из JSON корректно передать данные в базу данных?

Здравствуйте! Есть файл, после парсинга. Я его считываю через file_get_content, далее отправляю в jsondecode(var, true). Получаю массив, который имеет следующие ключи:
-snippet
-amp
-date
-anchor
-link
Эти ключи так же будут являться полями в БД. На данный момент логика такая. Я объявляю переменные, которые будут содержать пустой массив $snippet = $amp = $date = $anchor = $link = [];. После прогоняю в foreach преобразованный json и записываю значения, примерно это будет выглядеть так:
foreach ($data as $item => $values) {
$snippet[] = $values;
$amp[] = $values;
$date[] = $values;
$anchor[] = $values;
$link[] = $values;
}

После этого преобразую их в строку и передам как значение VALUES в SQL запрос.

Вопрос собственно следующий. Будет ли такой подход верным или есть другой способ передачи данных в БД? Или надо на каждый новый массив описывать новый foreach?

P.S: В PHP пока ещё новичок. Данная задача решается для себя в целях обучения
  • Вопрос задан
  • 309 просмотров
Решения вопроса 1
ipatiev
@ipatiev Куратор тега PHP
Потомок старинного рода Ипатьевых-Колотитьевых
Немного подрихтуем ученический ответ Taulan Khatuaev

// Параметры подключения к БД, желательно держать в отдельном файле
$username = 'myusername';
$password = 'mypassword';
$dbname = 'mydatabase';
$dbhost = '127.0.0.1';

// Подключение к БД
$dsn = 'mysql:host=$dbhost;dbname=$bname;charset=utf8mb4';
$options = array(
    // Обязательно - режим информирования об ошибках
    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
); 
$pdo = new PDO($dsn, $username, $password, $options);

// Подготавливаем запрос
$stmt = $pdo->prepare("INSERT INTO mytable (snippet, amp, date, anchor, link)
                       VALUES (:snippet, :amp, :date, :anchor, :link)"
);

// Используем транзакцию для скорости и консистентности
$pdo->beginTransaction(); 
// Перебираем массив
foreach ($data as $values) {
    // Выполняем запрос с очередной порцией данных
    $stmt->execute($values);
}
// Завершаем транзакцию
$pdo->commit();
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
i229194964
@i229194964
Веб разработчик
// Подключение к БД
$dsn = 'mysql:host=localhost;dbname=mydatabase';
$username = 'myusername';
$password = 'mypassword';
$options = array(
    PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8',
); 
$pdo = new PDO($dsn, $username, $password, $options);

// Подготовленный запрос
$stmt = $pdo->prepare("INSERT INTO mytable (snippet, amp, date, anchor, link) VALUES (:snippet, :amp, :date, :anchor, :link)");

// Заполнение параметров запроса значениями из массива
foreach ($data as $values) {
    $stmt->bindParam(':snippet', $values['snippet']);
    $stmt->bindParam(':amp', $values['amp']);
    $stmt->bindParam(':date', $values['date']);
    $stmt->bindParam(':anchor', $values['anchor']);
    $stmt->bindParam(':link', $values['link']);
    
    // Выполнение запроса
    $stmt->execute();
}
Ответ написан
@iljaGolubev
Параметризированный запрос для безопасности, мульти-инсерт для скорости.
# Строку запроса нужно сформировать, добавив (?,?,?,?,?) по количеству элементов в массиве.
$sql = 'insert into table (snippet, amp, date, anchor, link) values (?,?,?,?,?), (?,?,?,?,?)...';
$stmt = $pdo->prepare ($sql);
# массив параметров - добавить все значения из $data так, чтобы порядок следования 
# совпадал с values (?,?,?,?,?) в $sql
#/// конечно не так как тут
$params =[$data[0]['snippet'],$data[0]['amp'],$data[0]['date'],$data[0]['anchor'],$data[0]['link'],...]
$stmt->execute($params);


В ответе выше VALUES (:snippet, :amp, :date, :anchor, :link) используются именованные параметры pdo. Из за этого приходится выполнять вставку в БД несколько раз. Запрос на вставку сразу нескольких строк выполнится быстрее.
(?,?,?,?,?) -анонимные (unnamed) параметры. Значения для них выбираются из массива параметров по порядку следования. Количество знаков ? и элементов в $params должно быть одинаковым.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы