Экранирование MySQL UPDATE (ЕСЛИ ДЛИНА)

Я создал инструкцию 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?

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

Но на самом деле вы должны рассмотреть возможность использования подготовленного заявления вместо; тогда вам не придется беспокоиться о выходе из кавычек. Кроме того, вы должны проверить длину $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);
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]