Почему данные не вставляются в базу данных? - PullRequest
0 голосов
/ 10 мая 2018

Я сделал регистрационную форму с кодом ниже. Как вы можете видеть в нижней части рисунка, последняя строка содержит заголовок («Location: ../signup.php?signup=success»); выход(); Когда я попытался зарегистрироваться, URL-адрес вверху показывал регистрацию = успех. Но когда я вошел в свою базу данных, данные не были вставлены.

Пожалуйста, помогите мне :( Я проверил на наличие орфографических ошибок имя / переменную, но их нет. Я также проверил ссылки / соединения, и я считаю, что это правильно. Форма правильно связана с нужным файлом php, который здесь ниже.

<?php

if(isset($_POST['submit'])) {

    include_once 'dbh.inc.php';

    $first = $_POST['first'];
    $last = $_POST['last'];
    $email = $_POST['email'];
    $uid = $_POST['uid'];
    $pwd = $_POST['pwd'];

    if (empty($first) || empty($last) || empty($email) || empty($uid) || empty($pwd)) {
        header("Location: ../signup.php?signup=empty"); exit();
    }
    else {
        if (!preg_match("/^[a-zA-z]*$/", $first) || !preg_match("/^[a-zA-z]*$/", $last)) {
            header("Location: ../signup.php?signup=flnameinvalid"); exit();
        }
        else {
            if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
                header("Location: ../signup.php?signup=emailinvalid"); exit();
            }
            else{
                $mysql = "SELECT * FROM users WHERE user_uid='uid'";
                $result = mysqli_query($conn, $mysql);
                $resultCheck = mysqli_num_rows($result);

                if ($resultCheck > 0) {
                    header("Location: ../signup.php?signup=uidtaken"); exit();
                }
                else {
                    $hashedPwd = password_hash($pwd, PASSWORD_DEFAULT);
                    $sql = "INSERT INTO users (user_first, user_last, user_email, user_uid, '$hashedPwd') VALUES (?, ?, ?, ?, ?);";
                    $stmt = mysqli_stmt_init($conn);

                    if (!mysqli_stmt_prepare ($stmt, $sql)){
                        echo "SQL error!";
                    }
                    else {
                        mysqli_stmt_bind_param ($stmt, "sssss", $first, $last, $email, $uid, $hashedPwd);
                        mysqli_stmt_execute ($stmt);
                    }
                    header("Location: ../signup.php?signup=success"); exit();

Ответы [ 4 ]

0 голосов
/ 10 мая 2018

На первый взгляд я заметил неправильное название столбца, которое, как вы говорите, вы уже исправили.Таким образом, ошибка, вероятно, в этой части:

if (!mysqli_stmt_prepare ($stmt, $sql)){
    echo "SQL error!";
} else {
    mysqli_stmt_bind_param ($stmt, "sssss", $first, $last, $email, $uid, $hashedPwd);
    mysqli_stmt_execute ($stmt);
}

Попробуйте это:

if (mysqli_stmt_prepare ($stmt, $sql)){
     mysqli_stmt_bind_param ($stmt, "sssss", $first, $last, $email, $uid, $hashedPwd);
     mysqli_stmt_execute ($stmt);
     header("Location: ../signup.php?signup=success");
} else {
     echo "SQL error!";
}
exit();
0 голосов
/ 10 мая 2018
$sql = "INSERT INTO users (user_first, user_last, user_email, user_uid, '$hashedPwd') 
         VALUES (?, ?, ?, ?, ?);";

В вашем операторе SQL имя столбца для вашего пароля установлено равным значению вашего хешированного пароля. Это приведет к сбою SQL-запроса.

$sql = "INSERT INTO users (user_first, user_last, user_email, 
        user_uid, whateverthiscolumnnameis) 
         VALUES (?, ?, ?, ?, ?);";

Вы хотите, чтобы имена столбцов из вашей таблицы здесь. просто замените whateverthiscolumnnameis именем столбца пароля в вашей таблице.

Edit:

Как указывал Киллиан Колленс, вам действительно следует дезинфицировать свои входные данные в других запросах, которые вы делаете, и / или использовать подготовленные операторы для отражения классических атак SQL-инъекций.

0 голосов
/ 10 мая 2018

Почему вы принимаете uid в запросе POST, обычно вы автоматически определяете его на основе вашей базы данных (приращения и т. Д.).

Честно говоря, вам нужно переписать большую часть кода, единого решения не будет, потому что ваш код полностью уязвим.

Не забывайте принимать только те данные, которые вам нужны, и, кстати, если бы я мог редактировать свой UID, кроме возможности посылать любой UID, который мне нравится, я мог бы также сделать его вредоносной полезной нагрузкой, такой как:

10000; DROP TABLE users;

Что, должно дать мне UID 10 000, а также отбросить всю таблицу пользователей, так что не имеет значения, что я просто получил отличный UID, потому что теперь вся таблица удалена. Можно также вывести таким образом всю базу данных, выполнив что-то вроде 10000; SELECT * FROM users; Не уверен, что эти запросы, в частности, будут работать, но они уязвимы.

Я знаю, что это не совсем отвечает на ваши вопросы, но я предлагаю переписать большую часть вашего кода и использовать передовой опыт.

Кстати, вполне вероятно, что вы получаете это перенаправление, потому что если вы инициируете начальную isset ($ _ POST ['submit']), а затем нажимаете на каждый оператор else, вы получаете сообщение об успехе.

0 голосов
/ 10 мая 2018

код выглядит нормально, обнаружил одну проблему. замените эту строку

 mysqli_stmt_bind_param ($stmt, "sssss", $first, $last, $email, $uid, $hashedPwd);

с

 mysqli_stmt_bind_param ($stmt, "sssd", $first, $last, $email, $uid, $hashedPwd);

ниже - официальная форма документа php. ты можешь проверить официальный документ с примером

...