Я создал инструкцию 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?
Проблема с вашим вторым запросом заключается в том, что $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
в PHP и вообще не запускать запрос, если он пуст. Нечто подобное должно работать (я предполагаю, что у вас есть переменная с именем $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);
Других решений пока нет …