如何使用PHP和MySQL检查重复的用户名?

时间:2016-07-07 11:24:00

标签: php mysql duplicates

我只是学习PHP而且我认为学习一些MySQL也是个好主意。所以我开始研究代码,但由于一些奇怪的原因,我不断收到重复的用户,这真的很糟糕。< / p>

<?php
$link = mysqli_connect(here i put the data);
if(!$link)
{
    echo "Error: " . mysqli_connect_errno() . PHP_EOL;
    exit;
}
else
{
    if(isset($_POST['user']))
    { echo "User set! "; } 
    else { echo "User not set!"; exit; }
    if(isset($_POST['pass']) && !empty($_POST['pass']))
    { echo "Password set! "; } 
    else { echo "Password not set!"; exit; } 
    $num = mysqli_num_rows(mysqli_query("SELECT * FROM `users` WHERE ( username = "."'".$_POST['user']."' )"));
    if($num > 0)
    { echo "Cannot add duplicate user!"; }
    mysqli_close($link);
}
?>

由于一些奇怪的原因,我没有得到我应该得到的输出。我已经尝试了一些在StackOverflow上找到的解决方案,但它们没有用。

5 个答案:

答案 0 :(得分:3)

connectionObject中未提供$num = mysqli_num_rows(mysqli_query($link, "SELECT * FROM `users` WHERE ( `username` = '".$_POST['user']."' )")); //----------------------------------^^^^^^^ 的第一个参数:

$_POST['user'] = mysqli_real_escape_string($link, $_POST['user']);

此外,您的代码易受SQL注入攻击。一个简单的解决方案是:

model: {
    name: {type: String, required: true, es_indexed: true, index: 'not_analyzed'},
    aliases: {type: [String], es_indexed: true, index: 'not_analyzed'},
    birth: {type: Date, es_type: 'date', es_indexed: true, index: 
},

答案 1 :(得分:1)

mysqli_query必须收到两个参数才能正常工作。在这种情况下,您的mysqli_connect

$num = mysqli_num_rows(mysqli_query($link, "SELECT * FROM `users` WHERE ( username = "."'".$_POST['user']."' )"));

此外,在此代码中,您可能会受到SQL注入的影响。

决不直接在查询中添加用户输入而不过滤它们。

这样做可以使您的查询更具可读性和安全性:

$u_name=mysqli_real_escape_string($link, $_POST['user']);
$num = mysqli_num_rows(mysqli_query($link, "SELECT * FROM `users` WHERE ( username = '$u_name' )"));

答案 2 :(得分:1)

要使用mysqli_*扩展名,您必须在所有查询的参数中包含您的连接。

$query = mysqli_query($link, ...); // notice using the "link" variable before calling the query 
$num = mysqli_num_rows($query); 

或者,你可以做的是在你的网站中创建一个query()功能,如下所示:

$link = mysqli_connect(...);

function query($sql){
    return mysqli_query($link, $sql);
}

然后像这样调用它:

query("SELECT * FROM...");

答案 3 :(得分:1)

这可能是竞争条件的问题。

想象一下,两个用户想要同时创建相同的用户名。 两个进程将执行您的脚本。因此,两个脚本都从数据库中进行选择,并发现没有用户具有所需的用户名。然后,都插入用户名。

最佳解决方案是在数据库中的用户名列上创建唯一索引。

ALTER TABLE users ADD unique index username_uix (username);

然后尝试插入用户,如果失败,则表示用户名存在...

答案 4 :(得分:0)

以下是使用预准备语句和错误检查编写代码的方法。

还使用<Style TargetType="DataGridRow"> <Style.Resources> <SolidColorBrush x:Key="{x:Static SystemColors.ControlBrushKey}" Color="DarkGray" /> <SolidColorBrush x:Key="{x:Static SystemColors.ControlTextBrushKey}" Color="White"/> </Style.Resources> </Style> 查找用户数量,而不是依赖SELECT COUNT(*)...。这将从数据库返回更少的数据,看起来更干净。

mysqli_num_rows

请建议修改语法,这是从手机输入的