检查用户名是否存在PDO

4
我该如何检查多个因素的组合,而不是逐个检查?基本上,我正在使用PDO,并且必须确保用户名和电子邮件地址是唯一的。那我该怎么做呢?我看过了...
if ( $sthandler->rowCount() > 0 ) {
// do something here
}  

但是有没有更好的方法来完成它呢?如果没有,可以有人解释一下我如何使用它吗?

编辑 以下是我的查询代码,将其输入到数据库中

        <?php
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))
    {
    echo "Complete all fields";
    }

// Password match
if ($password != $password1)
    {
    echo $passmatch = "Passwords don't match";
    }

// Email validation

if (!filter_var($email, FILTER_VALIDATE_EMAIL))
    {
    echo $emailvalid = "Enter a  valid email";
    }

// Password length
if (strlen($password) <= 6){
    echo $passlength = "Choose a password longer then 6 character";
}





function userExists($db, $user)
{
    $userQuery = "SELECT * FROM userinfo u WHERE u.user=:user;";
    $stmt = $db->prepare($userQuery);
    $stmt->execute(array(':user' => $user));
    return !!$stmt->fetch(PDO::FETCH_ASSOC);
}

$user = 'userName';
$exists = userExists($db, $user);
if(exists)
{
     // user exists already.
}
else
{
     // user doesn't exist already, you can savely insert him.
}
if(empty($passmatch) && empty($emailvalid) && empty($passlength)) {

//Securly insert into database
$sql = 'INSERT INTO userinfo (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

    ));
    }
?>

2
展示更多的代码。 - Paul Dessert
这其实没有更多的内容了。一旦我确保输入是有效的,我就将其插入到数据库中。我仍然会添加更多的@relentless。 - user3574362
3个回答

9
 <?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 don't 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 "exists! cannot insert";
} else {
    //Securly insert into database
    $sql = 'INSERT INTO userinfo (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();
}

那么这就是我需要使用的全部吗?我还在我的帖子中编辑了一些更多的代码。 - user3574362
哦,我明白你的意思了,我修改了你的代码以添加逻辑。@user3574362 - meda
嗯,似乎没有输入,现在将其输入到数据库中,或者输出错误信息。 - user3574362
那么$sthandler->bindParam(':username', $username);呢?只需要执行$sthandler->bindParam(':email', $email);吗? - user3574362
我看不到密码加密的地方。 - mickmackusa
显示剩余6条评论

1
像这样的东西应该可以工作:
function userExists($db, $user)
{
    $userQuery = "SELECT * FROM userinfo u WHERE u.user=:user;";
    $stmt = $db->prepare($userQuery);
    $stmt->execute(array(':user' => $user));
    return !!$stmt->fetch(PDO::FETCH_ASSOC);
}

$user = 'userName';
$exists = userExists($db, $user);
if(exists)
{
     // user exists already.
}
else
{
     // user doesn't exist already, you can savely insert him.
}

我不太确定在那段代码中需要修改什么才能让它适用于我的代码。我有一个编辑,如果你能帮助我那就太好了。 - user3574362
我想知道你是否尝试去理解它。你应该把"user"改成"username",这个应该很容易理解。 - Jonast92
为什么在你只需要行数的时候要获取整行数据? - mickmackusa
@mickmackusa 过去的 Jonas 有很多需要解释的事情 :) - Jonast92

-1
你展示的代码没有太多意义来检查用户名和电子邮件是否唯一。你应该在数据库上设置“UNIQUE KEY”。

为什么这没有意义呢? - user3574362
如果数据已经存在,您应该尝试进行“INSERT”并检查错误。如果您想逐步完成它:
  1. 检查是否有该用户名/电子邮件的条目
  2. 如果没有,则插入
有时候,如果用户快速提交表单,可能会同时获得两个会话的两个条目(通常发生在这种情况下)。
- pawel7318

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接