gpt4 book ai didi

php - mysql返回重复错误时获取记录的ID

转载 作者:可可西里 更新时间:2023-11-01 06:46:13 25 4
gpt4 key购买 nike

当mysql错误返回重复键时,有没有办法在插入后检索记录(主键)的ID?

例如我会怎么做:

$sql = "INSERT INTO table (`col1`, `col2`) VALUES ('$val1', '$val2')";
$result = mysql_query($sql);
if($result){
$id = mysql_insert_id();
}
else {
if(stristr(mysql_error(), "duplicate"){
$sql = "SELECT `id` FROM `table` WHERE `col1`='$val1' AND `col2`='$val2'";
$result = mysql_query($sql);
$row = mysql_fetch_array($result);
$id = $row['id'];
}
else {
die(mysql_error());
}
}

这里不得不做两条sql语句,不仅费时费力,而且代码重复。

我不能使用 ON DUPLICATE KEY UPDATE,因为我想使用最后插入的 ID 或不能重复的记录的 ID 来更新不同的表。

那么,我做的对吗?或者有没有办法获取行的 ID?

谢谢

最佳答案

MySQL 不会告诉您哪条记录保存原始值,您必须自己找出。这里有一些提示:

  • 在错误消息的文本中查找 duplicate 子字符串看起来不是很可靠。您可以针对重复输入的代码测试 mysql_errno() 的值,即 1062 (you can find all codes in the manual)。

  • mysql 扩展不提供找出违规 key 名称的机制,因此您必须使用解析错误消息文本的非稳健方法:

      if( preg_match("/Duplicate entry '.*' for key '(.*)'/Ui", mysql_error(), $matches) ){
    $violated_key = $matches[1];
    }else{
    throw new Exception('Could not find violated key name');
    }
  • 或者,只需运行之前的查询(没有理由避免它):

      SELECT id
    FROM table
    WHERE col1=... AND col2=...
    FOR UPDATE

    FOR UPDATE 子句将锁定匹配的行以避免竞争条件(假设为 InnoDB)。

关于php - mysql返回重复错误时获取记录的ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9094605/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com