2016-01-17 3 views
0

pg_query не может быть выполнен в случае, когда name =' Kill 'em all' ошибка указывает на "'" перед "em", что является проблемой но я не могу найти решение.Ошибка pg_query из-за имени: 'kill' em all '

$query = "INSERT INTO order (foodid,name) VALUES ($food_id,'$food')"; 
$result = pg_query($conn,$query) or die("Query cannot be executed"); 
+0

это потому, что это конкретное имя содержит '' ', чтобы передать его в запрос базы данных должно быть заменено с '\ ''. Если у вас возникли проблемы, вы должны действительно взглянуть на тему «SQL Injection» и SQL-запросов с параметрами, чтобы избежать дальнейших головных болей. – MoreThanChaos

ответ

1

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

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

+0

Thnx для информации. Работал как шарм. –