2016-01-17 19 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注入」和SQL查詢主題以避免更多的麻煩。 – MoreThanChaos

回答

1

現在你傳遞的字符串

INSERT INTO order (foodid,name) VALUES (1,' Kill 'em all') 

PostgreSQL服務器,其中有沒有機會確定「在'em是字符串的一部分文字,而不是它的分隔符。
您必須確保您的有效負載參數不會「斷開」sql語句。

你可以做,要麼通過appropriate encoding/escaping function for string literals直接把有效載荷送入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"); 

或使用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的信息。像魅力一樣工作。 –

相關問題