我有以下查询:
$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
的{{1}},如果name, bio
已经存在,我就不会得到name, bio
如何拉出重复行的$last_id
当PDO告诉我那个是重复的时候?
答案 0 :(得分:1)
我假设这个
如何拉出重复行的id当PDO告诉我那个是重复的
表示您在表格中设置了唯一字段。
我会做这样的事情:
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's 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
。所以最后一个id由lastInsertId或catch块设置。
P.S。如果有任何错误,我没有测试任何这个,所以对不起,但理论是合理的。