PDO: Invalid parameter number: mixte nommé et les paramètres positionnels

Je suis venu sur cet avertissement, je ne l'ai pas vu avant:

Warning: PDOStatement::execute() [pdostatement.execute]: SQLSTATE[HY093]: Invalid parameter number: mixte nommé et les paramètres positionnels dans...

Se référant à la suite de requête PDO (ont simplifié la fonction pour faciliter la lecture):

$offset = 0;
$limit = 12;
function retrieve_search_posts($searchfield, $offset, $limit){


        $where = array();

        $words = preg_split('/[\s]+/',$searchfield);

        array_unshift($words, '');
        unset($words[0]);

        $where_string = implode(" OR ", array_fill(0,count($words), "`post_title` LIKE ?"));

        $query = "
                                SELECT  p.post_id, post_year, post_desc, post_title, post_date, img_file_name, p.cat_id
                                FROM    mjbox_posts p
                                JOIN    mjbox_images i
                                ON      i.post_id = p.post_id
                                        AND i.cat_id = p.cat_id
                                        AND i.img_is_thumb = 1
                                        AND post_active = 1
                                WHERE $where_string
                                ORDER BY post_date
                                LIMIT :offset, :limit
                                DESC";
        $stmt = $dbh->prepare($query);

        foreach($words AS $index => $word){
            $stmt->bindValue($index, "%".$word."%", PDO::PARAM_STR);
        }
        $stmt->bindParam(':offset', $offset, PDO::PARAM_INT);
        $stmt->bindParam(':limit', $limit, PDO::PARAM_INT);
        $stmt->execute();

        $searcharray = $stmt->fetchAll(PDO::FETCH_ASSOC);

        return $searcharray;
    }

La fonction et l'AOP requête fonctionne très bien sans le décalage et la limite de variables incluses dans la requête. Alors, quelle pourrait être la cause de cet avertissement?

Grâce

Ne serait-il pas le fait que vous avez mélangé les paramètres nommés (:offset, :limit) avec les paramètres positionnels (LIKE ?) que les etats avertissement?
Peut-être que je manque quelque chose, mais où voyez-vous une injection sql trou?
Si vous cochez la façon dont la chaîne est construite, vous verrez qu'il vient un tableau contenant juste post_title LIKE ? chaînes
Comme jeroen dit, j'ai supposé que c'est bon parce que je lier le paramètre qui est utilisé dans la $where_string variable dans la requête!?
L'OP est la construction de $where_string la concaténation codée en dur post_title LIKE ? chaînes avec OR cordes et ensuite la liaison de ses variables pour les espaces réservés. Semble bien pour moi.

OriginalL'auteur crm | 2013-04-08