php PDO 错误 "Integrity constraint violation: 1062 Duplicate entry"

php PDO error "Integrity constraint violation: 1062 Duplicate entry"

我想制作一个简单的注册表单,我想在其中检查电子邮件是否已被使用,如果没有,则将数据插入我的数据库。如果我提交表单,我会收到这个致命错误“Integrity constraint violation: 1062 Duplicate entry”但是数据还是被提交了,我可以在我的数据库中看到它。如果我只插入数据或检查电子邮件是否已被使用,我不会得到这个 error.maybe 有人可以帮我解决这个问题。 这是代码:

html

<form action="test.php" method="POST">
    <input type="text" name="name" placeholder="name" autofocus="on">
    <input type="text" name="email" placeholder="email">
    <input type="submit">
</form>

php

try
{
    $pdo = new PDO($attr, $user, $pass, $opts);
}
catch (PDOException $e)
{
    throw new PDOException($e->getMessage(), (int)$e->getCode());
}

if($_POST)
{
    $name = $_POST['name'];
    $email = $_POST['email'];

    $emailAbfrage = "SELECT email FROM accounts";
    $result = $pdo->query($emailAbfrage);
    while($row = $result->fetch())
    {
        if($email == $row['email'])
        {
            echo "email ist schon vergeben";
        }
        else 
        {
            $insert = $pdo->prepare("INSERT INTO `accounts`(`kundenname`, `email`) VALUES (?,?)");
            $insert->execute(array($name, $email));
        }
    }
}

代码片段有一些错误:

  1. 您遍历所有帐户。如果你得到一个匹配然后你打印 email is schon vergeben 但你没有 break 所以它仍然会遍历所有其他帐户,在那里你会到达 else,尝试插入重新登录,得到Duplicate Entry异常
  2. 您的查询字面意思是 returns 所有 数据库中的帐户。更好的是 SELECT email FROM accounts WHERE email=?,它只是 return 您关心的一个帐户。
  3. 甚至比做 SELECT 更好,你可以做 INSERT INTO accounts(kundenname, email) VALUES (?,?) ON DUPLICATE KEY UPDATE email=VALUES(email)。仅当帐户不存在时才会插入。您可以检查 returned 行数以查看它是否添加了新记录。如果账户已经存在,请更改 ON DUPLICATE KEY UPDATE... 之后的部分以满足您的需要。