【问题标题】:Custom PHP script PDO is throwing exception 23000,1062 duplicate entry自定义 PHP 脚本 PDO 抛出异常 23000,1062 重复条目
【发布时间】:2014-12-14 16:54:24
【问题描述】:

我正在编写一个 PHP 脚本,我使用 PDO 在 mySQL 中插入数据。我收到一个错误 "23000",1062,"Duplicate entry 'email@email.com-username' for key 'email',但它在数据库中插入数据。

这是我的 PHP 代码:

if(isset($_POST['email'])){
            $this->db = new connect();
            $this->db = $this->db->dbConnect();
            $this->encryption = new Encryption();

            isset($_POST['timezone']) AND $_POST['timezone'] != 'null' ? date_default_timezone_set($_POST['timezone']): date_default_timezone_set('America/Chicago');

            $this->email        = $_POST['email'];

            $this->username     = $_POST['username'];

            $this->password     = $this->encryption->encode($_POST['password']);

            $this->dTime        = date("Y-m-d H:i:s");;

            $this->sessionKey   = $_POST['key'];

            $this->country      = $_POST['country'];

            $this->region       = $_POST['uregion'];

            $this->browser      = $_POST['browser'];

            $this->ip           = $_POST['accessFrom'];

            $regMessage = array('error'=>false);

            try{

            $query = "INSERT INTO `users` (

                        id, email, uname, password, regtime, sessionkey, country, region, browser, ip

                        ) VALUES (

                        (SELECT MAX(id) + 1 FROM `users` AS `maxId`), :email, :uname, :password, :regtime, :sessionkey, :country, :region, :browser, :ip

                        )";

            $register = $this->db->prepare($query, array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY));


            if($this->sessionKey === $_SESSION['token']){

                $register->bindParam(':uname', $this->username);     
                $register->bindParam(':email', $this->email);   
                $register->bindParam(':password', $this->password); 
                $register->bindParam(':regtime', $this->dTime); 
                $register->bindParam(':sessionkey', $this->sessionKey); 
                $register->bindParam(':country', $this->country);
                $register->bindParam(':region', $this->region); 
                $register->bindParam(':browser', $this->browser); 
                $register->bindParam(':ip', $this->ip);
                $register->execute();       

                    if($register->rowCount() > 0){

                        $regMessage = array('error'=>false);

                    }else{
                        $regMessage = array('error'=>true);
                    }                   

                }else{

                    throw new PDOException ('Error');

                    }

            }

            catch(PDOException $e){



//this is where I am getting error so I am echoing pdo exception error 

 $regMessage = array('error'=>$e);



            }

            header('Content-Type: application/json');

            echo json_encode($regMessage);

        }else{

            header('Location: /');
        }

在错误中,它显示重复输入 emailid + 用户名的关键电子邮件,看起来像 email@email.com-username

但在数据库中,我仅在电子邮件列中获取电子邮件 ID,仅在用户名列中获取用户名。 那么谁能告诉我我的代码有什么问题?

我的用户表结构是

CREATE TABLE IF NOT EXISTS `users` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `email` varchar(250) CHARACTER SET utf8 NOT NULL,
  `uname` varchar(20) CHARACTER SET utf8 NOT NULL,
  `password` varchar(100) CHARACTER SET utf8 NOT NULL,
  `regtime` datetime NOT NULL,
  `sessionkey` varchar(10) CHARACTER SET utf8 NOT NULL,
  `country` varchar(25) CHARACTER SET utf8 NOT NULL,
  `region` varchar(25) CHARACTER SET utf8 NOT NULL,
  `browser` varchar(25) CHARACTER SET utf8 NOT NULL,
  `ip` varchar(16) CHARACTER SET utf8 NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `email` (`email`,`uname`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

那么谁能告诉我哪里出了问题?

谢谢你帮助我。

【问题讨论】:

    标签: php mysql pdo


    【解决方案1】:
    CREATE TABLE IF NOT EXISTS `users` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `email` varchar(250) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
      `uname` varchar(20) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
      `password` varchar(100) CHARACTER SET utf8 NOT NULL,
      `regtime` datetime NOT NULL,
      `sessionkey` varchar(10) CHARACTER SET utf8 NOT NULL,
      `country` varchar(25) CHARACTER SET utf8 NOT NULL,
      `region` varchar(25) CHARACTER SET utf8 NOT NULL,
      `browser` varchar(25) CHARACTER SET utf8 NOT NULL,
      `ip` varchar(16) CHARACTER SET utf8 NOT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
    

    这就是解决方案。

    【讨论】:

      【解决方案2】:

      错误消息中的措辞:'email@email.com-username' for key 'email' 直接对应于您的唯一键 UNIQUE KEY 'email' ('email','uname')。使用该行,您正在创建一个复合键,您可以将其视为索引中由 email-uname 组成的不可见列。不会有使用这种格式的列添加到您的表中,并且您会看到 email 和 uname 在表中单独处理并一起作为键处理的预期行为。

      如果您想使用相同的电子邮件和用户名组合反复测试,则需要每次都删除该行。如果不这样做,您看到的错误正是我希望看到的,如果您一遍又一遍地发布相同的数据。

      我还想提一下,您已经(适当地)指定了您的 id 列是 AUTO_INCREMENT,但是您正在手动计算该值。我想劝阻您不要这样做,而是使用 NULL 作为插入值。 MySQL 将在此列中使用正确的键值,如果您曾在同一时刻执行其中两个操作,您将避免键冲突的可能性。

      【讨论】:

      • 关于id 我遇到的问题是它不是1、2、3,而是像1、5、15、19等,所以我必须这样做。但是你能告诉我如何解决这个重复输入错误吗?
      • “解决”到底是什么意思?如果您提交重复的条目,这个错误正是您想要发生的,对吗?当您再次提交相同的数据时,应该会发生什么?
      • 不,我没有提交重复条目。我在每封新电子邮件和用户名提交时都会收到此错误。我正在使用 ajax 和 jquery,所以我首先检查用户名和电子邮件是否已注册。如果它已注册,那么我不允许用户使用相同的详细信息进行注册。所以这些代码不会执行。但是我收到新条目时出现此错误。
      • 我解决它的任何方法。我删除了 email 和 uname 的唯一键,并将其更改为 utf8_bin。它现在工作。无论如何,谢谢你帮助我。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-02-18
      • 2011-10-06
      • 2012-04-08
      • 2015-12-12
      • 2011-05-30
      • 1970-01-01
      相关资源
      最近更新 更多