【问题标题】:Postgresql Update a unique column and validate before UpdatePostgresql 更新一个唯一列并在更新之前验证
【发布时间】:2015-05-19 08:29:07
【问题描述】:

场景:管理员用户在 DB 上插入了一个新客户端,它有 3 个唯一列、postgres id、驾驶执照之类的东西和一封电子邮件,稍后我试图允许管理员用户更新这些字段但是当我运行验证时它当然返回 false,因为它们已经存在,我 read this question 并且是同样的问题,但我没有运行 symfony 或任何其他 PHP 框架,我想我可以尝试例如,在查询中发送 id 并检查 id 和电子邮件,但由于是实时验证,我只发送输入值。

解决方案 1: 不允许管理员用户更新这些字段并让他删除客户端并创建一个新客户端(这是轻松的方法)。

解决方案 2? 我想不出任何逻辑,如何构建查询来验证这个问题?

类似:

SELECT email FROM users.users WHERE email=$email AND id != $id ???

问题是我不知道如何在输入字段中发送 ID...这是我的验证码:

email: {
            trigger: 'blur',
            message: 'El email no es válido',
            validators: {
                remote: {
                    message: 'Ya existe un usuario con ese email',
                    url: 'actions/chk_available.php',
                    data: {
                        type: 'email'
                    },
                    type: 'POST'
                }
            }
        },

当管理员用户离开该字段时,此代码在服务器端运行。

更新

假设我有 2 行:

  1. 电子邮件:aaa@host.com
  2. 电子邮件:bbb@host.com

    SELECT COUNT (1) FROM users.users_web WHERE email=$email

如果管理员用户正在更新第二行并且没有触及电子邮件,那么一切都很好,如果他使用与第 1 行相同的值更新电子邮件(aaa@host.com)该查询验证为有效,因为仍然是计数 1 并且更新将结束填充 2 封相同的电子邮件,但 postgresql 不允许,因为它是一个唯一字段,所以这就是它变得混乱的地方。

【问题讨论】:

  • 只需 SELECT count(1) FROM users.users WHERE email=$email, if count>1 raise error
  • 使用那个查询我总是会出错,因为用户已经存在,我的目标是如果用户更改了它,我的目标是能够更新电子邮件,或者只是留下具有相同值的字段,如果用户不更改它,如果用户不更改电子邮件,此查询会给我一个错误。
  • 如果我猜对了 - 如果更改了则通过 id 更新电子邮件,如果相同则不更新?...所以无论如何你必须将电子邮件与旧电子邮件进行比较。所以你在电子邮件中总是有一些价值。所以总是更新......如果值改变,你有新的电子邮件,如果不是 - 相同(旧)
  • 我知道,但问题不在于是否更新电子邮件,你是对的,我明白,问题是在我发送表格之前验证,也许我会将问题更新为看看我能不能说得更清楚。
  • 我用您的查询示例更新了问题,看看我是否可以让自己更清楚,谢谢。

标签: php ajax postgresql validation


【解决方案1】:

不要费心尝试“预先验证”独特的约束。只需写入数据库并捕获违规行为。它更快,更正确。无论如何,尝试“预先验证”是一种竞争条件。

示例:http://sqlfiddle.com/#!15/5f4a0/1

【讨论】:

  • 好吧,我想我跟着了,所以当 ppl 尝试更新时,我从数据库本身捕获了错误?错误:重复键值违反唯一约束“users_email_key”详细信息:键 (email)=(bbb@host.com) 已存在。
  • @user1212548 是的。您可以捕获错误并显示更友好的错误消息
猜你喜欢
  • 1970-01-01
  • 2014-08-20
  • 1970-01-01
  • 2014-06-28
  • 1970-01-01
  • 1970-01-01
  • 2018-08-09
  • 2019-02-26
  • 1970-01-01
相关资源
最近更新 更多