Как включить переменную PHP в оператор вставки MySQL - PullRequest
44 голосов
/ 24 сентября 2011

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

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

Ответы [ 11 ]

82 голосов
/ 24 сентября 2011

Правила добавления строк в запрос просты и понятны:

  1. Строка должна быть заключена в кавычки.
  2. Следовательно, эти кавычки следует экранировать в данных, а также в некоторых других символах, используя mysql_real_escape_string()

Итак, ваш код становится

$type     = 'testing';
$type     = mysql_real_escape_string($type);
$reporter = "John O'Hara";
$reporter = mysql_real_escape_string($reporter);

$query    = "INSERT INTO contents (type, reporter, description) 
             VALUES('$type', '$reporter', 'whatever')";
mysql_query($query) or trigger_error(mysql_error()." in ".$query);
// note that when running mysql_query you have to always check for errors

Но если вы собираетесь добавить переменную в другую часть запроса, правила изменятся.

  • Чтобы добавить число, вы должны явно привести его к его типу.

Например:

$limit = intval($_GET['limit']); //casting to int type!
$query = "SELECT * FROM table LIMIT $limit";
  • Чтобы добавить идентификатор, лучше выбрать его из какого-то белого списка, состоящего из жестко закодированных значений

Например:

if ($_GET['sortorder'] == 'name') {
  $sortorder = 'name';
} else {
  $sortorder = 'id';
}
$query = "SELECT * FROM table ORDER BY $sortorder";

Чтобы упростить все это , но с гарантированной безопасностью, нужно использовать какую-то систему заполнителей , где переменная входит в запрос не напрямую, а через некоторый прокси, называемый заполнитель.

Итак, ваш запрос будет выглядеть примерно так:

$type     = 'testing';
$reporter = "John O'Hara";
pquery("INSERT INTO contents (type, reporter, description) VALUES(?s, ?s, ?s)",
        $type, $reporter,'whatever');

И обо всем этом совершенно не нужно будет беспокоиться.

Для ограниченного набора заполнителей вы можете использовать PDO . Хотя для реального использования вам понадобится расширенный набор, который предлагается всего несколькими библиотеками, одна из которых SafeMysql .

7 голосов
/ 24 сентября 2011

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

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

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

3 голосов
/ 31 августа 2016

Это простой ответ:

$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'] .
         "'";
3 голосов
/ 24 сентября 2011

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

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

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

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

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

2 голосов
/ 24 сентября 2011

Попробуйте это:

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

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

1 голос
/ 03 марта 2015

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

$query    = "INSERT INTO contents (type, reporter, description) 
         VALUES('".$type."', '".$reporter."', '"$whatever."')";
1 голос
/ 24 сентября 2011

Здесь

$type='testing' //it's 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's integer
mysql_query("INSERT INTO contents (type, reporter, description) VALUES($type, 'john', 'whatever')");//at that time u can use $type
1 голос
/ 24 сентября 2011

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

$query = sprintf("INSERT INTO contents (type) VALUES ('%s')", mysql_real_escape_string($type));
$result = mysql_query($query);
0 голосов
/ 31 декабря 2018

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

Пример:

SELECT * FROM log WHERE id = '{$id}';
0 голосов
/ 13 февраля 2017

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

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

...