Экранирование MySQL UPDATE (ЕСЛИ ДЛИНА) - PullRequest
0 голосов
/ 28 декабря 2018

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

1 Ответ

0 голосов
/ 28 декабря 2018

Проблема с вашим вторым запросом заключается в том, что $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);
...