防止数据库中的重复ID

时间:2014-01-02 04:55:43

标签: php mysql pdo

我正在尝试阻止在数据库中创建重复的ID。

我已根据其他示例添加了此内容:

select * from users where NOT EXISTS(select * from users where users.username = ?)"; 

但它似乎无法正常工作,它为我提供了这个错误:

  

SQLSTATE [HY093]:参数号无效:混合名称和位置参数

任何帮助表示赞赏,或者解决方案非常有用,我是一名php学习者(新手)。

以下是我正在使用的代码:

<?php

 class Users {
 public $username = null;
 public $password = null;
 public $salt = "************************hidden*****************************";

 public function __construct( $data = array() ) {
     if( isset( $data['username'] ) ) $this->username = stripslashes( strip_tags( $data['username'] ) );
     if( isset( $data['password'] ) ) $this->password = stripslashes( strip_tags( $data['password'] ) );
 }

 public function storeFormValues( $params ) {
    //store the parameters
    $this->__construct( $params ); 
 }

 public function userLogin() {
     $success = false;
     try{
        $con = new PDO( DB_DSN, DB_USERNAME, DB_PASSWORD ); 
        $con->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
        $sql = "SELECT * FROM users WHERE username = :username AND password = :password LIMIT 1";

        $stmt = $con->prepare( $sql );
        $stmt->bindValue( "username", $this->username, PDO::PARAM_STR );
        $stmt->bindValue( "password", hash("sha256", $this->password . $this->salt), PDO::PARAM_STR );
        $stmt->execute();

        $valid = $stmt->fetchColumn();

        if( $valid ) {
            $success = true;
        }

        $con = null;
        return $success;
     }catch (PDOException $e) {
         echo $e->getMessage();
         return $success;
     }
 }

 public function register() {
    $correct = false;
        try {
            $con = new PDO( DB_DSN, DB_USERNAME, DB_PASSWORD );
            $con->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
            $sql = "INSERT INTO users(username, password) VALUES(:username, :password) select * from users where NOT EXISTS(select * from users where users.username = ?)";

            $stmt = $con->prepare( $sql );
            $stmt->bindValue( "username", $this->username, PDO::PARAM_STR );
            $stmt->bindValue( "password", hash("sha256", $this->password . $this->salt), PDO::PARAM_STR );
            $stmt->execute();
            return "Registration Successful <br/> <a href='index.php'>Login Now</a>";
        }catch( PDOException $e ) {
            return $e->getMessage();
        }
     }

 }

?>

3 个答案:

答案 0 :(得分:2)

如果您想防止重复的条目,为什么不将该列设为'PRIMARY'或'UNIQUE'?

答案 1 :(得分:0)

使用您要插入的ID运行查询会不会更容易,如果它返回空,则插入else会显示错误

答案 2 :(得分:0)

$sql = "INSERT INTO users(username, password) VALUES(:username, :password) select * from users where NOT EXISTS(select * from users where users.username = ?)";

您不能只将SQL的随机位添加到SQL的其他位上,并期望它能够正常工作。

你得到的错误,

  

SQLSTATE [HY093]:参数号无效:混合名称和位置参数

表示您已将:parameters?参数混合在一起。如果重新读取SQL语句,您将看到它包含两者。但这有点没有实际意义,因为它不是有效的SQL。

如果要强制使用该用户名是唯一的,请为其指定一个UNIQUE键。当您尝试插入具有相同用户名的其他用户时,这将导致数据库错误。您必须在register()函数中处理此错误,并将有意义的消息反馈给用户。

如果要在尝试创建新用户帐户之前检查该用户名是否存在,可以编写类似

的查询
 SELECT EXISTS(SELECT * FROM users WHERE username=?)

如果使用用户名,则返回1,否则返回0.

如果您不熟悉如何运行此查询,则应该对PHP,PDO和MySQL进行更多阅读。