На данный вопрос уже ответили:
Проблема заключается в выводе переменной $set_name
внутри MySQLi запроса не в том виде, как того хотелось бы.
$set_name
в данном примере равно 'name = "John"'
, но в MySQL запросе, вероятно, выводится в другом виде и запрос, соответственно, не выполняется.
Если же переменную $set_name
заменить на её значение (name = "John"
), то запрос выполняется...
$name = 'John';
if(empty($name)) {
$set_name = '';
} else {
$set_name = ' name = "'.$name.'"';
}
$update = $mysqli->query('UPDATE table SET $set_name WHERE id = 1');
вам нужно использовать двойные кавычки, вот так:
$update = $mysqli->query("UPDATE table SET $set_name WHERE id = 1");
но так делать плохо, посмотрите например в сторону PDO
<?php
/* Выполнение запроса с привязкой PHP переменных */
$calories = 150;
$colour = 'red';
$sth = $dbh->prepare('SELECT name, colour, calories
FROM fruit
WHERE calories < :calories AND colour = :colour');
$sth->bindParam(':calories', $calories, PDO::PARAM_INT);
$sth->bindParam(':colour', $colour, PDO::PARAM_STR, 12);
$sth->execute();
?>
Ваш вариант опасен внедрением SQL-инъекций. Переменные стОит вставлять в запрос только при условии экранирования значений и только тогда, когда другого варианта нет. В качестве "другого варианта" следует использовать плейсхолдеры и подготовленные запросы. Для используемого вами mysqli и в рамках вашего примера это будет выглядеть так:
$stmt = $mysqli->prepare('UPDATE table SET name = ? WHERE id = 1');
$stmt->bind_param('s', 'John');
$result = $stmt->execute();
if (!$result) throw new Exception('SQL error: ' . $mysqli->error, $mysqli->errno);
Если говорить не о мелкой проблеме с базовым синтаксисом РНР, а о реальной задаче, решаемой в данном случае, то её решение далеко не так просто.
Для этого конкретного случая я порекомендую свою библиотеку Safemysql, которая расширяет возможности стандартного драйвера mysqli, и в том числе - как раз работу с с парами вида column='value'
;
$update = [];
$name = 'John';
if(!empty($name)) {
$update['name'] = $name;
}
$db->query('UPDATE table SET ?u WHERE id = ?i', $update, $id);
Таким образом можно будет добавить в запрос любое количество полей.
Поскольку для всех передаваемых в запрос данных используются плейсхолдеры, мы на 100% защищены от sql инъекций.
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
В VK API есть загрузка фотографий для товаров (vkcom/dev)
Нужно узнать name полей <input> для входа в роутер