Добавляются пустые строки в бд
Всем привет! Впервые работаю с php. Делаю регистрационную форму отправки в базу данных. При нажатии на кнопку, почему-то отправляются пустые записи, не знаю, в чем проблема.
Также, слетает дизайн кнопки Регистрация.
Подскажите, пожалуйста, как исправить
Код файла php на отправление:
<?php
echo "<h2>Your Input:</h2>";
echo $_POST['login'];
echo "<br>";
echo $_POST['pass'];
echo "<br>";
echo $_POST['repeatPass'];
echo "<br>";
echo $_POST['name'];
echo "<br>";
echo $_POST['date'];
echo "<br>";
echo $_POST['phone'];
echo "<br>";
echo $_POST['mail'];
echo "<br>";
echo $_POST['sex'];
echo "<br>";
echo $_POST['status'];
echo "<br>";
//Данные для подключения к серверу MySQL
$servername = "localhost";
$username = "root";
$password = "daveroom1234567";
// Вводим название базы данных
$dbname = "registerforms";
//Созданиие подключения
$conn = mysqli_connect($servername, $username, $password, $dbname);
mysqli_multi_query($conn, 'SET NAMES utf8') or die ("не удалось установить
кодировку");
//Проверка соединения с БД
if (!$conn) {
die("Подключение не выполнено: " . mysqli_connect_error());
}
//Строка с текстом sql запроса для таблицы
$sql = "INSERT INTO register_data (login, pass, pass_control, name, birthday, phone, email, sex, status)
VALUES ('".$_POST['login']."','".$_POST['pass']."',
'".$_POST['repeatPass']."','".$_POST['name']."',
'".$_POST['date']."','".$_POST['phone']."',
'".$_POST['mail']."','".$_POST['sex']."','".$_POST['status']."')" ;
// mysqli_query($conn, $sql) - выполнение sql запроса
//Проверка статуса выполнения sql запроса
if (mysqli_query($conn, $sql)) {
echo "Запись успешно добавлена</br>";
echo "<a href='registr.html'>На главную</a>";
} else {
echo "Ошибка добавления записи: " . $sql . "<br>" .
mysqli_error($conn);
}
//Закрытие соединения
mysqli_close($conn);
?>
Код файла с регистрацией:
<!DOCTYPE html>
<html>
<link rel="icon" href="image/logo.png">
<head>
<meta charset=utf-8">
<title>Форма регистрации</title>
<link rel="stylesheet" href="style.css" type="text/css">
<link rel="preconnect" href="https://fonts.gstatic.com">
<link href="https://fonts.googleapis.com/css2?family=Roboto+Mono:wght@500&display=swap" rel="stylesheet">
<link rel="preconnect" href="https://fonts.gstatic.com">
<link href="https://fonts.googleapis.com/css2?family=Roboto+Mono:wght@100&display=swap" rel="stylesheet">
</head>
<body>
<header>
<div class="logo">
<img src="img/logo.png">
</div>
<div class="headerButtons">
<a class="menuButton" href="#">Курсы ˅</a>
<a class="menuButton" href="#">Работа ˅</a>
<a class="menuButton" href="#">Специалисты ˅</a>
<a class="menuButton thinButton" href="#">Помощь</a>
<a class="menuButton thinButton" href="#">О нас</a>
</div>
<div>
<a class="menuButton thinButton">Регистрация</a>
<a class="menuButton">Войти</a>
</div>
</header>
<div class="conteiner">
<div class="logo2">
<img src="img/logo.png">
<h1>РЕГИСТРАЦИЯ</h1>
</div>
<form action= "reg.php" method="post">
<div class="field">
<label for="login">Логин</label> <br>
<input type="text" id="login" name="login" placeholder ="Введите Логин" >
</div>
<div class="field">
<label for="pass">Пароль</label> <br>
<input type="text" id="pass" name="pass" placeholder ="********" >
</div>
<div class="field">
<label for="repeatPass">Подтвердите пароль</label> <br>
<input type="text" id="repeatPass" name="repeatPass" placeholder ="********" >
</div>
<div class="field">
<label for="name">ФИО</label> <br>
<input type="text" id="name" name="name" placeholder ="Иванов Иван Иванович" >
</div>
<div class="field">
<label for="date">Дата рождения</label> <br>
<input type="date" id="date" name="date" placeholder ="xx.xx.xxxx" >
</div>
<div class="field">
<label for="phone">Номер телефона</label> <br>
<input type="tel" id="phone" name="phone" placeholder ="8 (000) 000-00-00" >
</div>
<div class="field">
<label for="mail">E-mail</label> <br>
<input type="email" id="mail" name="mail" placeholder ="[email protected]" >
</div>
<div class="status">
<div class="selectSex">
<label class="sexLabel" for="sex">Укажите пол</label>
<input type="radio" id="sex"
name="sex" value="M">
<label class="specificSex" for="sex">м</label>
<input type="radio" id="sex"
name="sex" value="F">
<label class="specificSex" for="sex">ж</label>
</div>
</div>
<div class="field">
<label for="status">Выберите желаемый статус</label>
<select class="readerType" name="status">
<option>Ученик</option>
<option>Заказчик</option>
<option>Администратор</option>
</select>
</div>
<div class = "center submit">
<a class = "button wideButton simpleButton submitButton" href = "http://includebrain/reg.php">Зарегистрироваться</a>
</div>
</form>
</div>
<footer>
<div class="logo">
<img src="img/logo.png">
</div>
<div class="phone_footer">
<p>8 (981) 691-60-62</p>
<p>[email protected]</p>
</div>
<div class="menu_footer">
<div class="help">
<a href="#">Помощь</a>
<a href="#">О нас</a>
</div>
<div class="help">
<a href="#">Курсы</a>
<a href="#">Работа</a>
<a href="#">Специалисты</a>
</div>
<div class="help">
<a href="#">Лицензия</a>
<a href="#">Партнерам</a>
<a href="#">О компании</a>
<a href="#">Контакты</a>
<a href="#">Вакансии</a>
</div>
</div>
</footer>
</body>
</html>
Ответы (1 шт):
Здесь нет речи ни о какой безопасности, код из прошлого века. Сейчас для выполнения запросов к базе данных используют подготовленные выражения, которые защищают код от sql-инъекций и прочих неприятностей, например, путаницы с кавычками.
Подготавливаем запрос INSERT INTO register_data (login, pass, name, sex) VALUES (?,?,?,?) - вместо переменных в него вставляем знаки вопроса, уже позже вместо этих знаков вопроса автоматически вставятся данные.
С помощью mysqli_stmt_bind_param ( stmt, types, vars) как раз и вставляем данные в сам запрос, вторым аргументом функции types идет подсказка из буквенных символов, каждый из которых задаёт тип значения привязываемой переменной. Сколько знаков вопросов в sql, столько и будет здесь букв:
i соответствующая переменная имеет тип integer
d соответствующая переменная имеет тип double
s соответствующая переменная имеет тип string
b соответствующая переменная является большим двоичным объектом
Остальные аргументы vars - твои данные на вставку. Количество переменных vars и длина строки types должны в точности соответствовать количеству параметров в запросе (то есть количество знаков вопроса).
Упрощенный хтмл
<!DOCTYPE html>
<html>
<head>
<meta charset=utf-8">
<title>Форма регистрации</title>
</head>
<body>
<div class="conteiner">
<div class="logo2">
<h1>РЕГИСТРАЦИЯ</h1>
</div>
<form action="reg.php" method="post">
<div class="field">
<label for="login">Логин</label> <br>
<input type="text" id="login" name="login" placeholder="Введите Логин">
</div>
<div class="field">
<label for="pass">Пароль</label> <br>
<input type="text" id="pass" name="pass" placeholder="********">
</div>
<div class="field">
<label for="name">ФИО</label> <br>
<input type="text" id="name" name="name" placeholder="Иванов Иван Иванович">
</div>
<div class="status">
<div class="selectSex">
<label class="sexLabel" for="sex">Укажите пол</label>
<input type="radio" id="sex" name="sex" value="M">
<label class="specificSex" for="sex">м</label>
<input type="radio" id="sex" name="sex" value="F">
<label class="specificSex" for="sex">ж</label>
</div>
</div>
<div class="center submit">
<input type="submit" value="рега">
</div>
</form>
</div>
</body>
</html>
Код php-файла
<?php
echo "<a href='form.php'>На главную</a>";
var_dump($_POST);
$servername = "localhost";
$username = "root";
$password = "";
$dbname = "registerforms";
$conn = mysqli_connect($servername, $username, $password, $dbname);
mysqli_set_charset($conn, 'utf8');
if (!$conn) {
echo "Подключение не выполнено: " . mysqli_connect_error();
} else {
$sql = "INSERT INTO register_data (login, pass, name, sex) VALUES (?,?,?,?)";
$stmt = mysqli_prepare($conn, $sql);
mysqli_stmt_bind_param($stmt, "ssss", $_POST['login'], $_POST['pass'], $_POST['name'], $_POST['sex']);
$result = mysqli_stmt_execute($stmt);
if ($result) {
echo "Запись успешно добавлена</br>";
} else {
echo "Ошибка добавления записи: " . mysqli_error($conn);
}
}
Все отлично работает.