pg_query не может быть выполнен в случае, когда name = ‘Kill’ em all ‘ошибка указывает на «» перед «em», что является проблемой, но я не могу найти решение.
$query = "INSERT INTO order (foodid,name) VALUES ($food_id,'$food')";
$result = pg_query($conn,$query) or die("Query cannot be executed");
Прямо сейчас вы передаете строку
INSERT INTO order (foodid,name) VALUES (1,' Kill 'em all')
на сервер postgresql, который не имеет возможности определить, что 'em
является частью строкового литерала, а не его разделителем.
Вы должны убедиться, что ваши параметры полезной нагрузки не «нарушают» оператор SQL.
Вы можете сделать это либо с помощью соответствующая функция кодирования / экранирования для строковых литералов поместить полезную нагрузку непосредственно в оператор SQL
// <--- 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");
или используя подготовленное заявление + параметры, фактически отделяет фактический 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
Других решений пока нет …