获取重复行的记录ID

时间:2018-04-08 19:13:25

标签: php mysql pdo

我有以下查询:

$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();

tableaname, abio : uniquetable2tid, papers : unique

用户应该INSERT一个namebio,如果它已经存在,他们会将papers插入table2插入id的{​​{1}},如果name, bio已经存在,我就不会得到name, bio

如何拉出重复行的$last_id当PDO告诉我那个是重复的时候?

1 个答案:

答案 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。如果有任何错误,我没有测试任何这个,所以对不起,但理论是合理的。