如何用php/mysql检查用户名是否已经存在

yuvru6vn  于 2021-06-24  发布在  Mysql
关注(0)|答案(3)|浏览(377)

我知道这被张贴了很多次,我已经尝试了几乎所有的答案在这个网站上,但没有任何工作。每当我尝试运行注册过程时,if语句都会被跳过,即使用户名已经被占用。下面是代码的一部分:

$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,但除此之外,没有别的。谢谢。

amrnrhlw

amrnrhlw1#

此代码不安全。你应该在使用前准备好收入数据。至少:

$username = addslashes(strip_tags($_POST['username']));
qij5mzcb

qij5mzcb2#

这不是最优雅的解决方案。但它会检查用户名是否存在。

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        
    }
}
wecizke3

wecizke33#

mysql:这个扩展在php5.5.0中被弃用,在php7.0.0中被删除。取而代之的是 MySQLi 或者 PDO_MySQL 应使用扩展名。
mysqli参考:http://php.net/manual/en/mysqli.query.php
pdo参考:http://php.net/manual/en/book.pdo.php
使用pdo的优点:
大多数php程序员已经发现了如何使用mysqli和mysql扩展。然而,php数据对象(pdo)提供了处理对象和检索准备好的语句的方法,这使得工作更加容易。
pdo是php中的一个数据库访问工具,它支持跨多个数据库的统一访问。它不支持特定于数据库的语法,但它允许在不同平台和数据库之间进行相对无缝的切换,这可以通过更改连接字符串来完成。
下面是一些关于pdo的信息,主要针对那些仍在使用mysql和mysqli扩展的程序员,概述了前者的优势。接下来的几段将研究不同的方面。
数据库支持
pdo扩展能够访问为其编写pdo驱动程序的任何数据库。有许多可用的pdo驱动程序,其中一些包括用于访问免费tds、sybase、microsoft sql server、ibm db2、firebird/interbase 6、oracle call interface和postgresql数据库的pdo驱动程序等等。
驱动程序并不是在每个系统中都自动可用,因此您必须找到可用的驱动程序并添加所需的驱动程序。
数据库连接
有不同的语法来建立依赖于特定数据库的数据库连接。在使用pdo时,您希望确保您的操作被 Package 在try/catch块中,并且您使用了异常技术。
在正常情况下,只需要建立一个连接,通过将数据库句柄编程为null来关闭连接。您可以在各种资源站点中查找更具体的选项和语法。
错误处理
pdo允许使用异常来处理错误,这就是为什么建议您将pdo Package 在try/catch块中。这样,pdo就可以强制进入相关的error mode属性,以产生异常。
有三种模式:静默(默认)、警告和异常。后两者在干编程中更有用警告“错误”模式对调试非常有用,“异常”模式允许在隐藏可能被人利用系统进行攻击的数据时进行优雅的错误处理。
插入和更新
pdo将常见的插入和更新数据库操作浓缩为一个简单的两步过程: Prepare >> [Bind] >> Execute . 通过这种方法,您可以充分利用pdo的prepared语句,这些语句通过sql注入为您提供防止恶意攻击的保护。
prepared语句是预编译的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();
}

希望此参考资料能对您在将来的项目中自行开发代码有所帮助。

相关问题