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 (
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
Comme jeroen dit, j'ai supposé que c'est bon parce que je lier le paramètre qui est utilisé dans la
L'OP est la construction de
: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înesComme 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
Vous devez vous connecter pour publier un commentaire.
Changement
à
et
:
OriginalL'auteur mekegi
dans votre where_string vous utilisez
?
qui est un paramètre de position et votre limit et offset vous utilisez:
qui est un paramètre nommé qui est à l'origine de l'avertissement de ne pas les mélangerRemplacer le
?
instances avec des paramètres nommés comme:pattern1
,:pattern2
, ou les paramètres nommés avec?
, et ils ont des index de comptage+1 et le comte+2, où est le nombre de modèles en cours de vérification.répondu par mekegi @mekegi merci
OriginalL'auteur Miguelo