我在执行查询以检查用户是否存在,然后再将其添加到数据库中。如果该结果回来,那么死亡和回声用户名已经存在'但如果它返回空,则将新用户添加到数据库。
出于某种原因,它只是向数据库中添加了一个新用户。
//If post was
if (isset($_POST['submit'])) {
// Check if username is blank
if (!isset($_POST['username']) || empty($_POST['username'])) {
echo "Username was blank<br />";
die();
} else {
$username = mysqli_real_escape_string($connection, $_POST['username']);
}
// Check if password is blank
if (!isset($_POST['password']) || empty($_POST['password'])) {
echo "Password was blank<br />";
die();
} else {
$password = mysqli_real_escape_string($connection, $_POST['password']);
$password2 = md5($password);
//echo $password;
}
// Check if email is blank
if (!isset($_POST['email']) || empty($_POST['email'])) {
echo "Email was blank<br />";
die();
} else {
$email = mysqli_real_escape_string($connection, $_POST['email']);
//$password = md5($password);
//echo $password;
}
//Check to see if username alread exsists
$query_check = "SELECT * FROM users WHERE user = '$username' LIMIT 1";
$result_check = mysqli_query($connection, $query_check);
if(count(mysqli_fetch_array($result_check)) === 1) {
echo "Username exists.";
die();
} else {
$query = "INSERT INTO users (user, pass, email) VALUES ('$username','$password2','$email');";
$result = mysqli_query($connection, $query);
if($result){ // returned TRUE, e.g. in case of a DELETE sql
$_SESSION["username"] = $username;
header("Location: ../profile.php");
} else { // returned FALSE
//echo "Error: " . mysqli_error($connection);
echo "Error during register <a href='../register.php'>Back To Register</a>";
die();
}
}
} else {
header("Location: ../index.php");
}
答案 0 :(得分:3)
在测试代码几分钟后,发现您使用了错误的功能。
将结果行提取为关联行,数字数组或两者
您正在尝试获取关联数组。
相反获取结果中的行数
替换(这似乎取自费利克斯的回答)
if(count(mysqli_fetch_array($result_check)) === 1)
与
if(mysqli_num_rows($result_check) == 1)
或
if(mysqli_num_rows($result_check) > 0)
您的原始帖子包含:
if(mysqli_fetch_array($result_check) === 1)
仍然是错误的方法。
mysqli_num_rows()
in a comment,但没有任何说法:
if(mysqli_num_rows($result_check) >0)
并确保$username
已定义。我们不知道如何定义。
现在,如果失败,那么你的表单元素没有被命名,和/或你表单中的其他东西让你失望。
即:<input type="text" name="username">
将error reporting添加到文件的顶部,这有助于查找错误。
<?php
error_reporting(E_ALL);
ini_set('display_errors', 1);
// rest of your code
旁注:错误报告应仅在暂存时完成,而不是生产。
关于使用MD5。
就密码哈希而言,这被认为不再安全。
对于密码存储,请使用CRYPT_BLOWFISH或PHP 5.5的password_hash()
功能。
对于PHP&lt; 5.5使用password_hash() compatibility pack
。
从使用PDO的ircmaxell's answer拉出准备好的陈述和password_hash()
:
只需使用图书馆。认真。它们存在是有原因的。
password_hash()
password-compat
(上面的兼容包不要自己动手。如果你正在创造自己的盐,你做错了。你应该使用一个为你处理这个问题的库。
$dbh = new PDO(...);
$username = $_POST["username"];
$email = $_POST["email"];
$password = $_POST["password"];
$hash = password_hash($password, PASSWORD_DEFAULT);
$stmt = $dbh->prepare("insert into users set username=?, email=?, password=?");
$stmt->execute([$username, $email, $hash]);
登录时:
$sql = "SELECT * FROM users WHERE username = ?";
$stmt = $dbh->prepare($sql);
$result = $stmt->execute([$_POST['username']]);
$users = $result->fetchAll();
if (isset($users[0]) {
if (password_verify($_POST['password'], $users[0]->password) {
// valid login
} else {
// invalid password
}
} else {
// invalid username
}
<强>脚注:强>
我注意到你正在使用标题。
您应在每个标题后添加exit;
。否则,您的代码可能希望继续执行。
header("Location: ../profile.php");
exit;
也为另一个做同样的事。
你也在使用会话。您的帖子中不存在session_start();
,如果不包含在内,则会失败; 洞察。
答案 1 :(得分:1)
这里
if(mysqli_fetch_array($result_check) === 1) {
mysqli_fetch_array返回的值不是整数而是数组。你似乎想要数数:
if(count(mysqli_fetch_array($result_check)) === 1) {
如果出于某种原因以某种方式插入了两个用户,检查count是否大于0可能会阻止插入第三个用户:
if(count(mysqli_fetch_array($result_check)) > 0) {