如何检查PHP / MYSQL中是否已存在用户名

时间:2016-10-05 20:07:21

标签: php mysql mysqli

我知道这已经发布了很多次,而且我已经尝试了几乎所有这个网站上的答案,但没有任何方法可行。每当我尝试运行注册过程时,即使已经使用了用户名,也会跳过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,但除此之外别无其他。感谢。

3 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

  

MYSQL:此扩展在PHP 5.5.0中已弃用,并已在PHP 7.0.0中删除。相反,应使用MySQLiPDO_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驱动程序,其中一些包括用于访问Free TDS,Sybase,Microsoft SQL Server,IBM DB2,Firebird / Interbase 6,Oracle Call Interface和PostgreSQL数据库的PDO驱动程序等等。

每个系统都不会自动提供驱动程序,因此您必须找到可用的驱动程序并添加所需的驱动程序。

  • 数据库连接

建立依赖于特定数据库的数据库连接有不同的语法。使用PDO时,您需要确保您的操作包含在try / catch块中,并且您要使用异常技术。

在正常情况下,只需要建立一个连接,并通过将数据库句柄编程为null来关闭连接。您可以在各种资源站点中查找更具体的选项和语法。

  • 错误处理

PDO允许使用异常进行错误处理,这就是建议您将PDO包装在try / catch块中的原因。这样,可以强制PDO进入相关的错误模式属性,以产生异常。

有三种 - 静音(默认),警告和异常 - 模式。后两者在DRY编程中更有用。 “警告”错误模式对于调试非常有用,“异常”模式允许在隐藏可能用于利用系统的数据时进行正常的错误处理。

  • 插入和更新

PDO将公共插入和更新数据库操作压缩为一个简单的两步过程: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();
}

希望这个参考可能对您自己在将来的项目中开发代码很有用。

答案 2 :(得分:-6)

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

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