准备好的语句:仅在设置字段时更新
Prepared statement : update only if field is set
我正在尝试使用准备好的语句更新数据库中的元素。
table的字段很多,表单提交的只有少数
我发现我可以通过将字段的值设置为字段名称本身来跳过空字段。
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
由于这是我第一次在 PHP 中使用准备好的语句,所以我花了很长时间才意识到我们不能在 bindValue
中直接使用字符串分支。所以解决方案是像这样将值存储在变量中:
$temp = 'name';
$query->bindValue(':name', $temp);
我希望有人能解释这种行为。
我正在尝试使用准备好的语句更新数据库中的元素。
table的字段很多,表单提交的只有少数
我发现我可以通过将字段的值设置为字段名称本身来跳过空字段。
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
由于这是我第一次在 PHP 中使用准备好的语句,所以我花了很长时间才意识到我们不能在 bindValue
中直接使用字符串分支。所以解决方案是像这样将值存储在变量中:
$temp = 'name';
$query->bindValue(':name', $temp);
我希望有人能解释这种行为。