Alternativă pentru mysql_real_escape_string

20 mai 2014, 19:56:09
Vizualizări: 22.3K
Voturi: 3

Am un plugin WordPress în care la un moment dat trebuie să verific dacă un anumit titlu există în baza de date. Timp de 2 ani, acest cod a funcționat bine:

$myposttitle= $wpdb->get_results(
 "select post_title from $wpdb->posts
  where post_title like '%".  mysql_real_escape_string($myTitle) . "%'"
);

Cu toate acestea, cu PHP 5.5 și WordPress 3.9.1, acest lucru cauzează o eroare deoarece funcția mysql_real_escape_string este deprecată.

Aveți idei despre ce altă funcție va escapa corect conținutul variabilei $myTitle acum că nu mai pot folosi mysql_real_escape_string?

Mulțumesc

3
Comentarii

Știu că există o funcție personalizată PHP pe stackoverflow (vezi: http://stackoverflow.com/questions/1162491/alternative-to-mysql-real-escape-string-without-connecting-to-db), dar sugerez totuși să folosești mysqli sau PDO.

pascalvgemert pascalvgemert
20 mai 2014 21:47:04

de fapt, se pare că $wpdb->prepare face escaparea corectă conform acestei pagini http://codex.wordpress.org/Data_Validation

Allen Allen
20 mai 2014 22:04:14

Bine de știut!

pascalvgemert pascalvgemert
20 mai 2014 22:05:08
Toate răspunsurile la întrebare 2
0

Deși răspunsul dat cu prepare() este parțial corect, dacă ai nevoie de o metodă pentru a escapa manual un șir de caractere pentru o declarație SQL, folosește esc_sql().

Pentru cazul specific de escapare a unui șir de caractere care urmează să fie plasat într-o declarație LIKE, atunci ar trebui să fie scris mai corect astfel:

$query = $wpdb->prepare(
  "SELECT post_title from $wpdb->posts
  WHERE post_title LIKE %s",
  "%" . $wpdb->esc_like( $myTitle ) . "%"
);

$wpdb->esc_like() este necesar pentru a escapa corect orice semn de procent, underscore sau backslash care ar putea fi în fraza căutată. Reține că $wpdb->esc_like() nu returnează input pregătit, ci doar escapează caracterele speciale utilizate într-un LIKE. Astfel, prepare() este încă necesar.

21 mai 2014 04:41:05
2

Când lucrați cu baza de date în WordPress, nu ar trebui să folosiți niciodată funcțiile de nivel scăzut mysql_* sau mysqli_*.

Utilizați întotdeauna metodele $wpdb, în cazul dvs. ar trebui să folosiți prepare():

$query = $wpdb->prepare(
  "SELECT post_title from $wpdb->posts
  WHERE post_title LIKE %s",
  "%" . $myTitle . "%"
);

Mai mult, dacă obțineți o singură coloană, aveți viața mai ușoară folosind get_col în loc de get_results:

$myposttitle = get_col( $query );
20 mai 2014 20:33:19
Comentarii

Mulțumesc... apreciez. Totuși, asta nu va rezolva problema de escapare pe care am menționat-o, nu-i așa?

Allen Allen
20 mai 2014 20:53:41

@Allen da, prepare escaphează valorile folosind mysqli_real_escape_string (compatibil cu PHP 5.5) sau mysqli_real_escape_string în funcție de versiunea ta curentă de PHP.

gmazzap gmazzap
21 mai 2014 01:41:47