Я настоятельно рекомендую использовать PDO и подготовленные заявления. Хотя приведенное выше утверждение выглядит безопасным, у вас возникнут проблемы, как только вы выполните более сложные запросы.
Вместо того чтобы ломать голову над тем, является ли конкретный запрос безопасным, узнайте о готовых утверждениях, и вам не придется беспокоиться Вот ваш пример, переписанный с помощью PDO:
# Make a database connection
$db = new PDO('mysql:dbname=your_db;host=your_db_server', 'username',
'password');
# The placeholder (:id) will be replaced with the actual value
$sql = 'SELECT username FROM users WHERE id=:id';
# Prepare the statement
$stmt = $db->prepare($sql);
# Now replace the placeholder (:id) with the actual value. This
# is called "binding" the value. Note that you don't have to
# convert it or escape it when you do it this way.
$stmt->bindValue(':id', $id);
# Run the query
$stmt->execute();
# Get the results
$row = $stmt->fetch();
# Clean up
$stmt->closeCursor();
# Do your stuff
$user = htmlspecialchars($row['username']);
Я добавил много комментариев; это не так много кода, как это выглядит. Когда вы используете bindValue
, вам никогда не придется беспокоиться о внедрении SQL.