2014-12-20 30 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