Подтвердить что ты не робот

Как включить переменную PHP в оператор MySQL

Я пытаюсь вставить значения в таблицу содержимого. Он отлично работает, если у меня нет переменной PHP внутри VALUES. Когда я помещаю переменную $type внутри VALUES, это не работает. Что я делаю неправильно?

$type = 'testing';
mysql_query("INSERT INTO contents (type, reporter, description) VALUES($type, 'john', 'whatever')");
4b9b3361

Ответ 1

Правила добавления переменной PHP внутри любого оператора MySQL просты и понятны:

  1. Любая переменная, представляющая литерал данных SQL (или, проще говоря, строку SQL или число) , должна быть добавлена с помощью подготовленного оператора. Без исключений.
  2. Любая другая часть запроса, такая как ключевое слово SQL, имя таблицы или поля или оператор, должна быть отфильтрована через белый список.

Итак, поскольку в вашем примере используются только литералы данных, все переменные должны быть добавлены через заполнители (также называемые параметрами). Для этого:

  • В своем выражении SQL замените все переменные на заполнители
  • подготовить полученный запрос
  • привязать переменные к заполнителям
  • выполнить запрос

А вот как это сделать со всеми популярными драйверами баз данных PHP:

Добавление литералов данных с помощью mysql_query

Такого драйвера не существует.

Добавление литералов данных с использованием mysqli

$type = 'testing';
$reporter = "John O'Hara";
$query = "INSERT INTO contents (type, reporter, description) 
             VALUES(?, ?, 'whatever')";
$stmt = $mysqli->prepare($query);
$stmt->bind_param("ss", $type, $reporter);
$stmt->execute();

Код немного сложен, но подробное объяснение всех этих операторов можно найти в моей статье, Как выполнить запрос INSERT с помощью Mysqli, а также решение, которое значительно облегчает процесс.

Добавление литералов данных с использованием PDO

$type = 'testing';
$reporter = "John O'Hara";
$query = "INSERT INTO contents (type, reporter, description) 
             VALUES(?, ?, 'whatever')";
$stmt = $pdo->prepare($query);
$stmt->execute([$type, $reporter]);

В PDO мы можем объединять части связывания и выполнения, что очень удобно. PDO также поддерживает именованные заполнители, которые некоторые считают чрезвычайно удобными.

Добавление ключевых слов или идентификаторов

Но иногда мы добавляли переменную, которая представляет другую часть запроса, такую как ключевое слово или идентификатор (база данных, таблица или имя поля). В этом случае ваша переменная должна быть проверена по списку значений, явно написанных в вашем скрипте. Это объясняется в другой моей статье: Добавление имени поля в предложении ORDER BY на основе выбора пользователя:

К сожалению, в PDO нет места для идентификаторов (имен таблиц и полей), поэтому разработчик должен отфильтровать их вручную. Такой фильтр часто называют "белым списком" (где мы только перечисляем допустимые значения), а не "черным списком", где мы перечисляем недопустимые значения.

Поэтому мы должны явно перечислить все возможные варианты в коде PHP и затем выбрать из них.

Вот пример:

$orderby = $_GET['orderby'] ?: "name"; // set the default value
$allowed = ["name","price","qty"]; // the white list of allowed field names
$key = array_search($orderby, $allowed, true); // see if we have such a name
if ($key === false) { 
    throw new InvalidArgumentException("Invalid field name"); 
}

Точно такой же подход следует использовать для направления,

$direction = $_GET['direction'] ?: "ASC";
$allowed = ["ASC","DESC"];
$key = array_search($direction, $allowed, true);
if ($key === false) { 
    throw new InvalidArgumentException("Invalid ORDER BY direction"); 
}

После такого кода обе переменные $direction и $orderby могут быть безопасно добавлены в запрос SQL, поскольку они либо равны одному из разрешенных вариантов, либо возникнет ошибка.

Последнее, что следует упомянуть об идентификаторах, они также должны быть отформатированы в соответствии с конкретным синтаксисом базы данных. Для MySQL это должно быть backtick символов вокруг идентификатора. Таким образом, последняя строка запроса для нашего заказа в качестве примера будет выглядеть так:

$query = "SELECT * FROM 'table' ORDER BY '$orderby' $direction";

Ответ 2

Пока это строка - вы должны поместить ее в кавычки

$type = 'testing';
mysql_query("INSERT INTO contents (type, reporter, description) VALUES('$type', 'john', 'whatever')");

И да, как советовала Dani: вы должны дезинфицировать каждую строку, которую вы положили в запрос с помощью mysql_real_escape_string()

Ответ 3

Текст внутри $type заменяется непосредственно на строку вставки, поэтому MySQL получает это:

... VALUES(testing, 'john', 'whatever')

Обратите внимание, что во время тестирования нет кавычек, вам нужно поместить их так:

$type = 'testing';
mysql_query("INSERT INTO contents (type, reporter, description) VALUES('$type', 'john', 'whatever')");

Я также рекомендую вам прочитать SQL-инъекцию, поскольку этот вид передачи параметров склонен к попыткам взлома, если вы не дезинфицируете данные используется:

Ответ 4

Это легкий ответ:

$query="SELECT * FROM CountryInfo WHERE Name = '".$name."'";

и вы определяете $name все, что хотите.
И еще один способ, сложный способ, таков:

$query = " SELECT '" . $GLOBALS['Name'] . "' .* " .
         " FROM CountryInfo " .
         " INNER JOIN District " .
         " ON District.CountryInfoId = CountryInfo.CountryInfoId " .
         " INNER JOIN City " .
         " ON City.DistrictId = District.DistrictId " .
         " INNER JOIN '" . $GLOBALS['Name'] . "' " .
         " ON '" . $GLOBALS['Name'] . "'.CityId = City.CityId " .
         " WHERE CountryInfo.Name = '" . $GLOBALS['CountryName'] .
         "'";

Ответ 5

Чтобы избежать внедрения SQL, оператор вставки с be

$type = 'testing';
$name = 'john';
$description = 'whatever';

$stmt = $con->prepare("INSERT INTO contents (type, reporter, description) VALUES (?, ?, ?)");
$stmt->bind_param("sss", $type , $name, $description);
$stmt->execute();

Ответ 6

Самый лучший вариант - это подготовленные операторы. С помощью кавычек и пропусков сложнее начать работу, и их сложно поддерживать. Рано или поздно вы в конечном итоге случайно забываете что-то процитировать или в конечном итоге избегать одной и той же строки дважды, или испортить что-то подобное. Может быть, за несколько лет до того, как вы найдете эти типы ошибок.

http://php.net/manual/en/pdo.prepared-statements.php

Ответ 7

Попробуйте следующее:

$type = 'testing';
mysql_query("INSERT INTO contents (type, reporter, description) VALUES('$type', 'john', 'whatever')");

Вам нужно поставить '$type' не только $type

Ответ 8

Если переменные содержат пользовательский ввод или другие данные, которым вы не можете доверять, обязательно избегайте данных. Вот так:

$query = sprintf("INSERT INTO contents (type) VALUES ('%s')", mysql_real_escape_string($type));
$result = mysql_query($query);

Ответ 9

Здесь

$type='testing' //it string

mysql_query("INSERT INTO contents (type, reporter, description) VALUES('$type', 'john', 'whatever')");//at that time u can use it(for string)


$type=12 //it integer
mysql_query("INSERT INTO contents (type, reporter, description) VALUES($type, 'john', 'whatever')");//at that time u can use $type

Ответ 10

Я знаю, что было несколько ответов на этот вопрос, но я подумал, что добавлю, что если вы выполните следующий синтаксис, у меня никогда не было проблемы с ошибкой. Нет вопроса, какую таблицу вы используете и какие столбцы вы добавляете.

$query    = "INSERT INTO contents (type, reporter, description) 
         VALUES('".$type."', '".$reporter."', '"$whatever."')";

Ответ 11

Вы должны написать переменную в одинарных или двойных кавычках, затем заключить в скобки, а затем имя переменной (пример: $ abc) внутри.

Пример:

SELECT * FROM log WHERE id = '{$id}';