我将我的sql查询存储为字符串,然后在PDO中使用它们,如下所示。
有一行我不明白:
eval("\$query = \"$query\";");
从docs..eval应该运行一个字符串作为PHP代码。为什么我不能直接使用$query
?运行一串SQL是什么意思?
此代码有效。我只是不知道eval()
声明的用途。
请注意,这是安全的eval()
,因为输入不是用户定义的。
"arc_id" => "SELECT id FROM credentials WHERE email=?",
"arc_id_from_hash" => "SELECT id FROM credentials WHERE pass=?",
"signin_pass" => "SELECT pass FROM credentials WHERE email=?",
"signin_validate" => "SELECT id, hash FROM credentials WHERE email=? AND pass=?"
);
public function __construct()
{
$this->db_one = parent::get();
}
public function _pdoQuery($fetchType, $queryType, $parameterArray=0) // needs review
{
$query=$this->sql_array[$queryType];
// what?
eval("\$query = \"$query\";");
// if not input parameters, no need to prep
if($parameterArray==0)
{
$pdoStatement = $this->db_one->query($query);
答案 0 :(得分:3)
该代码按名称查找查询,例如arch_id
- > 'SELECT id ..'
,然后在eval
中的双引号上下文中评估查询。
推测查询可能包含将被插值的变量。例如,原始值可能是'SELECT id WHERE food = "$taste"'
,然后在eval
中将其作为双引号字符串文字进行评估,并导致$taste
的插值,以便将结果存储回来$query
可能是'SELECT id WHERE food = "yucky"'
。
鉴于这些数据似乎是“过于聪明”,以前的开发人员遗留下来的垃圾。摆脱它。 (如果将来需要类似的东西,虽然我建议严格使用占位符,但请考虑非eval
替代机制。)
答案 1 :(得分:2)
eval("\$query = \"$query\";");
这是一个变量替换器/模板引擎。
它正在用$query
替换eval
内的变量。
我建议不要使用preg_replace
,使用str_replace
或{{1}}可能会更好。
供参考,这是我问的一个问题:PHP eval $a="$a"?