mysqli_real_escape_string în PHP

Pune bară inversă în fața caracterelor speciale dintr-un text, ca să poată fi pus între ghilimele într-o interogare SQL.

Sintaxă
mysqli_real_escape_string(mysqli $mysql, string $string): string

Ce face mysqli_real_escape_string

Funcția „protejează” caracterele care au rol special în SQL: ghilimelele simple și duble, bara inversă, linia nouă și caracterul nul. Ține cont de codarea conexiunii, de aceea are nevoie de obiectul mysqli.

Textul rezultat trebuie pus între ghilimele în SQL: WHERE nume = '$text'. Funcția nu protejează valorile puse fără ghilimele (de exemplu numere) și nici numele de coloane.

Astăzi, metoda recomandată sunt interogările pregătite (mysqli_prepare, mysqli_execute_query), care separă complet valorile de SQL. mysqli_real_escape_string rămâne utilă în codul vechi.

Parametri

Parametru Descriere
$mysql Conexiunea (pentru codarea caracterelor).
$string Textul de protejat.

Ce returnează

Textul cu caracterele speciale precedate de \.

Exemple

Exemplul 1: Un nume cu apostrof

<?php
$conn = mysqli_connect("localhost", "ana", "parola_ta", "magazin");
mysqli_set_charset($conn, "utf8mb4");

$nume = "Ceas D'Arc";
$sigur = mysqli_real_escape_string($conn, $nume);

echo $sigur . "\n";
echo "SELECT * FROM produse WHERE nume = '$sigur'";

Rezultat (cu un server MySQL și tabelul produse de mai sus)

Ceas D\'Arc
SELECT * FROM produse WHERE nume = 'Ceas D\'Arc'

Exemplul 2: Încercare de SQL injection neutralizată

<?php
$conn = mysqli_connect("localhost", "ana", "parola_ta", "magazin");

$cautare = "x' OR '1'='1";
$sigur = mysqli_real_escape_string($conn, $cautare);

$rezultat = mysqli_query($conn, "SELECT id FROM produse WHERE nume = '$sigur'");
echo "Rânduri găsite: " . mysqli_num_rows($rezultat);

Rezultat (cu un server MySQL și tabelul produse de mai sus)

Rânduri găsite: 0

Greșeli frecvente

  • Folosești textul protejat fără ghilimele: WHERE id = $sigur. Un text ca 1 OR 1=1 nu conține ghilimele, deci trece neschimbat. Pentru numere convertește cu (int) sau folosește interogări pregătite.
  • Folosești addslashes în loc de această funcție. addslashes nu ține cont de codarea conexiunii.
  • Afișezi textul protejat în pagină și apar bare inverse. Funcția este doar pentru SQL; pentru HTML folosește htmlspecialchars.

Comenzi înrudite

  • mysqli_prepare: Pregătește o interogare SQL cu semne ? în loc de valori. Este metoda sigură împotriva SQL injection.
  • mysqli_query: Trimite o interogare SQL către baza de date. Pentru SELECT returnează un rezultat din care citești rândurile.
  • htmlspecialchars: Transformă caracterele speciale HTML în entități, ca textul să fie afișat în siguranță în pagină.