【问题标题】:How to handle SQLSTATE[23000]: Integrity constraint violation: 1062如何处理 SQLSTATE[23000]:违反完整性约束:1062
【发布时间】:2016-10-26 06:16:16
【问题描述】:

一切都在我的代码中运行,但是如果您要创建一个用户,即使您使用相同的电子邮件创建多个用户,它也会接受我已经尝试搜索一些解决方案并将其放入我的代码中,但我仍然无法制作它工作,我怎样才能使 SQLSTATE[23000]:完整性约束违规:1062 更改为“错误电子邮件已存在”?有可能吗?

addform.php

如果有重复,我还想显示一条错误消息

<style type="text/css">
#dis{
display:none;
}
</style>




<div id="dis">
<!-- here message will be displayed -->
</div>


 <form method='post' id='emp-SaveForm' action="#">

<table class='table table-bordered'>

    <tr>
        <td>First Name</td>
        <td><input type='text' name='fname' class='form-control'  required /></td>
    </tr>

    <tr>
        <td>Last Name</td>
        <td><input type='text' name='lname' class='form-control'  required></td>
    </tr>

    <tr>
        <td>Contact Number</td>
        <td><input type='number' name='contactnum' class='form-control'  required></td>
    </tr>

     <tr>
        <td>Email</td>
        <td><input type='email' name='email' class='form-control' required /></td>
    </tr>

     <tr>
        <td>Password</td>
        <td><input type="password" name='pass' class='form-control'  required /></td>
    </tr>

     <tr>
        <td>Language</td>
        <td><input type='text' name='lang' class='form-control'  required /></td>
    </tr> 
    <tr>
        <td colspan="2">
        <button type="submit" class="btn btn-primary" name="btn-save" id="btn-save">
        <span class="glyphicon glyphicon-plus"></span> Save this User
        </button>  
        </td>
    </tr>

</table>

创建.php

<?php
require_once 'dbconfig.php';


if($_POST)
{
    $fname = $_POST['fname'];
    $lname = $_POST['lname'];
    $contactnum = $_POST['contactnum'];
    $email = $_POST['email'];
    $pass = $_POST['pass'];
    $lang = $_POST['lang'];
    try{

        $stmt = $db_con->prepare("INSERT INTO tbluser(fname,lname,contactnum,email,pass,lang) VALUES(:ufname,:ulname,:ucontact,:uemail,:upass,:ulang)");
        $stmt->bindParam(":ufname", $fname);
        $stmt->bindParam(":ulname", $lname);
        $stmt->bindParam(":ucontact", $contactnum);
        $stmt->bindParam(":uemail", $email);
        $stmt->bindParam(":upass", $pass);
        $stmt->bindParam(":ulang", $lang);
        if($stmt->execute())
        {
            echo "Successfully Added";
        }
        else{
            echo "Query Problem";
        }   
    }
    catch(PDOException $e){
        echo $e->getMessage();
    }
}

?>

我只是 php 的新手 我在数据库中使用 PDO 不知道它是否是一件好事感谢您的帮助,请让我知道我是否可以使用或只是复制粘贴您的代码:)

【问题讨论】:

  • pdo 是个好东西
  • PDO 绝对是个好东西。您缺少的可能是唯一索引
  • 如上所述,那么您很可能在电子邮件字段上也缺少唯一索引 - 如果您尝试在电子邮件字段上插入重复值,则使用唯一索引会自动出错唯一索引。检查重复的一种方法是在插入之前搜索要插入的电子邮件SELECT
  • 谢谢你已经按照你说的做了,我收到错误消息 SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry 'joe@yahoo.com' for key 'email' 我可以更改错误消息可能只是“错误添加已使用的新用户电子邮件”?怎么样?

标签: php mysql sql


【解决方案1】:

您应该编辑您的create.php 并从数据库中添加电子邮件检查代码,请检查以下代码以获得更多信息。

<?php
require_once 'dbconfig.php';


if ($_POST) {

    $fname = $_POST['fname'];
    $lname = $_POST['lname'];
    $contactnum = $_POST['contactnum'];
    $email = $_POST['email'];
    $pass = $_POST['pass'];
    $lang = $_POST['lang'];

    // it's good habit to validate email address always 
    // i checked here it should not be blank 
    if ($email != '') {

        // check in database email address is already taken
        $sel = $db_con->prepare("select email from tbluser where email = :email");
        $sel->execute(array(':email' => $email));
        $row = $sel->fetch();

        // if you found any row with current entered email then send it to else
        if ($sel->fetchColumn() == 0) {
            try{
                $stmt = $db_con->prepare("INSERT INTO tbluser(fname,lname,contactnum,email,pass,lang) VALUES(:ufname,:ulname,:ucontact,:uemail,:upass,:ulang)");
                $stmt->bindParam(":ufname", $fname);
                $stmt->bindParam(":ulname", $lname);
                $stmt->bindParam(":ucontact", $contactnum);
                $stmt->bindParam(":uemail", $email);
                $stmt->bindParam(":upass", $pass);
                $stmt->bindParam(":ulang", $lang);
                if($stmt->execute())
                {
                    echo "Successfully Added";
                }
                else{
                    echo "Query Problem";
                }   
            }
            catch(PDOException $e){
                echo $e->getMessage();
            }
        } else {
            echo $email . ' already taken, try other email address';
        }
    } else {
        echo 'Email address is blank';
    }
}

?>

【讨论】:

  • 试过这个不起作用仍然得到 SQLSTATE[23000]:完整性约束违规:1062 密钥“电子邮件”的重复条目“2@yahoo.com”
【解决方案2】:

您需要将 PDO 错误模式设置为。示例:

/* @var $dbConn PDO */
$dbConn = new PDO("mysql:host=$dbHost;dbname=$dbName", $dbUsername, $dbPassword);
/* set the PDO error mode to exception */
$dbConn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

然后将你的执行包裹在 try catch 中以检测错误。

【讨论】:

    猜你喜欢
    • 2016-01-16
    • 2014-07-21
    • 2014-08-18
    • 2014-09-16
    • 2015-03-19
    • 2015-11-27
    • 2017-09-11
    • 2015-01-20
    相关资源
    最近更新 更多