转义mysql更新(如果长度)

bq3bfh9z  于 2021-06-17  发布在  Mysql
关注(0)|答案(1)|浏览(284)

我创建了一个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语句中工作吗?

pkbketx9

pkbketx91#

第二个问题是 $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);

但实际上,你应该考虑使用一个事先准备好的语句;那你就不用担心转义引号了。此外,您应该检查 $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);

相关问题