Перейти к основному содержимому

$stmt

$stmt (или PreparedStatement) — это подготовленное SQL-выражение в программировании, используемое для безопасного и эффективного выполнения запросов к базе данных. Оно предотвращает SQL-инъекции, улучшает производительность за счет предварительной компиляции запроса и позволяет безопасно подставлять параметры. В Go-пакете database/sql Stmt безопасно используется одновременно несколькими горутинами.

Основные преимущества

Безопасность: Защищает от SQL-инъекций, так как данные передаются отдельно от команды. Производительность: База данных компилирует SQL-запрос один раз, а затем выполняет его многократно с разными параметрами, что ускоряет работу. Удобство: Упрощает работу с запросами, содержащими пользовательский ввод.

// 21-22: Шаг 1: Готовим запрос на поиск пользователя
$stmt = $conn->prepare("SELECT id FROM users WHERE username = ?");
$stmt->bind_param("s", $username);
$stmt->execute();
$stmt->store_result();
* prepare(...): Мы отправляем в базу ШАБЛОН запроса. Вместо реального имени пользователя мы ставим знак вопроса ? — это плейсхолдер (заполнитель).
* bind_param("s", $username): Мы "привязываем" переменную $username к первому плейсхолдеру. Буква "s" означает, что мы передаем string (строку). Данные передаются отдельно от команды, что безопасно.
* execute(): Команда выполняется на сервере БД.
* store_result(): Загружает результат запроса, чтобы мы могли, например, посчитать количество найденных строк.

if ($stmt->num_rows > 0) { //$stmt->num_rows: Свойство, которое содержит количество строк, найденных запросом. Если больше нуля, значит, пользователь с таким username уже есть.

$error = "Пользователь с таким именем уже существует!";
} else {
$hashed_password = password_hash($password, PASSWORD_DEFAULT); //хэшируем пароль
$stmt_insert = $conn->prepare("INSERT INTO users (username, password) VALUES (?, ?)"); // Готовим и выполняем запрос на вставку нового пользователя
$stmt_insert->bind_param("ss", $username, $hashed_password);

if ($stmt_insert->execute()) {
$message = "Регистрация прошла успешно! Теперь вы можете <a href='login.php'>войти</a>";
} else {
$error = "Ошибка, попробуйте позже";
}
$stmt_insert->close(); //Закрываем подготовленные выражения, чтобы освободить ресурсы.
}
$stmt->close();