2013-10-14 48 views
2

为什么以下查询不起作用?PHP PDO查询疑难解答

$q=$conn->prepare("SELECT GUID FROM :table WHERE URL = :url AND Status = 1 LIMIT 0,1"); 
$q->execute(array(':table'=>'su_prm_'.$url_params['leading_url'],':url'=>$url_params['trailing_url'])); 
$r=$q->rowCount(); 
//returns 0, should return 1. Querying from the console (with quotes) returns 1. 

我想也许有由此可变字符串没有被解析字符串的问题,所以试图

$q->bindParam(1, 'su_prm_'.$url_params['leading_url'], PDO::PARAM_STR); 
$q->bindParam(2, $url_params['trailing_url'], PDO::PARAM_STR); 

还试图将这些变量到新的,独立的增值经销商($str = 'su_prm_'.$url_params['leading_url'])和以这种方式运行查询。没有运气。我错过了什么?

编辑:顺便说一句,字符串是'流'和'一般'。没什么奇怪的......

+0

由于这个'FROM:table'最有可能。我从来没有见过这种类型的查询,也许我还不知道。 –

+0

所以占位符只是不会工作? – Eamonn

+0

您将需要使用bindParam指定:table,而不是通过execute方法。这是相同的限制/按params排序:( – Gavin

回答

2

参数无法绑定到表名(或字段名称)。您必须指定它没有绑定参数。如果您通过URL接受表格名称作为查询字符串参数,那么请确保有白名单进行检查,以清理输入。

$table = 'su_prm_'.$url_params['leading_url']; 
$whitelist = array(
    'su_prm_A', 
    'su_prm_B', 
    'su_prm_C' 
); 

if(!in_array($table, $whitelist)) 
{ 
    $table = 'su_prm_A'; // default 
    // show message to user - bad table name? 
} 

$q=$conn->prepare("SELECT GUID FROM $table WHERE URL = :url AND Status = 1 LIMIT 0,1"); 

要计算行数,请参阅此answer

+0

是的,我应该想到这个查询不能用这种方式来准备,我只是不能看到它!谢谢你的帮助。(会在允许的时候接受) – Eamonn

+0

@Eamonn没问题,很高兴有帮助。快乐编码! – MrCode

+0

+1为链接。有趣! – Eamonn