如何检查MySQLi行中是否已存在用户名?

时间:2017-01-22 12:27:32

标签: php mysql mysqli

这是我的数据库 Database img

想象一下,模糊的文字只是“测试”。

我有一个基本的登录/注册表单,可以将数据插入数据库。我想确保你不能让2个用户拥有相同的电子邮件地址,我尝试了以下代码,但由于某些原因,它忽略了这一点,只是让我用同一封电子邮件创建一个帐户。如果您选择其他人使用的电子邮件,我将如何编辑此代码以使其显示错误?任何帮助表示赞赏。

$exist = mysqli_query($conn, "SELECT * FROM username WHERE username='".$username."'");

if(mysqli_num_rows($exist) > 0){
    die("email already exists");
}

这是我的$conn $conn = new mysqli($servername, $dbusername, $dbpassword, $dbname);

与数据库的连接工作正常。

2 个答案:

答案 0 :(得分:0)

  

我想确保您不能让2位用户使用相同的电子邮件地址

确保这一点的最佳方法是在email上设置唯一约束/索引:

alter table accounts add constraint unq_accounts_email unique (email);

您似乎也希望username也一样:

alter table accounts add constraint unq_accounts_username unique (username);

然后,当您尝试插入带有重复项的行时,您将遇到约束违规。

为什么在数据库中执行此操作会更好?最重要的问题是竞争条件 - 两个人同时尝试注册同一个usernameemail。执行检查然后执行插入仍然允许重复。

答案 1 :(得分:-2)

首先将您的查询更改为从$conn = new mysqli($servername, $dbusername, $dbpassword, $dbname); $result = $conn->query("SELECT * FROM username WHERE username='".$username."'"); $rows = $result->num_rows; if($rows > 0) { die('email already exists'); } 表中选择。

然后你正在使用mysqli的面向过程和面向对象的形式。使用面向对象的mysqli创建连接,然后使用过程mysqli函数。

我们假设您只使用面向对象:

$conn = mysqli_connect($servername, $dbusername, $dbpassword, $dbname);

用于程序更改您的连接启动:

$step = 3;
$injectedValue = "X";
$arrayOfArray = array_chunk($myArr, $step);
$myArr = [];
foreach($arrayOfArray as $k => $v){
    array_push($v, $injectedValue);
    $myArr = array_merge($myArr, $v);
}
print_r($myArr);

您还可以通过在该用户名列上添加UNIQUE KEY来强制执行数据库以使该字段保持唯一