php - 转义 MySQL UPDATE(如果长度)

标签 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() 以使该函数正确转义字符?这个函数甚至可以在 PHP 的这个特定 MySQL 语句中工作吗?

最佳答案

第二个查询的问题是对 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);

关于php - 转义 MySQL UPDATE(如果长度),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53955370/

相关文章:

mysql - 更新主键 - 如果重复,则将其删除

PHP:更新查询不更新 TIMESTAMP() 格式列中的时间?

php - 访问 JFormField 中自定义字段的自定义属性

PHP - 自动检测(原始)urlencode

Plat Framework 1.2.7 升级到 1.5.2 后出现 MySQLIntegrityConstraintViolationException

mysql - Rails4 - 列名不明确且没有此类列错误

python - Django makemigrations 不断进行相同的更改

php - 如何将水平表格转换为垂直表格?

php - 获取配置文件更新页面以更新数据库的大问题

mysql - 如何在FROM子句中更新目标表?