Прямо сейчас вы передаете Строка
INSERT INTO order (foodid,name) VALUES (1,' Kill 'em all')
к серверу PostgreSQL, который не имеет ни малейшего шанса, чтобы определить, что "в 'em
является частью строкового литерала, а не его разделителем.
Вы должны убедиться, что ваши параметры полезной нагрузки не «ломают» инструкцию sql.
Вы можете сделать это либо с помощью appropriate encoding/escaping function for string literals поставить полезную нагрузку непосредственно в SQL Statement
// <--- test whether $food_id contains only digits here, e.g. via ctype_digit
$query = sprintf('
INSERT INTO
order (foodid,name)
VALUES
(%s,%s)',
$food_id, pg_escape_literal($conn, $food)
);
$result = pg_query($conn,$query) or die("Query cannot be executed");
или с использованием prepared statement + parameters, фактически отделяя фактическое заявление SQL от данных полезной нагрузки:
// Prepare a query for execution
$result = pg_prepare($conn, '', '
INSERT INTO
order (foodid,name)
VALUES
($1,$2)
');
if (!$result) {
yourErrorHandler();
}
$result = pg_execute($conn, '', array($food_id, $foo));
if (!$result) {
yourErrorHandler();
}
см. Также: http://php.net/security.database.sql-injection
это потому, что это конкретное имя содержит '' ', чтобы передать его в запрос базы данных должно быть заменено с '\ ''. Если у вас возникли проблемы, вы должны действительно взглянуть на тему «SQL Injection» и SQL-запросов с параметрами, чтобы избежать дальнейших головных болей. – MoreThanChaos