В гайде использовался этот кусок кода:
$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);
Объясните в чем разница и что лучше использовать?
Представь что username у меня Д'Артаньян.
Попробуй подставить во второй запрос и выполнить.
Ничего не получится. А точнее будет:
... VALUES('Д'Артаньян', ...
база данных решит, что имя - это Д, а дальше какая-то белиберда.
Потому что когда ты подставляешь переменную напрямую в запрос, то есть риск того что содержимое переменной будет интерпретировано как часть запроса. И в лучшем случае будет ошибка, а в худшем - взлом сайта.
Поэтому надо всегда применять первый вариант, когда переменные подставляются в запрос не напрямую, а через маркеры - вот как у тебя знаки вопроса. Тем более PDO поддерживает не только знаки вопроса, но и именованные маркеры, типа :name - некоторым такое читать проще.