【问题标题】:php PDO error "Integrity constraint violation: 1062 Duplicate entry"php PDO 错误“违反完整性约束:1062 重复条目”
【发布时间】:2021-12-31 19:35:27
【问题描述】:

我想制作一个简单的注册表单,我想检查电子邮件是否已被使用,如果没有将数据插入我的数据库。如果我提交表单,我会收到这个致命错误“完整性约束违规:1062 重复条目”,但数据还是提交了,我可以在我的数据库中看到它。如果我只插入数据或检查电子邮件是否已被使用,我不会收到此错误。也许有人可以帮助我。 这是代码:

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));
        }
    }
}

【问题讨论】:

    标签: php pdo


    【解决方案1】:

    代码sn-p有几处错误:

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

    【讨论】:

    • 感谢您的帮助 Oz Solomon 它帮助了我我只是没想到它会尝试多次插入它。现在我已经做到了,比如“从账户中选择电子邮件,其中电子邮件=?”这个。再次感谢!
    猜你喜欢
    • 1970-01-01
    • 2016-01-16
    • 1970-01-01
    • 2014-09-16
    • 2016-05-04
    • 1970-01-01
    • 1970-01-01
    • 2018-06-06
    相关资源
    最近更新 更多