Как составить запрос UPDATE из массива?
Есть массив
['pole' => 'str',
'pole1' => 4,
'pole2' => 15]
Необходимо получить строчку и массив следующего вида
`pole` = ?, `pole1` = ?, `pole2` = ?
['str', 4, 15]
Это для запроса update в pdo
$PDO->SQL("UPDATE `table` set `pole` = ?, `pole1` = ?, `pole2` = ?", ['str', 4, 15])
В целом не трудно, просто если я сделаю, код длиною в том получиться. Через цикл массив перебрать...
Возможно есть более простой способ,не знаю будет ли работать если для второй строчки просто вставить массив какой он есть. Возможно не будет, поскольку ключи не порядковые...
В изначальном массиве, ключ это поле, а значение это то что в данное поле необходимо записать...
Ответы (1 шт):
Вариант 1, foreach:
Создайте пустой массив $q_fields_arr = []
Добавьте обрамленное значение в конец массива $q_fields_arr[] = "
$k = ?";
Соберите массив в строку, используя в качестве разделителя ", " implode(', ',$q_fields_arr)
$input = ['pole' => 'str',
'pole1' => 4,
'pole2' => 15];
$q_fields_arr = [];
foreach($input as $k=>$v){
$q_fields_arr[] = "`$k` = ?";
}
$q_fields = implode(', ',$q_fields_arr);
$q_vals = array_values($input);
print $q_fields.PHP_EOL;
print_r($q_vals);
Вариант 2, array_map:
Используйте array_keys
чтобы получить ключи.
Затем, чтобы перебрать все ключи - array_map
, в возвращаемом значении обрамляя нужным текстом ({key}
=?)
Затем implode
- чтобы сформировать из массива строку.
Функция array_values
вернёт вам значения массива, без именованных ключей.
<?php
$input = ['pole' => 'str',
'pole1' => 4,
'pole2' => 15];
$q_fields = implode(', ',array_map(function($k){
return "`$k` = ?";
},array_keys($input)));
$q_vals = array_values($input);
print $q_fields.PHP_EOL;
print_r($q_vals);
Результат
`pole` = ?, `pole1` = ?, `pole2` = ?
Array
(
[0] => str
[1] => 4
[2] => 15
)
Вариант 3: PDO Placeholders
В этом случае, нам не нужно убирать ключи из исходного массива.
<?php
// Enter your code here, enjoy!
$input = ['pole' => 'str',
'pole1' => 4,
'pole2' => 15];
$q_fields_arr = [];
foreach($input as $k=>$v){
$q_fields_arr[] = "`$k` = :$k";
}
$q_fields = implode(', ',$q_fields_arr);
print $q_fields.PHP_EOL;
print_r($input);
Результат:
`pole` = :pole, `pole1` = :pole1, `pole2` = :pole2
Array
(
[pole] => str
[pole1] => 4
[pole2] => 15
)
По просьбам телезрителей:
Тут implode вынесена в цикл. Если бы у нас был массив без ключей, мы бы могли делать проверку $k!=0
В данном случае, мы обращаемся к внутреннему указателю массива next()
, чтобы проверить, существует ли следующий элемент, чтобы избежать лишнего добавления разделителя ", "
Так же используется тернарный оператор if, исключельно для того, чтобы показать его существование )
<?php
// Enter your code here, enjoy!
$input = ['pole' => 'str',
'pole1' => 4,
'pole2' => 15];
$q_fields='';
$q_vals = [];
foreach($input as $k=>$v){
$q_fields.= "`$k` = ?".(next($input)?', ':'');
$q_val[]=$v;
}
print $q_fields.PHP_EOL;
print_r($q_val);