Je cherche à récupérer un certain nombre d'enregistrements dans la base de données, à partir d'une liste de chiffres. Je me demandais comment j'utiliserais $ wpdb-> prepare pour le faire (pour tirer parti des attaques de désinfection par rapport aux attaques par injection SQL que cela me donne). .
$wpdb->query($wpdb->prepare('SELECT * FROM wp_postmeta WHERE post_id IN (' . implode(',', $ids) .')
est une mauvaise façon de procéder, mais cela donne une chance d'attaque par injection SQL (imaginez l'un des identifiants ayant la valeur "0); DROP TABLE wp_posts;").
NOTE: Je n'essaie pas de sélectionner des données dans wp_postmeta, je les utilise simplement à titre d'exemple.
$wpdb->prepare()
utilise la même syntaxe pour formater que php's printf()
. SSo vous aurez besoin de quelque chose comme ... WHERE post_id IN (%d,%d,%d) ...
Cela conviendra pour trois identifiants. Mais que se passe-t-il si nous avons plus ou moins de trois identifiants? Nous allons utiliser les outils php pour créer la chaîne de formatage nécessaire (en supposant que $ids
est un tableau avec les identifiants):
Compter les identifiants
count( $ids )
Créez une chaîne avec un '% d', pour chaque ID dans $ ids
str_repeat( '%d,', count( $ids ) )
Nous avons maintenant une chaîne comme %d,%d,%d,
. Il y a une virgule pour beaucoup à la fin. Enlève-le
$ids_format_string = rtrim( str_repeat( '%d,', count( $ids ) ), ',' );
Et utilisez ceci de cette manière '... WHERE post_id IN (' . $ids_format_string . ') ...'
Dans votre cas, vous savez quel type de données vous attendez, alors je forcerais ce type:
$ids = array_map( 'absint', $ids );
Et vous pouvez ensuite utiliser ces valeurs sans autre préparation.