PHP mysql注册页面问题
下午好! 我试图在我的网页上注册,但我遇到了一个问题-注册正在进行,但它可以创建多个具有相同符号和相同电子邮件的用户,并且在密码不匹配时不会给出错误 这是表格-PHP mysql注册页面问题,php,mysqli,registration,Php,Mysqli,Registration,下午好! 我试图在我的网页上注册,但我遇到了一个问题-注册正在进行,但它可以创建多个具有相同符号和相同电子邮件的用户,并且在密码不匹配时不会给出错误 这是表格- <form action = "register.php" method = "post"> Select username:<br> <input type = "text" name = "username">
<form action = "register.php" method = "post">
Select username:<br>
<input type = "text" name = "username"><br>
Your e-mail:<br>
<input type = "email" name = "email"><br>
Set password:<br>
<input type = "password" name = "password1"><br>
Repeat password:<br>
<input type = "password" name = "password2"><br>
<button> </button>
</form>
选择用户名:
您的电子邮件:
设置密码:
重复密码:
这是PHP代码-
<?php
if (isset($_POST['username']) && isset($_POST['email']) && isset($_POST['password1']) && isset($_POST['password2'])){
$query = 'select * from users where username = "'.addslashes($_POST['username']).'"';
$numrows = mysqli_num_rows($link,$query);
if($numrows == 0){
$query_mail = 'select * from users where email = "'.addslashes($_POST['email']).'"';
$numrows_mail = mysqli_num_rows($link,$query_mail);
if($numrows_mail == 0){
if(isset($_POST['password1']) == isset($_POST['password2'])){
$sql = 'INSERT INTO users (username,password,email) VALUES("'.addslashes($_POST['username']).'","'.addslashes($_POST['password1']).'","'.addslashes($_POST['email']).'")';
$result = mysqli_query($link,$sql) or die(mysqli_error($link));
if($result){
echo 'Account sucsessfully created! You can now log in.';
}else{
var_dump($result);
}
}else {
echo 'Passwords must match!';
}
}else {
echo 'E-mail allready registered!';
}
}else{
echo 'Username allready in use!';
}
}
?>
当您执行此操作时如果(isset($\u POST['password1'])==isset($\u POST['password2'])
要检查密码是否匹配,您必须将其更改为如果($\u POST['password1']=$\u POST['password2'])
,如果您想检查密码是否匹配。我对您的代码做了一些修改,以便您了解如何使用带有占位符的参数化查询这在安全方面非常重要,您不应该“以后再添加”,因为它很可能永远不会完成。下面的代码片段还正确地散列了您的密码,因为这也是非常重要的。在构建应用程序时,安全性永远不应被忽视,并且始终是您考虑的第一件事
<?php
if (isset($_POST['username'], $_POST['email'], $_POST['password1'], $_POST['password2'])) {
$errors = array();
$stmt = $link->prepare("SELECT COUNT(id) FROM users WHERE username=?");
$stmt->bind_param("s", $_POST['username']);
$stmt->execute();
$stmt->bind_result($count_username);
$stmt->fetch();
$stmt->close;
$stmt = $link->prepare("SELECT COUNT(id) FROM users WHERE email=?");
$stmt->bind_param("s", $_POST['email']);
$stmt->execute();
$stmt->bind_result($count_email);
$stmt->fetch();
$stmt->close;
if ($count_username)
$error[] = "That username already exists";
if ($count_email)
$error[] = "That email already exists";
if ($_POST['password1'] !==$_POST['password2'])
$errors[] = "Passwords doesn't match";
if (empty($errors)) {
$password = password_hash($_POST['password1'], PASSWORD_DEFAULT);
$stmt = $link->prepare("INSERT INTO users (username, password, email) VALUES (?, ?, ?)");
$stmt->bind_param("sss", $_POST['username'], $_POST['email'], $password);
if (!$stmt->execute()) {
if ($db->errno == 1062) {
/* Some unique values in the database was attempted inserted, might want to add some error-handling */
}
} else {
/* Execution of query failed, TODO: add error-handling */
}
$stmt->close();
} else {
foreach ($errors as $e)
echo $e."\n";
}
}
您所说的“具有相同符号的多个用户”是什么意思?你能举几个例子吗?实际上,您没有运行查询来检查电子邮件,而是使用mysqli\u num\u行($link,$query\u mail)代码>-这会给您带来错误。您还应该注意,直接在查询中使用变量(尤其是用户输入)是不安全的。你应该在你的查询中使用带有占位符的mysqli::prepare()
——手册中有一些例子,而且if(isset($\u POST['password1'])==isset($\u POST['password2'])
没有检查密码是否匹配,只要它们都设置好了。就像我可以让多个用户使用用户名-“testuser”。关于电子邮件-我想不是。不要用纯文本存储密码!这根本不安全!PHP有内置的函数,您应该使用这些函数来处理密码的存储,请参阅更安全的函数!我猜这是OOP PHP?如果是这样的话,那么我只是在学习PHP编程,很快就会开始OOP,所以我并不完全理解,但我现在将学习您的代码并提供链接。哈奇·塔克斯!另外,在$u POST之前不需要“addslashes”?这是MySQLi的面向对象方法,是的。如果您愿意,您也可以使用过程性的,每个函数的手册都会告诉您如何使用(比如mysqli_prepare($link,“…”)
而不是$link->prepare(“…”)
),并且不,addslashes()
是一个可怕的函数,像这样使用参数化查询,您不必在查询中转义引号。