#php #mysql #mysqli
This question already has answers here:
Как вставить значение переменной внутрь строки?
(4 ответа)
Закрыт 3 года назад.
Проблема заключается в выводе переменной $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');
Ответы
Ответ 1
вам нужно использовать двойные кавычки, вот так: $update = $mysqli->query("UPDATE table SET $set_name WHERE id = 1"); но так делать плохо, посмотрите например в сторону PDO 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(); ?>Ответ 2
Ваш вариант опасен внедрением 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);Ответ 3
Если говорить не о мелкой проблеме с базовым синтаксисом РНР, а о реальной задаче, решаемой в данном случае, то её решение далеко не так просто. Для этого конкретного случая я порекомендую свою библиотеку 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 инъекций.
Комментариев нет:
Отправить комментарий