Как узнать, какая запись дублируется? (Например имя пользователя + электронная почта)

0

Я хотел бы знать, возможно ли получить имя столбца, которое сделало дублирующуюся ошибку в INSERT?

Например, с уникальным ключом по имени пользователя и другим уникальным ключом по электронной почте:

    try{
        $pdo->query("INSERT INTO 'table'('username','email')'VALUES('Superman','[email protected]')");
    } 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 уже существует" или "Имя пользователя уже существует" вместо "Дублировать запись (ok, но какой?))

Спасибо,

Теги:
pdo
unique-key

2 ответа

0

Спасибо за идею. Не думал, что ошибка может дать мне эту информацию. Так оно и получится:

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

В основном выполняю работу.

Спасибо,

0

Вы можете проверить значение в имени db или grab colum в сообщении об ошибке для ваших пользователей.

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

также, возможно, вы предпочитаете использовать команду exec для строки запроса non result.

$affectedRow = $pdo->exec("INSERT INTO 'table'('username','email') VALUES ('Superman','[email protected]')");

Ещё вопросы

Сообщество Overcoder
Наверх
Меню