Prepared statement:仅当设置了字段时才更新

问题描述 投票:0回答:1

我正在尝试使用准备好的语句来更新数据库中的元素。

表中有很多字段,只有少数字段以表格形式提交

我发现可以通过将字段的值设置为字段名称本身来跳过空白字段。

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中有效,也不会进行任何更新。但是,仅在所有字段都已提交的情况下才有效。

UPDATE

我也尝试过使用命名参数,但似乎不起作用:

$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
php pdo prepared-statement
1个回答
0
投票

由于这是我第一次使用PHP中的预处理语句,因此花了很长时间我才意识到我们不能直接在bindValuebindParam中使用字符串侧边。因此解决方案是将值存储在变量中,如下所示:

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

如果有人可以解释这种行为,那就太好了。

© www.soinside.com 2019 - 2024. All rights reserved.