Вставьте оператор, оставив столбец пустым и вызывая ошибки - PullRequest
0 голосов
/ 26 марта 2019

Я пытаюсь реализовать базовую систему регистрации пользователей с использованием PHP.Когда у меня пустая таблица пользователей, я могу зарегистрировать одного пользователя.После регистрации поле пароля правильно сохраняется в виде хэша, но столбец для имени пользователя остается пустым в таблице SQL.После этой вставки я не могу вставлять больше строк (даже с совершенно разными именами пользователей и паролями), пока не удалю существующую единственную строку.

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

Вот моя функция для выполнения вставки.

        function registerUser($username, $password) {
            $db = $this->getDbConnection();
                if (!is_null($db)) {
                    $query = "INSERT INTO users (username, password) VALUES (?, ?)";
                    if($stmt = mysqli_prepare($db, $query)){
                    // Bind variables to the prepared statement as parameters
                    mysqli_stmt_bind_param($stmt, "ss", $param_username, $param_password);

                    // Set parameters
                    $param_username = $username;
                    $param_password = password_hash($password, PASSWORD_DEFAULT); // Creates a password hash

                    // Attempt to execute the prepared statement
                    if (mysqli_stmt_execute($stmt)) {
                        // Redirect to login page
                        header("location: /index.php");
                        exit();
                    } else {
                        echo "Something went wrong. Please try again later.";
                    }                

                    }
                // Close statement
                mysqli_stmt_close($stmt);
            }
            mysqli_close($db);
        }

Вот как я создал таблицу пользователей:

CREATE TABLE users (
    id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
    username VARCHAR(50) NOT NULL UNIQUE,
    password VARCHAR(255) NOT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

И, наконец, это моя HTML-форма:

<div class="vertical-center">
    <div class="container roundedEdges mainContent divPadding10">
        <h2 class="textCenter">Sign Up</h2>
        <br>

      <form action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]); ?>" method="post">
          <div class="form-group <?php echo (!empty($username_err)) ? 'has-error' : ''; ?>">
              <label>Username</label>
              <input type="text" name="username" class="form-control" value="<?php echo $username; ?>">
              <span class="help-block"><?php echo $username_err; ?></span>
          </div>    
          <div class="form-group <?php echo (!empty($password_err)) ? 'has-error' : ''; ?>">
              <label>Password</label>
              <input type="password" name="password" class="form-control" value="<?php echo $password; ?>">
              <span class="help-block"><?php echo $password_err; ?></span>
          </div>
          <div class="form-group <?php echo (!empty($confirm_password_err)) ? 'has-error' : ''; ?>">
              <label>Confirm Password</label>
              <input type="password" name="confirm_password" class="form-control" value="<?php echo $confirm_password; ?>">
              <span class="help-block"><?php echo $confirm_password_err; ?></span>
          </div>
          <div class="form-group">
              <input type="submit" class="btn btn-success" value="Submit">
              <input type="reset" class="btn btn-danger" value="Reset">
          </div>
          <p>Already have an account? <a href="login.php">Login here</a>.</p>
      </form>

    </div>
</div>

Поля id, password и made_at обновляются очень хорошо, но проблема в имени пользователя.

РЕДАКТИРОВАТЬ:Моя функция находится внутри класса QueryRunner.Я звоню из другого файла, например:

require($_SERVER['DOCUMENT_ROOT'].'/DAL/queries.php');
$queryRunner = new QueryRunner;
$queryRunner->registerUser($username, $password);

Ответы [ 2 ]

0 голосов
/ 27 марта 2019

Похоже, я нашел здесь ошибку.Я закомментировал код, который я использовал для проверки входных данных, потому что я думал, что проблема была в другом месте, но я думаю, что я должен был обратить более пристальное внимание на мою логику проверки.Я намеревался прочитать значения из массива POST, проверить их, а затем обработать присвоение переменных $ username и $ password прямо в функциях проверки.

Это был последний шаг, который я забыл.

0 голосов
/ 26 марта 2019

имя пользователя хранится уникально, поэтому каждый раз перед вставкой в ​​базу данных проверяйте, существуют ли данные с запрошенным именем пользователя или нет, а затем выполняйте запрос вставки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...