我正在尝试使用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);
答案 0 :(得分:0)
看来我在这里找到了错误。我已经注释掉了用于验证输入的代码,因为我认为问题出在其他地方,但是我想我应该一直在关注验证逻辑。我原本打算从POST数组中读取值,进行验证,然后在验证函数中处理分配给$ username和$ password变量的操作。
我忘记了这最后一步。
答案 1 :(得分:-1)
用户名字段是唯一的,因此每次插入数据库之前,请确保检查天气是否存在具有所请求用户名的数据,然后执行插入查询。