#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()
параметра в заполнители. Но это менее многословно.