转义 MySQL 更新(如果长度)
Escaping MySQL UPDATE (IF LENGTH)
我创建了一个更新语句,仅当字符串的长度大于 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);
我创建了一个更新语句,仅当字符串的长度大于 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);