Cum pregătești corect o declarație SQL cu %LIKE%?

8 feb. 2011, 04:15:00
Vizualizări: 63.7K
Voturi: 56

Aș dori să folosesc o declarație LIKE %text% folosind în același timp clasa WordPress $wpdb pentru a securiza și pregăti datele de intrare.

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

Am încercat ceva de genul acesta fără succes:

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

Cum pregătești corect o declarație SQL cu %LIKE% folosind clasa de baze de date WordPress?

0
Toate răspunsurile la întrebare 4
4
82

Funcția $wpdb->esc_like există în WordPress deoarece escaparea obișnuită a bazei de date nu escapă caracterele % și _. Aceasta înseamnă că le puteți adăuga în argumentele dumneavoastră pentru wpdb::prepare() fără probleme. Acest lucru este, de asemenea, ceea ce văd în codul de bază al WordPress:

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

Deci codul dumneavoastră ar arăta astfel:

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

De asemenea, puteți adăuga %% în interogarea dumneavoastră pentru a obține un caracter literal % (wpdb::prepare() utilizează vsprintf() în fundal, care are această sintaxă), dar amintiți-vă că șirul dumneavoastră nu va fi citat, trebuie să adăugați singur ghilimelele (ceea ce nu este ceea ce trebuie de obicei să faceți în wpdb::prepare().

8 feb. 2011 11:39:26
Comentarii

la ce servesc {} ?

Francisco Corrales Morales Francisco Corrales Morales
21 aug. 2014 01:39:00

@FranciscoCorralesMorales: Pentru a indica că tot ce se află în interiorul acestora ar trebui considerat o expresie variabilă, altfel ar vedea doar $wpdb și ar ignora ->prefix după el.

Jan Fabry Jan Fabry
21 aug. 2014 18:14:14

@JanFabry Aproape. Aș corecta comentariul spunând: "... altfel ar vedea tot $wpdb->base_prefixmy_table și ar încerca să caute proprietatea base_prefixmy_table în loc de doar base_prefix.

Flimm Flimm
10 oct. 2017 12:24:25

De asemenea, un lucru de menționat este că % sunt înlocuite cu un hash absurd de lung. Ceea ce arată greșit când folosești var_dump pentru output-ul SQL. După ore de căutare, s-a remarcat aici că aceasta este o remediere de securitate WordPress 4.8.3 pentru injecția SQL. https://stackoverflow.com/a/57914094/7977916

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

Trebuie să dublezi procentele astfel încât să nu fie tratate ca markeri de fragment de către 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: nu sunt sigur că aceasta este cea mai bună/singura metodă de a face acest lucru.

8 feb. 2011 08:52:19
Comentarii

Ține minte că tu trebuie să adaugi ghilimelele în jurul șirului de caractere, deoarece wpdb::prepare le va adăuga doar pentru un %s care nu este precedat de un %. Partea finală a interogării tale ar trebui să fie WHERE column_2 LIKE '%%%s%%'.

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

A funcționat excelent împreună cu sfatul lui @JanFabry

Gavin Gavin
31 oct. 2021 12:32:26

Mi-a plăcut cel mai mult acest răspuns datorită utilizării funcției esc_like și comentariului lui @JanFabry.

Tami Tami
18 iun. 2022 16:06:41
1

Acesta este un mod de a face acest lucru pe care l-am verificat și funcționează:

$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 
    ) 
);

Înlocuiți variabilele pentru a se potrivi nevoilor dumneavoastră.

25 oct. 2012 08:02:20
Comentarii

Ar trebui să evitați caracterele % (folosind like_escape(). Consultați: http://codex.wordpress.org/Class_Reference/wpdb#Protect_Queries_Against_SQL_Injection_Attacks

Stephen Harris Stephen Harris
25 oct. 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);

Am găsit o soluție adecvată cu codurile de mai sus. Cu siguranță încercați această abordare.

22 sept. 2022 23:06:27
Comentarii

Deci abordarea ta este să transmiți un șir aleatoriu în prepare() și să-l înlocuiești cu procente mai târziu? Asta se simte ca și cum te-ai lupta cu WordPress.

Rup Rup
23 sept. 2022 14:46:17

Practic un șablon, presupun. Nu tocmai cea mai elegantă soluție, dar cu siguranță o abordare! Mulțumesc.

editor editor
24 sept. 2022 00:15:13