У меня есть многомерный массив, который я хочу создать в цикле и вставить в базу данных mysql значения в массиве.
Значения массива, которые мне нужно вставить в запрос sql, следующие:
candles[0][complete], candles[0][volume], candles[0][mid][h], candles[0][mid][l], candles[0][mid][c]
candles[1][complete], candles[1][volume], candles[1][mid][h], candles[1][mid][l], candles[1][mid][c]
candles[2][complete], candles[2][volume], candles[2][mid][h], candles[2][mid][l], candles[2][mid][c]
Массив:
$get_instruments_candles = Array
(
[instrument] => EUR_USD
[granularity] => H4
[candles] => Array
(
[0] => Array
(
[complete] => 1
[volume] => 4491
[time] => 2009-01-01T22:00:00.000000000Z
[bid] => Array
(
[o] => 1.40390
[h] => 1.40515
[l] => 1.39445
[c] => 1.39540
)
[mid] => Array
(
[o] => 1.40440
[h] => 1.40565
[l] => 1.39470
[c] => 1.39565
)
[ask] => Array
(
[o] => 1.40490
[h] => 1.40615
[l] => 1.39495
[c] => 1.39590
)
)
[1] => Array
(
[complete] => 1
[volume] => 6866
[time] => 2009-01-02T02:00:00.000000000Z
[bid] => Array
(
[o] => 1.39545
[h] => 1.39690
[l] => 1.38447
[c] => 1.38641
)
[mid] => Array
(
[o] => 1.39570
[h] => 1.39715
[l] => 1.38472
[c] => 1.38666
)
[ask] => Array
(
[o] => 1.39595
[h] => 1.39740
[l] => 1.38497
[c] => 1.38691
)
)
[2] => Array
(
[complete] => 1
[volume] => 12529
[time] => 2009-01-02T06:00:00.000000000Z
[bid] => Array
(
[o] => 1.38635
[h] => 1.39679
[l] => 1.38391
[c] => 1.39471
)
[mid] => Array
(
[o] => 1.38660
[h] => 1.39688
[l] => 1.38400
[c] => 1.39480
)
[ask] => Array
(
[o] => 1.38685
[h] => 1.39697
[l] => 1.38409
[c] => 1.39489
)
)
)
)
Этот массив может состоять из до 5000 значений Candle [], поэтому мне нужно найти лучший способ выполнить цикл foreach или while в php для запуска, выбрасывает значения массива и выполняет вставку MySQL
// connect to mysql database
// Do a loop to create and insert the values into database
// Create sql Query to insert. [0] would be changed to arrays value 0,1,2,3,etc
$sql = "INSERT INTO table (complete, volume, high, low, close)
VALUES ('{candles[0][complete]}','{candles[0][volume]}','{candles[0][mid][h]}','{candles[0][mid][l]}','{candles[0][mid][c]}')";






Вы можете использовать цикл foreach, а затем обратиться к текущему элементу цикла. Лучше всего использовать подготовленное заявление. Вот версия PDO:
$stmt = $link->prepare("INSERT INTO table (complete, volume, high, low, close)
VALUES (:complete, :volume, :high, :low, :close)";
$stmt->bindParam(':complete', $complete);
$stmt->bindParam(':volumn', $volume);
$stmt->bindParam(':high', $high);
$stmt->bindParam(':low', $low);
$stmt->bindParam(':close', $close);
foreach ($get_instrument_candles['candles'] as $candle) {
$complete = $candle['complete'];
$volume = $candle['volume'];
$high = $candle['mid']['h'];
$low = $candle['mid']['l'];
$close = $candle['mid']['c'];
$stmt->execute();
}
Версия mysqli будет выглядеть так:
$complete = $volume = $high = $low = $close = null;
$stmt = $link->prepare("INSERT INTO table (complete, volume, high, low, close)
VALUES (?, ?, ?, ?, ?)";
$stmt->bind_param("iiiii", $complete, $volume, $high, $low, $close);
Цикл foreach такой же, как и для PDO.
Возможно, если вы выровняете имена заполнителей со структурой ассоциативного массива, вы можете просто execute() напрямую противостоять этому.
@tadman Похоже на ответ публичного API, поэтому он, вероятно, не имеет большого контроля над структурой.
Это правда, хотя было бы неплохо, если бы на это можно было положиться.
спасибо за быстрый ответ, это решает проблему доступа к массиву
Другой подход (при условии, что вы доверяете входным данным) - это создание одного большого запроса INSERT. Максимальный размер запроса (установленный max_allowed_packet, по умолчанию 4 МБ для MySQL <8.0.2) должен быть более чем достаточным для вставки данных для 5000 свечей. Итак, код будет выглядеть так:
$sql = "INSERT INTO table (complete, volume, high, low, close) VALUES ";
foreach ($get_instrument_candles['candles'] as $candle) {
$sql .= "({$candle['complete']}, {$candle['volume']}, {$candle['mid']['h']}, {$candle['mid']['l']}, {$candle['mid']['c']}),";
}
// strip the trailing comma
$sql = substr($sql, 0, -1);
Если вы не можете быть уверены, что входные данные безопасны, лучше всего использовать подготовленный оператор @Barmar.
массив api безопасен, поэтому вставка, о которой вы упомянули, является хорошим вариантом, мне нужно сделать несколько проверок, если данные уже сохранены, а затем просто добавить, как вы упомянули
Если у вас есть уникальный ключ для данных, вы можете просто использовать INSERT IGNORE и не беспокоиться о том, чтобы проверить, сохранен ли он уже.
Решил ли один из этих ответов вашу проблему? Если да, отметьте ответ как принятый (зеленая стрелка под стрелками голосов «за» / «против»). В противном случае вы можете предоставить дополнительную информацию, которая поможет решить проблему. См. stackoverflow.com/help/someone-answers