评估目的| SQL转换?

时间:2012-09-14 21:39:39

标签: php mysql

我将我的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);

2 个答案:

答案 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"?