我正在尝试生成一个尚未存在于我的数据库中的唯一用户名,然后将其作为主键添加到我的InnoDB数据库表中以及其他一些字段条目中。
我收到错误代码:
SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry 'ft6888' for key 'PRIMARY'
手动检查数据库表我可以看到它还没有包含我正在传递的值,并且通过回显我绑定的用户名值,我可以看到每个只绑定一次。该字段未设置为auto_increment,就像其中一些问题一样,但它在其他一些表中用作外键(但我绑定的值也不存在)。
如果我在绑定它之前回显出我正在绑定的变量,我会得到两组正确的数据。当我使用phpmyadmin将相同的数据(复制和粘贴)插入到表中时,它可以正常工作没有错误。我只能假设我的代码本身试图插入两次?
$query = "INSERT INTO user_login (username, usertype, hashedpassword) VALUES";
$qPart = array_fill(0, count($excelData), "(?, ?, ?)");
$query .= implode(",",$qPart);
$sth = $dbh->prepare($query);
$i = 1;
$sql = "SELECT username FROM user_login WHERE username = :username";
$sthUser = $dbh->prepare($sql);
Foreach($excelData As $Row){
Do{
//Create unique userID
$finitial = substr(addslashes(str_replace(" ","",$Row['0']['2'])),0,1);
$sinitial = substr(addslashes(str_replace(" ","",$Row['0']['3'])),0,1);
$username = strtolower($finitial).strtolower($sinitial).rand(999,9999);
try {
$sthUser->bindParam(':username', $username);
$sthUser->execute();
$Row = $sthUser->fetch(PDO::FETCH_ASSOC);
}catch (PDOException $e) {
print $e->getMessage();
}
}while(!empty($Row));
$hashedPassword = create_hash($Row['0']['1']);
$usertype = 'Student';
$sth->bindParam($i++, $username);
$sth->bindParam($i++, $usertype);
$sth->bindParam($i++, $hashedPassword);
}
try {
$sth->execute();
}catch (PDOException $e) {
print $e->getMessage();
}
答案 0 :(得分:0)
找到答案here - 似乎循环中的bindParam通过引用绑定,并且仅在execute语句中计算,因此它始终包含每个字段的最后一个绑定值。
将其更改为bindValue有效。