it-swarm.com.ru

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

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

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

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

  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";

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

Итак, ваш запрос запроса становится примерно таким:

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

И не будет абсолютно никакой необходимости беспокоиться обо всех этих вопросах.

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

75
Your Common Sense

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

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

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

8
zerkms

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

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

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

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

Вы должны поставить '$type', а не только $ type

3
Chris Ghenea

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

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

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

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

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

3
Spencer Rose

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

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

Вот

$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
user962293

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

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

чтобы избежать SQL-инъекции оператор вставки с be

$type = 'testing';

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

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

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

0
Tel

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

Пример:

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