转义MySQL UPDATE(如果长度)

时间:2018-12-28 08:01:33

标签: php mysql sql-update addslashes

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

一旦满足条件,我将尝试在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()以便正确转义字符?此功能甚至可以在此特定的MySQL PHP语句中使用吗?

1 个答案:

答案 0 :(得分:0)

第二个查询的问题是,对$name的调用中的LENGTH也必须用引号引起来。

$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);