Добавляются пустые строки в бд

Всем привет! Впервые работаю с 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 шт):

Автор решения: Jean-Claude

Здесь нет речи ни о какой безопасности, код из прошлого века. Сейчас для выполнения запросов к базе данных используют подготовленные выражения, которые защищают код от 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);
    }
}

Все отлично работает.

→ Ссылка