web-dev-qa-db-fra.com

prepare () ne fonctionne pas

Quand je fais ça:

$transients = $wpdb->get_col(
    "
    SELECT     option_name
    FROM       $wpdb->options
    WHERE      option_name
    LIKE       '_transient_wb_tt_%'
    "
);

Cela fonctionne bien, mais lorsque je l'utilise, préparez comme suit:

$transients = $wpdb->get_col( $wpdb->prepare(
    "
    SELECT     option_name
    FROM       %s
    WHERE      option_name
    LIKE       '_transient_wb_tt_%'
    ",
    $wpdb->options
) );

Ça ne marche pas, qu'est-ce que je fais mal ici?

4
wickedbroccoli

Je suis d'accord avec @bainternet. Vous n'avez pas besoin de $wpdb->prepare. Il n'y a pas de contenu fourni par l'utilisateur.

La réponse à la question est que pour obtenir un caractère générique % à traverser prepare, vous devez le doubler dans votre code.

LIKE  '_transient_wb_tt_%%'

Essayez ceci ou cela si vous voulez bien examiner la requête générée:

var_dump($wpdb->prepare("
    SELECT     option_name
    FROM       %s
    WHERE      option_name
    LIKE       '_transient_wb_tt_%%'
    ",
    'abc')); 
die;

À part être inutile, utiliser $wpdb->prepare comme ceci ne fonctionnera pas. Si vous tentez d'utiliser prepare pour permuter dans le nom du fichier, vous obtiendrez un nom du fichier avec des guillemets. C'est invalide SQL. La requête doit être simple:

SELECT     option_name
FROM       {$wpdb->options}
WHERE      option_name
LIKE       '_transient_wb_tt_%%'
1
s_ha_dum