Переменная PHP внутри запроса MySQLi [дубликат]

177
19 декабря 2016, 19:30

На данный вопрос уже ответили:

  • Как вставить значение переменной внутрь строки? 4 ответа

Проблема заключается в выводе переменной $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');
Answer 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();
?>
Answer 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);
Answer 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 инъекций.

READ ALSO
Безответные запросы , возвращение

Безответные запросы , возвращение

Есть к примеру запросы

191
Как с помощью json_decode разобрать только первый уровень JSON?

Как с помощью json_decode разобрать только первый уровень JSON?

В VK API есть загрузка фотографий для товаров (vkcom/dev)

165
Можно ли использовать autoload вне фреймворка?

Можно ли использовать autoload вне фреймворка?

Вот есть установленный композером Бутстрап

190
Как называются поля для входа в роутер? [закрыто]

Как называются поля для входа в роутер? [закрыто]

Нужно узнать name полей <input> для входа в роутер

213