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

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

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

Related of "Как включить переменную PHP внутри инструкции вставки MySQL"

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

  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 .

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

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

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

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

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

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

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

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

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

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

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

  • Предотвращение инъекций MySQL – SQL

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

 $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'] . "'"; 

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

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

Вот

 $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 

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

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

чтобы избежать инъекции SQL, оператор insert с

 $type = 'testing'; $stmt = $con->prepare("INSERT INTO contents (type, reporter, description) VALUES (?, ?, ?)"); $stmt->bind_param("sss", $type , 'john', 'whatever'); $stmt->execute(); $stmt->close(); 

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

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