3

我有一个准备好的声明来更新几个字段。我从公式中获取数据,但并非所有字段都是必需的。所以可能有些字段没有设置。我将它们默认设置为 NULL。现在我不想用 NULL 覆盖旧值。如果它是 NULL,我如何告诉 MySql 不要更新该值?

$insert_stmt = $mysqli->prepare("
UPDATE members SET username=?, email=?,  $password=?, $random_salt=?, level=?, customerID=?, name=?, surname=?, phone=?, quantities=? WHERE id=?
");
$insert_stmt->bind_param('ssssissss', $username, $email, $password, $random_salt, $level, $customerID, $firstname, $surname, $phone);
$insert_stmt->execute();

在我的情况下,密码和 random_salt 值可能为 NULL。仅用 NULL 覆盖密码会非常糟糕;)

4

4 回答 4

5

您可以按如下方式更改您的查询:

UPDATE members SET
    username = IFNULL(?, username),
    email = IFNULL(?, email) -- and so on for all fields
WHERE...

首先检查参数的值并动态构建查询也可能更有效,仅包括您具有要更新的非空值的字段。

于 2013-06-14T07:15:20.340 回答
1

你可以试试这个:

$insert_stmt = $mysqli->prepare("UPDATE members SET username=?, email=?,  password=IF(LENGTH('?')=0, password, '?'), random_salt=IF(LENGTH('?')=0, random_salt, '?'), level=?, customerID=?, name=?, surname=?, phone=?, quantities=? WHERE id=?");

If 条件转换为:IF(< YOUR_CONDITION >, < VALUE_IF_TRUE >, < VALUE_IF_FALSE >)。

于 2013-06-14T07:29:33.687 回答
0

仔细阅读您的查询字段和数据。绑定中的字段集和数据集不匹配。

UPDATE members SET username=?, email=?,  $password=?, $random_salt=?, level=?, customerID=?, name=?, surname=?, phone=?, quantities=? WHERE id=?

$insert_stmt->bind_param('ssssissss', $username, $email, $level, $customerID, $firstname, $surname, $phone);

您的绑定列表没有:密码、random_salt、id

于 2013-06-14T07:09:57.447 回答
0

假设 id 是 PK 你可以使用:

INSERT INTO members (
    id,
    username,
    email,
    password,
    random_salt,
    level,
    customerID,
    name,
    surname,
    phone,
    quantities
) VALUES (
    ?,
    ?,
    ?,
    ?,
    ?,
    ?,
    ?,
    ?,
    ?,
    ?,
    ?
)   ON DUPLICATE KEY UPDATE
    username = IF(username <> '',VALUES(username),username),
    email = IF(email <> '',VALUES(email),email),
    password = IF(password <> '',VALUES(password),password)
    ...
于 2013-06-14T07:15:37.500 回答