2012-01-08 205 views
0

我有$ pdo-> execute($ values)的問題。pgsql 42601錯誤與PDO ::執行

如果我用$pdo->execute()它工作正常,無$值:

$dsn = sprintf('%s:host=%s;port=%s;dbname=%s', DB_TYPE, DB_HOST, DB_PORT, DB_NAME); 
$pdo = new PDO($dsn, DB_USER, DB_PASS, array()); 
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 

$sql = 'SELECT * FROM "user" ORDER BY id DESC LIMIT 50 OFFSET 0'; 
$stmt = $pdo->prepare(trim($sql)); 
$stmt->setFetchMode(PDO::FETCH_OBJ|PDO::FETCH_PROPS_LATE); 
$stmt->execute(); 

echo "<pre>"; 
print_r($stmt->fetchAll()); 
echo "</pre>"; 

它工作正常,但是當我要添加值替換:

$dsn = sprintf('%s:host=%s;port=%s;dbname=%s', DB_TYPE, DB_HOST, DB_PORT, DB_NAME); 
$pdo = new PDO($dsn, DB_USER, DB_PASS, array()); 
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 

$sql = 'SELECT * FROM "user" ORDER BY ? ? LIMIT 50 OFFSET 0'; 
$values = array('id','DESC'); 

$stmt = $pdo->prepare(trim($sql)); 
$stmt->setFetchMode(PDO::FETCH_OBJ|PDO::FETCH_PROPS_LATE); 
$stmt->execute($values); 

echo "<pre>"; 
print_r($stmt->fetchAll()); 
echo "</pre>"; 

它不工作。它返回:

SQLSTATE[42601]: Syntax error: 7 ERROR: syntax error at or near "$2" LINE 1: SELECT * FROM "user" ORDER BY $1 $2 LIMIT 50 OFFSET 0 ^' in ...

+0

沒有意識到你實際上可以使用綁定在order by子句瓦爾,我還以爲是像瓦爾綁定爲一個表名稱 – 2012-01-08 23:51:25

回答

1

ORDER BY需要一個逗號分隔的列清單,如果當你execute與參數的問號被轉義值替換有順序多列BY子句

+0

非常感謝。它非常簡單;)) – 2012-01-08 23:53:30

1

。在這種情況下,值不應該被轉義(因爲它們是字段名稱/保留字)。

我認爲在這種情況下,簡單的解決方案是串聯的字段名稱:

$field = 'id'; 
$ord = 'DESC'; 

$sql = "SELECT * FROM user ORDER BY $field $ord LIMIT 50 OFFSET 0'; 
// prepare... 
$stmt->execute(); 
+2

準備好的語句比構建SQL查詢作爲普通字符串安全得多 – 2012-01-09 00:22:53

+0

我知道,並且**必須**用於防止用戶的格式錯誤的輸入保存在數據庫中(防止SQL注入, 等等。)。但在這個特定的情況下,AFAIK並不是最好的解決方案。 – 2012-01-09 00:28:06

+0

可以使用Prepared語句,但是需要pg_quote_ident()作爲ORDER BY中的動態對象。在另一個查詢中,您必須先執行此操作。 – 2015-01-13 11:07:27