PDO PHP: оставить в базе прежнее значение

135
08 февраля 2022, 13:30

Есть код:

$q = $db->prepare('UPDATE table1 SET val1 = :val1, val2 = :val2 WHERE name = :name');
$q->execute(array(':val1' => $_POST["val1"], ':name' => 'Example'));

Как видно из примера, я присваиваю новые значения val1 и val2. Проблема в том, что изменяемых ячеек у меня более 20, но часть из них может не требовать изменений (отсутствуют обновляемые значения). Можно сконструировать сам запрос и массив со значениями на if’ах, но это очень некрасиво.

Может, можно как-то по-другому? Чтобы в БД писались лишь те значения, которые получены?

Что-то вроде:

$values = ['val1' => $_POST["val1"], 'name' => 'Example'];
$values[:val2] = (isset($_POST["val2"])) ? $_POST["val2"] : null;
$q->execute($values);
Answer 1

@turambar Можно сделать по такому подобию.


$fields = [];
$params[':name'] = 'Example';
array_walk($$_POST, function ($value, $field) use(&$fields, &$params) {
    $fieldParam = ':' . $field;
    $fields[] = $field . ' = ' . $fieldParam;
    $params[$fieldParam] = $value;
});
$q = $db->prepare('UPDATE table1 SET ' . implode(', ', $fields) . ' WHERE name = :name');
$q->execute($params);
READ ALSO
While выводит только первую итерацию в цикле

While выводит только первую итерацию в цикле

Есть тестовый код в учебных целях, крутится на xampp:

71
Как правильно сделать sql запрос?

Как правильно сделать sql запрос?

Нужно что бы к каждой записи в блоге, отображались комментарии, оставленные непосредственно для записи

100
Проблема в ссылке на видео

Проблема в ссылке на видео

Озадачен вопросом и не мог понять и найти ответВот как выглядит моя ссылка и все работает хорошо

65