Я пытаюсь вставить значения в таблицу содержимого. Он отлично работает, если у меня нет переменной PHP внутри VALUES. Когда я помещаю переменную $type
внутри VALUES, это не работает. Что я делаю не так?
$type = 'testing'; mysql_query("INSERT INTO contents (type, reporter, description) VALUES($type, 'john', 'whatever')");
Правила добавления строк в запрос простые и простые:
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-инъекцию , поскольку такая сортировка параметров подвержена попыткам взлома, если вы не дезинфицируете используемые данные:
Это простой ответ:
$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();
Лучший вариант – это подготовленные заявления. Разговор с кавычками и побегами – это труднее начать и с трудом поддерживать. Рано или поздно вы в конечном итоге случайно забываете что-то процитировать или в конечном итоге избегать одной и той же строки дважды, или испортить что-то подобное. Может быть, за несколько лет до того, как вы найдете эти типы ошибок.