2012-04-19 76 views
1

我有這段代碼在PHP中,並使用PostgreSQL作爲數據庫。我從GET獲取所有參數。已通過打印進行檢查。形成的查詢在Postgres終端上執行,但是PHP腳本失敗。更新查詢php postgres無故失敗

這是一段代碼。

<?php 

$link = pg_connect("host=localhost dbname=postgres user=postgres password=password") or die('connection failed'); 

# Building the query 
$newq=sprintf("update purchase_info set ....... comments=%s where id=%s",......,$comm,$id); 

    print $newq; // This query runs on the postgres terminal 
    $query=addslashes($newq); // to escape "" as one of my fields is comments 
    $result=pg_query($link,$newq); 

    if (!$result) { 
     echo "An error occured.\n"; 
    } 
    pg_close($link); 
?> 

其他查詢在同一個腳本中運行。這條SQL語句有大約14個字段正在更新。

什麼問題聽到。 感謝幫助!

+0

沒有任何失敗「無故」。 – Brad 2012-04-19 21:19:03

回答

5

你不應該使用addslashes報價PostgreSQL的字符串,你應該使用pg_escape_literal

pg_escape_literal()轉義字面值查詢PostgreSQL數據庫。它以PostgreSQL格式返回一個轉義文字。 pg_escape_literal()在數據前後添加引號。建議使用此功能,而不是pg_escape_string()

你不應該使用addslashes爲引用字符串數據庫:

我們強烈推薦使用DBMS特定的逃生功能(如mysqli_real_escape_string()對於MySQL或pg_escape_string()對PostgreSQL)

你應該這樣做:

$newq = sprintf("update purchase_info set ... comments=%s where id=%d", ..., pg_escape_literal($comm), $id); 

我假設id實際上也是一個數字。

+0

- 我明白了。十分感謝你! – 2012-04-19 21:25:59

+0

@HiteshDharmadasani:我還建議您查看準備好的語句,佔位符和PDO,以便您不必自行引用事情。 – 2012-04-19 21:32:17

+1

pg_escape_literal()在任何已發佈的php版本中都不可用(5.4.0是最新的版本)。這對大多數人來說是個問題! – 2012-04-19 22:59:08

4

假設你真的要注入參數到SQL查詢中,正確的代碼是:

$newq=sprintf("update purchase_info set ... comments='%s' where id='%s'", 
    pg_escape_string($comm), pg_escape_string($id)); 
// DO NOT USE to addslashes, it is not correct 
$result=pg_query($link, $newq); 

注意單引號的格式字符串周圍的%S。 此外,如果ID是一個整數,它做的更好使用%d(不含引號),而不是「%s」的

+0

除了所有的安全。 將建立我這樣的SQL查詢 $ newq =「update purchase_info set ... comments ='」。$ comm。「'where id ='」。$ id。「'」; 工作嗎? – 2012-04-19 21:21:36

+1

你幾乎肯定不應該引用'id',PostgreSQL希望數字是數字。 – 2012-04-19 21:22:30

+1

實際上,PostgreSQL將單引號中的文字視爲「未知」類型,直到它被迫解決爲止。在沒有其他信息的情況下,它將解析爲文本,但通常可以在* any *類型的任務中使用單引號文字。這樣做是爲了使像全局座標這樣的自定義數據類型可以被視爲具有從文字分配的值的第一類對象,而不需要明確地轉換文字。 – kgrittn 2012-04-19 22:25:28