我正在执行查询以检查用户是否存在,然后再将其添加到数据库。如果该结果返回,则死亡并回显“用户名已存在”,但如果返回为空,则将新用户添加到数据库中。
出于某种原因,它只是向数据库添加了一个新用户。
//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");
}
最佳答案
在花几分钟测试您的代码后,发现您使用了错误的函数。
Fetch a result row as an associative, a numeric array, or both
您正在尝试获取关联数组。
相对于 mysqli_num_rows()
:
Gets the number of rows in a result
替换(这似乎取自 Félix 的回答)
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)
and make sure$username
is defined. We don't know how/where if it is even defined.
现在,如果 THAT 失败了,那么你的表单元素没有命名,和/或你表单中的其他东西让你失败。
即:<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 < 5.5 使用 password_hash() compatibility pack
.
来自 ircmaxell's answer它使用带有准备好的语句的 PDO 和 password_hash()
:
只需使用一个库。严重地。它们的存在是有原因的。
- PHP 5.5+:使用
password_hash()
- PHP 5.3.7+:使用
password-compat
(以上的兼容包 - 所有其他:使用 phpass
不要自己动手。如果您要创建自己的盐,您做错了。你应该使用一个库来为你处理。
$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
}
脚注:
我注意到您正在使用 header 。
您应该添加 exit;
在每个标题之后。否则,您的代码可能想要继续执行。
header("Location: ../profile.php");
exit;
对另一个也做同样的事情。
您也在使用 session 。 session_start();
不存在于您的帖子中,如果不包含将会失败; 洞察力。
关于php - 为什么不检查用户是否存在?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30245973/