2

以下に示すように、SQLクエリを文字列として保存し、後でPDOで使用します。

私が理解していない1つの行があります:

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ています。

これには使用しないことをお勧めします。evalおそらくpreg_replaceorを使用する方がよいでしょうstr_replace

参考までに、私が尋ねた質問を次に示します: PHP eval $a="$a"?

于 2012-09-14T21:53:29.400 に答える