如何使用PHP/MYSQL检查用户名是否已经存在
我知道这被贴了很多次,我在这个网站上尝试了几乎所有的答案,但没有任何效果。每当我尝试运行注册过程时,if语句都会被跳过,即使用户名已经被占用。 以下是代码的一部分:如何使用PHP/MYSQL检查用户名是否已经存在,php,mysql,mysqli,Php,Mysql,Mysqli,我知道这被贴了很多次,我在这个网站上尝试了几乎所有的答案,但没有任何效果。每当我尝试运行注册过程时,if语句都会被跳过,即使用户名已经被占用。 以下是代码的一部分: $username = $_POST['username']; $password = $_POST['password']; $sql = mysql_query("SELECT * FROM users (username, password) WHERE username = '".$username
$username = $_POST['username'];
$password = $_POST['password'];
$sql = mysql_query("SELECT * FROM users (username, password) WHERE username = '".$username."'")
if(mysql_num_rows($sql)>0)
{
echo 'taken';
}
else
{
...
}
我还应该注意到,我看到一个帖子,其中有人说他们有与此相同的问题,因为他们必须使用mysqli,但除此之外没有其他问题。谢谢。此代码不安全。你应该在使用前准备好收入数据。至少:
$username = addslashes(strip_tags($_POST['username']));
这不是最优雅的解决方案。但它会检查用户名是否存在
if (isset($_POST["username"]) && isset($_POST["password"])) {
$username = $_POST["username"];
$password = $_POST["password"];
$stmt = $this->db->prepare('SELECT COUNT(*) FROM yourtable WHERE username=?');
$stmt->bind_param("s", $username);
$stmt->execute();
$get_instances = NULL;
$stmt->bind_result($get_instances);
$instances = NULL;
while ($stmt->fetch()) {
$instances = $get_instances;
}
$stmt->close();
if ($instances == 0) {
//whatever you want to happen
}
}
MYSQL:此扩展在PHP5.5.0中被弃用,在PHP7.0.0中被删除。相反,应该使用MySQLi
或PDO_-MySQL
扩展
MYSQLI参考:
PDO参考:
使用PDO的优点:
大多数PHP程序员已经发现了如何使用MySQLi和MySQL扩展。然而,PHP数据对象(PDO)提供了使用对象和检索准备好的语句的方法,这使得工作更加容易
PDO是PHP中的一种数据库访问工具,它支持跨多个数据库的统一访问。它不支持特定于数据库的语法,但它允许在不同平台和数据库之间进行相对无缝的切换,这只需更改连接字符串即可完成
下面是关于PDO的一些信息,主要针对仍在使用MySQL和MySQLi扩展的程序员,概述了前者的优势。在接下来的几段中将研究不同的方面
- 数据库支持
- 数据库连接
- 错误处理
- 插入和更新
Prepare>>[Bind]>>Execute
。使用此方法,您可以充分利用PDO准备好的语句,这些语句通过SQL注入为您提供针对恶意攻击的保护
准备好的语句是预编译的SQL语句,可以通过将此数据发送到服务器来执行多次。它们的优势在于占位符中使用的数据会自动受到SQL注入攻击的保护
因此,最好使用PDO,它将避免现在流行的SQL注入
检查数据库中是否存在用户名和密码字段的PDO代码:
<?php
//Connections
try {
$handler = new PDO('mysql:host=localhost;dbname=s','root', '*');
$handler->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e){
exit($e->getMessage());
}
$name = $_POST['name'];
$username = $_POST['username'];
$email = $_POST['email'];
$password = $_POST['password'];
$password1 = $_POST['passwordconf'];
$ip = $_SERVER['REMOTE_ADDR'];
//Verifcation
if (empty($name) || empty($username) || empty($email) || empty($password) || empty($password1)){
$error = "Complete all fields";
}
// Password match
if ($password != $password1){
$error = "Passwords do not match";
}
// Email validation
if (!filter_var($email, FILTER_VALIDATE_EMAIL)){
$error = "Enter a Valid email";
}
// Password length
if (strlen($password) <= 6){
$error = "Choose a password longer then 6 character";
}
if(!isset($error)){
//no error
$sthandler = $handler->prepare("SELECT username FROM users WHERE username = :name");
$sthandler->bindParam(':name', $username);
$sthandler->execute();
if($sthandler->rowCount() > 0){
echo "User Already Exists.";
} else {
//Securly insert into database
$sql = 'INSERT INTO users (name ,username, email, password, ip) VALUES (:name,:username,:email,:password,:ip)';
$query = $handler->prepare($sql);
$query->execute(array(
':name' => $name,
':username' => $username,
':email' => $email,
':password' => $password,
':ip' => $ip
));
}
}else{
echo "error occured: ".$error;
exit();
}
No,No,No.addslashes
不是可以使用的工具,而strip\u tags
更是胡说八道。如果不能使用带有占位符值的预处理语句,那么这里唯一可接受的解决方案是一个转义函数,如mysql\u real\u escape\u string
。很抱歉这么严厉,但这种错误信息必须得到纠正。这是一个可怕的建议。为了爱这个世界上所有美好的事物,请使用事先准备好的语句和绑定的标语牌。如果由于某种深不可测的原因,这是不可能的,那么SQL文本中包含的潜在恶意内容必须正确转义。使用“addslashes”和“strip_标签”进行转义是不可接受的;这是不可原谅的。使用明确用于此目的的函数,例如mysqli\u real\u escape\u string
mysql\u query
已失效,它已从PHP7中删除。请停止使用它,至少使用mysqli
。PDO是一个更好的选择。警告:编写自己的访问控制层并不容易,而且有很多机会使它严重出错。请不要编写您自己的身份验证系统,因为任何现代的同类产品都具有强大的内置功能。至少,请遵循并永远不要将密码存储为纯文本。我可以使用用户名“foo”和“0”='1
”注册吗?(我想用同一个用户名注册多次。)@b0ss-filthy。我已经给你提供了清楚的解释。请尝试一下,如果您遇到任何阻碍,请告诉我。本教程可能有助于将上述代码置于上下文中:这对我来说很有效,但做了一些小改动,谢谢。我将使用这种方法,直到我找到更好的主机,它有更新的php版本的服务器,并可能在那之后切换到PDO扩展。谢谢你。看完你的p