Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/265.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用PHP/MYSQL检查用户名是否已经存在_Php_Mysql_Mysqli - Fatal编程技术网

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

如何使用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

我知道这被贴了很多次,我在这个网站上尝试了几乎所有的答案,但没有任何效果。每当我尝试运行注册过程时,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,但除此之外没有其他问题。谢谢。

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

$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扩展的程序员,概述了前者的优势。在接下来的几段中将研究不同的方面

  • 数据库支持
PDO扩展能够访问为其编写PDO驱动程序的任何数据库。有许多可用的PDO驱动程序,其中一些包括用于访问免费TDS、Sybase、Microsoft SQL Server、IBM DB2、Firebird/Interbase 6、Oracle调用接口和PostgreSQL数据库的PDO驱动程序

驱动程序并不是在每个系统中都自动可用,因此您必须找到可用的驱动程序并添加所需的驱动程序

  • 数据库连接
根据特定的数据库,有不同的语法来建立数据库连接。在使用PDO时,您希望确保您的操作包装在try/catch块中,并且使用异常技术

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

  • 错误处理
PDO允许使用异常进行错误处理,这就是为什么建议您将PDO包装在try/catch块中。通过这种方式,PDO可以强制进入相关的错误模式属性,以生成异常

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

  • 插入和更新
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();
}

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