Правильный способ избежать атак с использованием SQL-инъекций, независимо от того, какую базу данных вы используете, - это отделить данные от базы. Переданные значения никогда не должны интерпретироваться синтаксическим анализатором SQL как команды.
Необходимо написать запрос так, что бы пришедшее значение шло как параметр запроса и экранировалось на уровне приложения, а не хранилища данных. В такой реализации злоумышленник не сможет внедрить вредоносный SQL.
Базово существуют два варианта решения этой задачи:
$stmt = $pdo->prepare('SELECT * FROM products WHERE code = :code');
$stmt->execute([ 'code' => $code ]);
foreach ($stmt as $row) {
// получаем значения из $row
}
2. Использовать MySQLi (for MySQL):
Начиная с PHP 8.2+ можно использовать execute_query() который подготавливает запрос, присваивает значения параметрам и выполняет запрос:
$result = $connect->execute_query('SELECT * FROM products WHERE code = ?', [$code]);
while ($row = $result->fetch_assoc()) {
// получаем значения из $row
}
До PHP8.1 это можно делать так:
$stmt = $db->prepare('SELECT * FROM products WHERE code = ?');
$stmt->bind_param('s', $name); // 's' специальная литера, обозначающая type => 'string'
$stmt->execute();
$result = $stmt->get_result();
while ($row = $result->fetch_assoc()) {
// получаем значения из $row
}
Если вы используете подключение к базе отличной от MySQL, то, как правило, у них есть свои библиотеки, которые походим образом решают проблему (например pg_prepare() и pg_execute() для PostgreSQL). Опять же PDO - это универсальный вариант для любой БД.