如何知道哪个条目是重复的(例如用户名+电子邮件)

2eafrhcq  于 2021-06-24  发布在  Mysql
关注(0)|答案(2)|浏览(394)

我想知道是否有可能得到列名,使重复错误的插入?
例如,用户名上有一个唯一键,电子邮件上有另一个唯一键:

try{
        $pdo->query("INSERT INTO `table`(`username`,`email`)`VALUES('Superman','xxx@xx.com')");
    } catch (PDOException $e) {
        if($e->errorInfo[0] == '23000' && $e->errorInfo[1] == '1062'){
           throw new CustomException("Bla bla already exists");
          // How does we get the duplicated column and then display "Email already exists" or "Username already exist"
        } else {
          throw $e;
        }
    }

我们如何获得重复的列信息,然后显示“email already exists”或“username already exists”而不是“duplicate entry(好的,但是哪一个?)
谢谢您,

hkmswyz6

hkmswyz61#

谢谢你的主意。我不认为那个错误能给我这个信息。所以结果是:

try {
        $query = $this->dbh->prepare('INSERT INTO users (username,email) VALUES ("test", "test")');
        $result = $query->execute();
    } catch (PDOException $e) {
        if( $e->errorInfo[0] == '23000' && $e->errorInfo[1] == '1062' ){
            if( strpos($e->getMessage(), 'username') == true ) $result = 'duplicate_username';
            elseif( strpos($e->getMessage(), 'email') == true ) $result = 'duplicate_email';
        } else {
            throw $e;
            $return = false;
        }
    }

基本上是在工作。
谢谢,

bttbmeg0

bttbmeg02#

您可以检查db中的值,或者为用户获取错误消息中的列名称。

try{
    $pdo->query("INSERT INTO `table`(`username`,`email`) VALUES ('Superman','xxx@xx.com')");
} catch (PDOException $e) {
    if (preg_match("/Duplicate entry .+ for key '(.+)'/", $e->getMessage(), $matches)) {
        throw new CustomException($matches[1]." already exist");
    } else {
        throw $e;
    }
}

也可能您更喜欢对“非结果查询字符串”使用exec命令。

$affectedRow = $pdo->exec("INSERT INTO `table`(`username`,`email`) VALUES ('Superman','xxx@xx.com')");

相关问题