2014-12-20 68 views
1

HI我很困惑,以確定用戶想要查詢數據庫中的哪一列。如何使用PHP PDO識別自定義sql查詢中的佔位符?

考慮這個查詢語句:

$db->retrieve("SELECT firstname, lastname FROM records WHERE id = :id", array('id' => 1));

問題/混亂是我怎麼可能,如果用戶想通過不同的條件等,其中姓氏=查詢確定:名字?

感謝您的未來幫助。

+0

然後查詢需要是動態的,只要確保白名單也是你列如果用戶輸入與它作爲好。 – Ghost

+0

你可以在沒有用戶輸入的情況下動態生成列,並且只通過一個開關將用戶輸入插入到發送給它的參數中,例如:(假設輸入姓氏的情況下)'$ sql。='lastname =:input';'然後綁定參數 - 用戶輸入的方式永遠不會觸及SQL本身 - 只是綁定它的參數。 – Fluffeh

+0

@Fluffeh 因此,即使其他佔位符目前沒有像這樣查詢,我會做一個函數和綁定: $ sth-> bindParam(':id',$ id,PDO :: PARAM_INT); $ sth-> bindParam(':lastname',$ lname,PDO :: PARAM_STR); $ sth-> bindParam(':firstname',$ fname,PDO :: PARAM_STR); –

回答

1

下面是你可以做的一個例子。雖然這可以根據您的需要進行修改。

$queries = array(
    'id' => 1, 
); 

$parameters = array(); 

$sql = " SELECT firstname, lastname FROM records WHERE "; 

foreach($queries as $column => $value) { 
    $sql .= $column.'=:'.$column; 
    $parameters[":$column"] = $value; // binding parameter 
} 

$db->execute($parameters); // execute query with parameters 

echo $sql; 
print_r($parameters); 

輸出

SELECT firstname, lastname FROM records WHERE id=:id 

和您的參數是:Array ([:id] => 1)

+0

我很困惑這行$ sql。= $ column。'=:'。$ column; 它應該怎麼做? –

+0

它需要您提供的數組(包含'id'和它的值),並將它分配爲一列,並創建一個具有相同名稱的佔位符。 (假設'id'是你正在尋找的列)。實質上,它會在你的sql子句中生成:'id =:id'。這就是它動態創建你的sql子句的方式。 – Dimitri

+0

@OliverJake不客氣。它可以根據需要進行定製。這應該有助於你開始。如果你有任何問題隨時問。 – Dimitri