我正在尝试阻止在数据库中创建重复的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();
}
}
}
?>
答案 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进行更多阅读。