2011-08-17 61 views
0

我有一個查詢我想使用,我想重用其他選擇查詢。
是否有可能有這樣的選擇查詢:佔位符對於SQLite表在PHP中

SELECT * FROM ? WHERE id = ?; 

,然後綁定這樣的價值觀:

$stmt->bindValue(1, $table, PDO::PARAM_STR); 
$stmt->bindValue(2, $id, PDO::PARAM_INT); 

問題是,當我這樣做,我從一個PDOException

得到這個 $database->errorInfo()

HY000 1靠近「?」語法錯誤。

我已經嘗試拿出表格佔位符,它確實工作。是否有可能按我的方式做,或者我需要分開的功能?

+0

爲什麼你不能將它們設置爲變量? 'SELECT * FROM $ strTable WHERE id = $ iID;' – Devator

+0

我不認爲這就是它在PHP中完成的方式...... – StuStirling

+0

@Devator:你在開玩笑嗎? –

回答

2

簡短回答:


龍答:

參考PDO::prepare手冊。有一個聲明:This must be a valid SQL statement for the target database server.這意味着您的數據庫後端必須支持您使用的預準備語句語法。

據我所知,mysql和其他任何數據庫都不允許在FROM子句中出現綁定變量。其原因在於深入闡述了準備好的陳述的概念。當您撥打prepare時,準備好的陳述正在中準備好。這意味着數據庫計劃員爲查詢建立了一個計劃,因此可以使用不同參數多次執行該計劃,而無需一次又一次地構建。爲了構建一個計劃,規劃人員需要知道受影響的表格,調用的函數,使用不同的獲取和連接策略(索引掃描/嵌套循環等)的機會等等。

因此,您不能將表名綁定到準備好的語句中,因爲在您希望它運行的那一刻,DB需要表名,而當您prepare該語句時。這就是爲什麼您會收到該消息:DB需要全部表名在準備查詢中出現。

+0

謝謝你。 – StuStirling

+0

當然。順便說一句,關於您的問題的第一評論。這幾乎是如何在PHP中完成的。它應該是'SELECT * FROM $ strTable WHERE id =?'。這實際上會被轉換成'select * from table where id =?',這是一個有效的預處理語句。但請確保不會從用戶輸入中獲取'$ strTable',因爲從輸入中獲取它會使您的系統容易受到SQL注入的影響。 – J0HN

+0

是的,它決定爲每件事情分別查詢。不想不注射! – StuStirling