У меня есть следующий запрос:
$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?
Я предполагаю, что это
Как я могу вытащить идентификатор дублированной строки Когда 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 Я не пробовал ничего из этого так жаль, если есть какие-то ошибки, но теория звучит.
table
- это id
и он является primary
, но, как я понял, мне нужно использовать другой запрос для проверки существующего id
строки. Мне действительно интересно, почему они не реализовали эту функцию в целом вместо того, чтобы запускать несколько запросы на это.