【问题标题】:Returning the Duplicated ID返回重复的 ID
【发布时间】:2018-01-31 20:46:18
【问题描述】:

有这个查询

$query = 'INSERT INTO users(name) VALUES (:name)';
$stmt = $pdo->prepare($query);
$stmt->execute(['name' => $_POST['name']]);

INSERTing 进入Table: Users,其中列nameUNIQUE

而不是做两个查询

$check = 'SELECT EXISTS (SELECT name FROM users WHERE name = :name);'
$stmt = $pdo->prepare($check);
$stmt->execute(['name' => $_POST['name']]);
if ($stmt->fetchColumn() == 0) {
    $query = 'INSERT INTO users(name) VALUES (:name)';
    $stmt = $pdo->prepare($query);
    $stmt->execute(['name' => $_POST['name']]);
}

如果$query 失败INSERT,是否可以使用PDOFETCH Duplicatedid?类似的东西

$query = 'INSERT INTO users(name) VALUES (:name)';
$stmt = $pdo->prepare($query);
$stmt->execute(['name' => $_POST['name']]);
if ($stmt->duplicated() > 0) {
    echo "Name already exists by the id number ".$stmt->duplicated()."";
}

如果无法返回Duplicated ID,我可以告诉是否有Duplication而不返回任何东西吗?


示例:

      users
    [id - name]
    [1  - MARX]
    [2  - MATH]

$query = 'INSERT INTO users(name) VALUES ('MARX')';
$stmt = $pdo->prepare($query);
$stmt->execute();
if ($stmt->duplicated() > 0) {
    echo "Name already exists by the id number ".$stmt->duplicated()."";
} else {
    echo "Name was Inserted";
}

Result: Name already exists by the id number 1

【问题讨论】:

  • 您可以同样使用SELECT COUNT(*) FROM users WHERE name=:name 并查看该值是否返回为零(不匹配)或其他任何表示重复的值。确保您对该列有UNIQUE 约束,然后您将无法插入重复项。
  • 在 20 多年的编程生涯中,我从未使用过 SELECT EXISTS()
  • 为什么需要复制它?如果你执行“SELECT id, name FROM users WHERE name = :name LIMIT 1”你会得到一行,或者你没有得到一行。如果你不这样做,则插入 $pdo->fetch(PDO::FETCH_ASSOC);如果你这样做
  • 这也有效。对于中等数据库负载,即 SQL injection非常小心,并尽可能使用占位符值。

标签: php mysql sql pdo


【解决方案1】:

users(name) 上创建唯一索引。

然后,在违反唯一索引时捕获错误。

这与on duplicate key update无关。

强烈建议为此目的使用name 上的唯一索引。您的代码不是线程安全的。两个线程可以有相同的name。每个人都可以检查它是否不存在。每个人都可以尝试插入它。所有这些努力——无论如何你都会得到重复的。

让数据库做它应该做的事情——保护您的数据。定义唯一索引/约束。

【讨论】:

  • 我明白,但是PDOException 抛出了它的message,我想自定义它以使用Name already exists 而不是它的消息,我想它是不可更改的?,我也想在存在的情况下返回重复的行 ID
  • 可以看看这个。 stackoverflow.com/questions/1388025/… 认为我会使用具有适当锁定的事务,执行选择以检查是否存在,获取 ID。然后,如果确实存在,请使用返回的 ID 提供您的消息。
猜你喜欢
  • 2018-04-04
  • 2019-12-02
  • 2023-01-12
  • 2012-08-22
  • 2015-08-12
  • 2017-02-03
  • 1970-01-01
  • 2022-11-10
  • 2022-01-14
相关资源
最近更新 更多