Объясните в чем разница

В гайде использовался этот кусок кода:

$pdo = new PDO($dsn, $user, $password);
$sql = 'INSERT INTO users(Username, Email, Login, Pass) VALUES(?, ?, ?, ?)';
$quare = $pdo->prepare($sql);
$quare->execute([$username, $email, $login, $pass]);

До этого я делал так:

$link = mysqli_connect($host, $user, $password, $db);
$query = "INSERT INTO users_i(Username, Email, Login, Pass) VALUES('$username', '$email', '$login', '$pass')";
$result = mysqli_query($link, $query);

if($result)
{
  echo "Выполнение запроса прошло успешно";
}
mysqli_close($link);

Объясните в чем разница и что лучше использовать?


Ответы (1 шт):

Автор решения: Ипатьев

Представь что username у меня Д'Артаньян.
Попробуй подставить во второй запрос и выполнить.

Ничего не получится. А точнее будет:

... VALUES('Д'Артаньян', ...

база данных решит, что имя - это Д, а дальше какая-то белиберда.

Потому что когда ты подставляешь переменную напрямую в запрос, то есть риск того что содержимое переменной будет интерпретировано как часть запроса. И в лучшем случае будет ошибка, а в худшем - взлом сайта.

Поэтому надо всегда применять первый вариант, когда переменные подставляются в запрос не напрямую, а через маркеры - вот как у тебя знаки вопроса. Тем более PDO поддерживает не только знаки вопроса, но и именованные маркеры, типа :name - некоторым такое читать проще.

→ Ссылка