插入语句,将列留空并导致错误

时间:2019-03-26 16:40:33

标签: php mysqli

我正在尝试使用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,密码和created_at字段可以很好地更新,但是用户名是问题所在。

编辑:我的函数在QueryRunner类内。我从其他文件中调用它,如下所示:

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

2 个答案:

答案 0 :(得分:0)

看来我在这里找到了错误。我已经注释掉了用于验证输入的代码,因为我认为问题出在其他地方,但是我想我应该一直在关注验证逻辑。我原本打算从POST数组中读取值,进行验证,然后在验证函数中处理分配给$ username和$ password变量的操作。

我忘记了这最后一步。

答案 1 :(得分:-1)

用户名字段是唯一的,因此每次插入数据库之前,请确保检查天气是否存在具有所请求用户名的数据,然后执行插入查询。