【问题标题】:Prepared statement : update only if field is set准备好的语句:仅在设置字段时更新
【发布时间】:2019-10-20 20:43:53
【问题描述】:

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

表格字段很多,在表单中提交的只有少数

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

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

【问题讨论】:

  • 您是否尝试过使用命名绑定而不是问号?
  • @boyd 是什么意思?
  • 命名参数:php.net/manual/en/pdo.prepare.php$query->debugDumpParams(); 的输出是你所期望的吗? php.net/manual/en/pdostatement.debugdumpparams.php
  • @boyd 我试过了,但它也不起作用。我还添加了查询的输出。
  • 问题正文与问题标题相矛盾。所以你不想更新或者想用一些固定值更新(后者在我眼里没有意义)?

标签: php pdo prepared-statement


【解决方案1】:

由于这是我第一次在 PHP 中使用准备好的语句,我花了很长时间才意识到我们不能直接在 bindValue 中使用字符串横向。所以解决方案是将值存储在一个变量中,就像这样:

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

我希望有人可以解释这种行为。

【讨论】:

  • 这个答案是错误的。这仅适用于 bindparam,但 OP 使用的是 bindvalue
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-01
  • 1970-01-01
  • 2013-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多