Ошибка pg_query из-за имени: ‘kill’ em all ‘

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

0

Решение

Прямо сейчас вы передаете строку

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

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]