web-dev-qa-db-fra.com

Notice d'avertissement $ wpdb-> prepare un nombre incorrect d'arguments transmis

Je reçois cet avis lorsque j'essaie d'utiliser la fonction $ wpdb-> prepare:

Remarque: wpdb :: prepare a été appelé de manière incorrecte . La requête ne contient pas le nombre correct d'espaces réservés (7) pour le nombre d'arguments passés (4). S'il vous plaît voir le débogage dans WordPress pour plus d'informations. (Ce message a été ajouté à la version 4.8.3.) Dans C:\wamp\www\wpml\wp-includes\functions.php à la ligne 4139

J'ai consulté d'autres publications sur ce sujet et je ne vois aucun des mêmes problèmes dans ces discussions de mon code. Lors du développement de cette notification, mon application ralentit considérablement et je souhaite donc trouver une solution.

function get_meta_range($meta_key) {
    global $wpdb;

    // $meta_key = '_price'
    $include = '7275,7266,7256,7237,7196,7192,7164';

    $min = floor( $wpdb->get_var(
        $wpdb->prepare('
            SELECT min(meta_value + 0)
            FROM %1$s
            LEFT JOIN %2$s ON %1$s.ID = %2$s.post_id
            WHERE ( meta_key =\'%3$s\' OR meta_key =\'%4$s\' )
            AND meta_value != ""
            AND (
                %1$s.ID IN (' . $include . ')
            )'
        , $wpdb->posts, $wpdb->postmeta, $meta_key, '_min_variation' . $meta_key )
    ) );

    // $min = 15
}
1
Benjamin

Les espaces réservés numérotés ne fonctionnent pas comme prévu et vont être supprimés dans le futur. Ils doivent donc être considérés comme une syntaxe non valide.

En conséquence, l’erreur décrit le problème: votre requête a 7 espaces réservés, mais vous ne transmettez que 4 valeurs. Pour les valeurs répétées, il vous suffit de les répéter à l'endroit où vous passez les substitutions.

3
Milo

Le wpdb::prepare indique que vous ne devez pas citer de caractères génériques, mais dans votre code, il y a:

WHERE ( meta_key =\'%3$s\' OR meta_key =\'%4$s\' )

N'oubliez pas non plus que la méta-table est conçue pour être rapide si vous connaissez déjà l'ID de publication et que WP récupère déjà toutes les méta lorsque vous récupérez une publication.

Donc, il serait beaucoup plus rapide d'utiliser get_post_meta et de le calculer en PHP, car les données ont déjà été demandées. Faire cette requête est à la fois inutile et potentiellement coûteux

1
Tom J Nowell