Come si prepara correttamente un'istruzione% LIKE% SQL?


34

Mi piacerebbe usare un'istruzione LIKE% text% mentre uso ancora la classe WordPress $ wpdb per disinfettare e preparare l'input.

SELECT column_1 from `prefix_my_table` WHERE column_2 LIKE '%something%';

Ho provato qualcosa del genere inutilmente:

$wpdb->prepare( "SELECT column_1 from `{$wpdb->base_prefix}my_table` WHERE column_2 LIKE %s;", like_escape($number_to_put_in_like));

Come si prepara correttamente un'istruzione% LIKE% SQL utilizzando la classe di database WordPress?

Risposte:


49

La $wpdb->esc_likefunzione esiste in WordPress perché il normale escape del database non sfugge %e _caratteri. Questo significa che puoi aggiungerli ai tuoi argomenti wpdb::prepare()senza problemi. Questo è anche quello che vedo nel codice principale di WordPress :

$wpdb->prepare(" AND $wpdb->usermeta.meta_key = '{$wpdb->prefix}capabilities' AND $wpdb->usermeta.meta_value LIKE %s", '%' . $this->role . '%');

Quindi il tuo codice sarebbe simile a:

$wpdb->prepare(
    "SELECT
        column_1
    FROM
        `{$wpdb->base_prefix}my_table`
    WHERE
        column_2 LIKE %s;",
    '%' . $wpdb->esc_like($number_to_put_in_like) . '%'
);

Puoi anche aggiungere la %%tua query per ottenere un valore letterale %( wpdb::prepare()utilizza vsprintf()in background, che ha questa sintassi ), ma ricorda che la tua stringa non verrà citata , devi aggiungere tu stesso le virgolette (che non è ciò che di solito devi fare in wpdb::prepare().


a cosa servono {}?
Francisco Corrales Morales,

@FranciscoCorralesMorales: per indicare che ogni cosa al suo interno dovrebbe essere considerata un'espressione variabile , altrimenti vedrebbe solo $wpdbe ignorerebbe il ->prefixdopo.
Jan Fabry,

1
@JanFabry Close. Correggerei il commento per dire: "... altrimenti vedrebbe tutto $wpdb->base_prefixmy_tablee proverebbe a cercare la base_prefixmy_tableproprietà anziché solo base_prefix.
Flimm,

3

Devi raddoppiare la percentuale in modo che non vengano trattati come marcatori di frammenti da wpdb->prepare():

$wpdb->prepare( "SELECT column_1 from `{$wpdb->base_prefix}my_table` WHERE column_2 LIKE %%%s%%;", $wpdb->esc_like( $number_to_put_in_like));

PS non sono sicuro che questo sia il modo migliore / unico per farlo.


4
Ricorda che devi aggiungere tu stesso le virgolette intorno alla stringa , perché wpdb::preparele aggiungerai solo per un %sche non è preceduto da un% . L'ultima parte della query dovrebbe essere WHERE column_2 LIKE '%%%s%%'.
Jan Fabry,

2

Questo è un modo per farlo che ho controllato e funziona:

$search_text = "%" . $_GET['some_text'] . "%";

$user_count = $wpdb->get_var( 
    $wpdb->prepare( 
        "SELECT COUNT(*) FROM mix_library WHERE ml_setting_name LIKE %s", 
        $search_text 
    ) 
);

Sostituisci le variabili in base alle tue esigenze.


5
Dovresti sfuggire ai %personaggi (usando like_escape(). Vedi: codex.wordpress.org/Class_Reference/…
Stephen Harris,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.