2

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

2 回答 2

3

该代码按名称查找查询,例如arch_id-> 'SELECT id ..',然后在eval.

推测查询可能包含将被插值的变量。例如,原始值可能是'SELECT id WHERE food = "$taste"'然后在 中被评估为双引号字符串文字eval并导致插值,$taste因此存储回的结果$query可能是'SELECT id WHERE food = "yucky"'

鉴于数据,它似乎是以前开发人员留下的“太聪明”的垃圾。摆脱它。(如果将来需要类似的东西,虽然我建议严格使用占位符,但考虑非eval替代机制。)

于 2012-09-14T21:47:48.613 回答
2
eval("\$query = \"$query\";");

这是一个变量替换器/模板引擎。

它正在用$query它们的值替换内部的变量。

我建议不要为此使用,使用oreval可能会更好。preg_replacestr_replace

作为参考,这是我问的一个问题:PHP eval $a="$a"?

于 2012-09-14T21:53:29.400 回答