1

2つのパラメーターを受け取る関数を作成しています。1つ目はユーザーのID(デフォルトは%)で、2つ目は取得するフィールド(デフォルトは*)です。最初のパラメーターは正常に機能しますが、何らかの理由で、プリペアドステートメントのパラメーターの値としてアスタリスクを使用しようとすると、奇妙な結果が得られます(以下にリストされています)。プリペアドステートメントでアスタリスクを使用できないが、パーセント記号は使用できる理由はありますか?私の機能は以下の通りです:

public function getMembers($id = '%', $fields = '*') {
    $sql = 'SELECT ?
        FROM members
        WHERE members.member_id LIKE ?;';

    return $this->executeQuery($sql, array($fields, $id));
}

これがexecuteQuery関数です。

public function executeQuery($query, array $parameters = array(), $fetch_type = PDO::FETCH_ASSOC) {
    $result = array();

    $sth = $this->handle->prepare($query);

    if($sth->execute($parameters)) {
        while($row = $sth->fetch($fetch_type)) {
            array_push($result, $row);
        }
    }

    return $result;
}

そして最後に、デフォルトのアスタリスクを使用した場合の結果は次のとおりです。

Array
(
    [0] => Array
        (
            [*] => *
        )

)
4

1 に答える 1

2

パラメータは値として動作します。フィールド名は値ではなく識別子であるため、実行していることは次のように動作することになります。

SELECT '*' FROM ...

もちろん、これは役に立たない。

フィールド名をPDOクエリに渡す必要がある場合は、フィールド名を適切にエスケープして、クエリに補間する必要があります。ただし、理想的には、これが不要になるようにコードを構造化する必要があります。

于 2013-01-05T20:34:06.157 に答える