【问题标题】:Escaping MySQL UPDATE (IF LENGTH)转义 MySQL 更新(如果长度)
【发布时间】:2018-12-28 08:01:33
【问题描述】:

我创建了一个仅当字符串长度大于 0 时才更新的 UPDATE 语句。

一旦满足条件,我会尝试在我的 UPDATE 语句中转义引号。我一直在使用addslashes($name),但在这个新条件下addslashes 不再有效。

上一个:

$mysqli->query("UPDATE table SET name='".addslashes($name)."' WHERE id=1") or die($mysqli->error);

当前:

$mysqli->query("UPDATE table SET name=IF(LENGTH($name)=0, name, '$name') WHERE id=1") or die($mysqli->error);

我在哪里放置 addslashes() 以使此函数正确转义字符?这个函数甚至可以在 PHP 的这个特定 MySQL 语句中工作吗?

【问题讨论】:

  • 您最好在 PHP 中执行此操作(检查字符串长度,如果不需要,不要运行更新)。也值得一看准备好的陈述。

标签: php mysql sql-update addslashes


【解决方案1】:

您的第二个查询的问题是,在对 LENGTH 的调用中的 $name 也需要用引号引起来,即

$mysqli->query("UPDATE table SET name=IF(LENGTH('$name')=0, name, '$name') WHERE id=1") or die($mysqli->error);

要在该查询中使用addslashes,您可以编写:

$mysqli->query("UPDATE table SET name=IF(LENGTH('".addslashes($name)."')=0, name, '".addslashes($name)."') WHERE id=1") or die($mysqli->error);

但实际上你应该考虑使用准备好的语句;那么你就不必担心转义引号了。此外,您应该检查 PHP 中 $name 的长度,如果它为空,则根本不运行查询。像这样的东西应该可以工作(我假设你有一个名为 $id 的变量,它存储更新的 id 值)。

if (strlen($name)) {
    $stmt = $mysqli->prepare("UPDATE table SET name=? WHERE id=?");
    $stmt->bind_param('si', $name, $id);
    $stmt->execute() or die($stmt->error);
}

如果您要更新多条数据,您可以尝试这样的操作:

$name = 'fred';
$city = '';
$state = 'SA';
$id = 4;
$params = array();
foreach (array('name','city','state') as $param) {
    if (strlen($$param)) $params[$param] = $$param;
}
$sql = "UPDATE table SET " . implode(' = ?, ', array_keys($params)) . " = ? WHERE id = ?";
$types = str_repeat('s', count($params)) . 'i';
$params['id'] = $id;
$stmt = $mysqli->prepare($sql);
$stmt->bind_param($types, ...$params);
$stmt->execute() or die($stmt->error);

【讨论】:

  • 嘿,谢谢,尼克。如果我想检查一行中的更多值(对于空字符串),例如“city”或“state”,我是否必须为每个变量创建一个 IF 语句然后绑定每个变量?您将如何通过一个 UPDATE 查询有效地检查字符串长度并更新多个变量?
  • @JoshuaN 看到我的编辑。我认为这可能是做你想做的最有效的方式
猜你喜欢
  • 1970-01-01
  • 2016-03-03
  • 1970-01-01
  • 2020-05-30
  • 2016-11-25
  • 1970-01-01
  • 2021-11-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多