Come preparare correttamente un'istruzione SQL %LIKE%?

8 feb 2011, 04:15:00
Visualizzazioni: 63.7K
Voti: 56

Vorrei utilizzare un'istruzione LIKE %text% continuando a usare la classe WordPress $wpdb per sanitizzare e preparare l'input.

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

Ho provato qualcosa del genere senza successo:

$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 SQL %LIKE% utilizzando la classe database di WordPress?

0
Tutte le risposte alla domanda 4
4
82

La funzione $wpdb->esc_like esiste in WordPress perché l'escape regolare del database non gestisce i caratteri % e _. Ciò significa che puoi inserirli negli argomenti di wpdb::prepare() senza problemi. Questo è anche quello che vedo nel codice core 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 dovrebbe apparire così:

$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 %% nella tua query per ottenere un % letterale (wpdb::prepare() utilizza vsprintf() in background, che ha questa sintassi), ma ricorda che la tua stringa non sarà quotata, devi aggiungere tu stesso le virgolette (cosa che di solito non devi fare in wpdb::prepare()).

8 feb 2011 11:39:26
Commenti

A cosa servono le {}?

Francisco Corrales Morales Francisco Corrales Morales
21 ago 2014 01:39:00

@FranciscoCorralesMorales: Per indicare che tutto ciò che è al loro interno dovrebbe essere considerato un'espressione variabile, altrimenti vedrebbe solo $wpdb e ignorerebbe il ->prefix successivo.

Jan Fabry Jan Fabry
21 ago 2014 18:14:14

@JanFabry Quasi giusto. Correggerei il commento dicendo: "... altrimenti vedrebbe tutto $wpdb->base_prefixmy_table e cercherebbe di cercare la proprietà base_prefixmy_table invece del solo base_prefix.

Flimm Flimm
10 ott 2017 12:24:25

Un'altra cosa da menzionare è che i % vengono sostituiti con un hash incredibilmente lungo. Che sembra sbagliato quando si fa var_dump dell'output SQL. Dopo ore di ricerca si nota qui che si tratta di una correzione di sicurezza per SQL injection in WordPress 4.8.3. https://stackoverflow.com/a/57914094/7977916

NME New Media Entertainment NME New Media Entertainment
4 gen 2022 22:26:17
3
10

È necessario raddoppiare le percentuali in modo che non vengano trattate come marcatori di frammento 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.

8 feb 2011 08:52:19
Commenti

Ricorda che devi aggiungere tu le virgolette attorno alla stringa, perché wpdb::prepare aggiungerà le virgolette solo per un %s che non è preceduto da un %. La parte finale della tua query dovrebbe essere WHERE column_2 LIKE '%%%s%%'.

Jan Fabry Jan Fabry
8 feb 2011 11:39:08

Questa soluzione ha funzionato alla grande insieme al suggerimento di @JanFabry

Gavin Gavin
31 ott 2021 12:32:26

Ho preferito questa risposta per l'uso di esc_like e il commento di @JanFabry.

Tami Tami
18 giu 2022 16:06:41
1

Questo è un metodo che ho verificato 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.

25 ott 2012 08:02:20
Commenti

Dovresti proteggere i caratteri % (utilizzando like_escape(). Vedi: http://codex.wordpress.org/Class_Reference/wpdb#Protect_Queries_Against_SQL_Injection_Attacks

Stephen Harris Stephen Harris
25 ott 2012 12:25:07
2
$safe_sql = $wpdb->prepare("SELECT * FROM $wp_track_table $sql",["*yoursecretkey*".$_POST['search']."*yoursecretkey*"]);

$safe_sql = str_replace("*yoursecretkey*", "%", $safe_sql);

Ho trovato una soluzione adatta con i codici sopra. Sicuramente provala.

22 set 2022 23:06:27
Commenti

Quindi il tuo approccio consiste nel passare una stringa casuale a prepare() e sostituirla con le percentuali in seguito? Sembra che tu stia combattendo con WordPress.

Rup Rup
23 set 2022 14:46:17

Fondamentalmente un sistema di template, suppongo. Non il più pulito, ma sicuramente un approccio! Grazie.

editor editor
24 set 2022 00:15:13