Получить идентификатор записи дублирующейся строки

0

У меня есть следующий запрос:

$Query = "INSERT INTO table (name, bio) VALUES ('aname', 'abio')";
$stmt = $conn->prepare($Query);
$stmt->execute();
$last_id = $stmt->lastInsertId();

$Query = "INSERT INTO table2 (tid, papers) VALUES ($last_id, '1') ON DUPLICATE KEY UPDATE papers = '2'";
$stmt = $conn->prepare($Query);
$stmt->execute();

table имеет aname, abio: unique, а table2 имеет tid, papers: unique

Пользователь должен ввести INSERT name и bio Если он уже существует или нет, они вставляют papers в table2 с id вставленного name, bio. Проблема в том, что если name, bio уже существует, t получить $last_id

Как я могу вытащить id дублированной строки Когда PDO сообщает мне, что это Dupicate?

  • 0
    Я так понимаю, это говорит вам об исключении ?, вы можете перехватить исключение и найти его по уникальному полю, которое не удалось вставить.
Теги:
pdo

1 ответ

1
Лучший ответ

Я предполагаю, что это

Как я могу вытащить идентификатор дублированной строки Когда PDO сообщает мне, что thre является Dupicate

Значит, у вас есть уникальное поле, установленное на столе.

Я бы сделал что-то вроде этого:

try{
    $Query = "INSERT INTO table (name, bio) VALUES ('aname', 'abio')";
    $stmt = $conn->prepare($Query);
    $stmt->execute();
    $last_id = $stmt->lastInsertId();
}catch(PDOExeption $e){
    if($e->getCode() != 23000){ //I think it 23000
       //rethrow other PDO errors
        throw new PDOException(
           $e->getMessage(),
           $e->getCode(),
           $e
        );
    } 

    $Query = "SELECT id FROM table WHERE name = 'aname'";
    $stmt = $conn->prepare($Query);
    $stmt->execute();
    //fetch the first column (id) from the first row, which if its unique there will be only one.
    $last_id = $stmt->fetchColumn(0);
}

$Query = "INSERT INTO table2 (tid, papers) VALUES ($last_id, '1') ON DUPLICATE KEY UPDATE papers = '2'";
$stmt = $conn->prepare($Query);
$stmt->execute();

Возможно, вам придется превратить режим ошибок для PDO в исключение, если вы этого еще не сделали.

 $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

Но в основном вы поймаете дублирующее исключение, созданное PDO, тогда вы берете уникальное поле, я использую name потому что вы не сказали, что это было. Затем возьмите значение, которое не удалось найти. Разумеется, если у вас есть уникальное поле, и значение не получилось, то требуемая строка имеет такое же значение. Затем вы устанавливаете $last_id. Таким образом, последний идентификатор устанавливается последнимInsertId или блоком catch.

PS Я не пробовал ничего из этого так жаль, если есть какие-то ошибки, но теория звучит.

  • 0
    Ключ table - это id и он является primary , но, как я понял, мне нужно использовать другой запрос для проверки существующего id строки. Мне действительно интересно, почему они не реализовали эту функцию в целом вместо того, чтобы запускать несколько запросы на это.
  • 0
    Вы можете сделать Insert Ignore, которая игнорирует ошибки и продолжает работу. Так что это скорее разделение ответственности. Вставка не несет ответственности за обработку повторяющихся ошибок.

Ещё вопросы

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