Подготовленный оператор: обновлять только если поле установлено - PullRequest
0 голосов
/ 20 октября 2019

Я пытаюсь обновить элемент в базе данных, используя подготовленные операторы.

В таблице много полей, и только некоторые из них представлены в виде

Я нашелчто я могу пропустить пустые поля, установив в качестве значения поля само имя поля.

UPDATE contacts set name=name, phone_number=phone_number .... WHERE id = 8;

Итак, сначала я предполагаю, что все поля отправлены;

$query = $db->prepare('UPDATE contacts set name = ?, phone_number = ? WHERE id = ?');

Затем я привязываю каждое поле к его значению, в зависимости от того, отправлено оно или нет

if (isset($name))
{
    $query->bindValue(1, $name);
}
else
{
    $query->bindValue(1, 'name');
}
if (isset($phone_number))
{
    $query->bindValue(2, $phone_number);
}
else
{
    $query->bindValue(2, 'phone_number');
}
$query->bindValue(3, $id);
$query->execute();

По какой-то причине, о которой я не знаю, ничего не обновляется, даже если запрос работает в phpmyadmin. Однако, это работает, только если все поля отправлены.

ОБНОВЛЕНИЕ

Я также пытался использовать именованные параметры, но, похоже, не работает:

$query = $db->prepare('UPDATE contacts set name = :name, phone_number = :phone_number WHERE id = :id');
if (isset($name))
{
    $query->bindValue(':name', $name);
}
else
{
    $query->bindValue(':name', 'name');
}
if (isset($phone_number))
{
    $query->bindValue(':phone_number', $phone_number);
}
else
{
    $query->bindValue(':phone_number', 'phone_number');
}
$query->bindValue(':id', $id);
$query->execute();

ВЫХОД

SQL: [77] UPDATE contacts set name = :name, phone_number = :phone_number WHERE id = :id
Params:  3
Key: Name: [5] :name
paramno=-1
name=[5] ":name"
is_param=1
param_type=2
Key: Name: [13] :phone_number
paramno=-1
name=[13] ":phone_number"
is_param=1
param_type=2
Key: Name: [3] :id
paramno=-1
name=[3] ":id"
is_param=1
param_type=2

1 Ответ

0 голосов
/ 21 октября 2019

Так как это мой первый опыт работы с подготовленными операторами в PHP, мне потребовалось много времени, чтобы понять, что мы не можем напрямую использовать строковые выражения в bindValue. Поэтому решение состояло в том, чтобы сохранить значение в переменной, например, так:

$temp = 'name';
$query->bindValue(':name', $temp);

Я надеюсь, что кто-то может объяснить это поведение.

...