为什么以下查询不起作用?
$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 :(得分: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。