Повторяющиеся имена столбцов в подготовленной инструкции и выполнении

#php #sqlite #pdo #prepared-statement

Вопрос:

$_POST['data'] содержит an id и другие поля, которые необходимо вставить в строку базы данных с этим id .

Есть ли способ избежать избыточности в этом коде:

 $data =  json_decode($_POST['data'], true);
$db = new PDO('sqlite:data.db');
$stmt = $db->prepare("UPDATE test SET a=?, b=?, c=?, d=?, e=?, f=? WHERE id=?");
$stmt->execute(array($data['a'], $data['b'], $data['c'], $data['d'], $data['e'], $data['f'], $data['id']));
 

Как избежать повторения имен столбцов a , …, f дважды, один раз в подготовленном операторе и один раз в массиве?

Можем ли мы полностью избежать жесткого кодирования имен столбцов a , …, f , и просто вывести их из ключей $data массива?

Комментарии:

1. Вы можете написать функцию, которая принимает словарь в качестве аргумента и динамически создает SQL из ключей словаря.

2. Нет ничего встроенного, что могло бы это сделать. Может быть, вам стоит использовать ORM.

3. «и просто выведите их из ключей массива данных$?» Да, вы можете это сделать. А стоит ли? Зависит от того, доверяете ли вы входным данным. Если вы хотите обновить столбцы только с a по f, но вы пишете универсальный конструктор запросов, то пользователи вашего API смогут обновить любой столбец, просто включив их в JSON.

4. @Barmar Без написания моих собственных «вспомогательных» функций util или использования ORM, является ли текущий код в моем вопросе самым коротким, который мы можем иметь со встроенными функциями?

5. Как я уже сказал, нет ничего встроенного, что делало бы это проще.

Ответ №1:

Вы можете сделать это немного проще, используя именованные заполнители, а не ? . Тогда вы можете просто передать $data в качестве аргумента execute()

 $stmt = $db->prepare("UPDATE test SET a=:a, b=:b, c=B, d=:d, e=:e, f=:f WHERE id=:id");
$stmt->execute($data);
 

Это просто перемещает избыточность из execute() параметра в заполнители. Но это менее многословно.