【问题标题】:Mysql Automatically insert specific record if doesn't exist or inserts new record if a specific record is updateMysql如果不存在则自动插入特定记录,如果特定记录被更新则插入新记录
【发布时间】:2012-08-25 21:48:22
【问题描述】:

我正在使用 php 和 mysql 开发应用程序;关于它的一些背景数据,它是一个登录系统,它存储用户名和密码以及登录系统所做的所有工作。但是我在删除用户时遇到了一个问题,删除用户的功能可以正常工作,但问题是例如管理员可以删除自己而留下没有用户的数据库。所以我想做的是当我在主页上时,运行一个函数来检查特定用户名是否存在

//Example:
Table name: users
columns: username, password
default username and password I want to always remain in table 'users'
username=dames and password=:password 
//End of Example

如果不添加用户名和密码,并且如果默认用户名和密码已更新,则插入默认用户名和密码,并且不会删除更新的用户名和密码。 我希望我说得足够清楚,因为我真的很感谢一些帮助和建议。谢谢

【问题讨论】:

    标签: php mysql


    【解决方案1】:

    如果您想确保至少有一位管理员始终在场,请仅在另一位管理员仍然存在时删除该管理员:

    DELETE
      u1
    FROM
      user u1
    LEFT JOIN
      user u2
    ON
      u1.access = u2.access
    WHERE
      u1.name = "current-user" AND
      ((u1.name != u2.name AND u1.access = "admin") OR (u1.access != "admin"));
    

    上面给定的查询需要一个带有用户名(名称)和访问级别(访问)的表。它匹配用户“current-user”,但前提是存在另一个具有访问级别“admin”的用户。如果“current-user”本身没有访问级别“admin”,则无论如何匹配。

    这样,您只需创建一个具有“管理员”访问级别的用户一次。可以添加和删除更多用户,而不是最后一个具有“管理员”访问级别的用户。

    如果您想在 SQL 中执行所有操作,您可以创建一个 BEFORE DELETE TRIGGER。在那里,您只需检查您不想被删除的用户名。有关示例,请参阅 How to abort INSERT operation in MySql trigger? - 它适用于 INSERT,但适用于 DELETE。

    再说一次,如果您想使用配置文件(如建议的那样)或数据库逻辑来自定义您的应用程序,这真的取决于您的设置。

    【讨论】:

      【解决方案2】:

      与其不断地重新创建您的管理员用户,为什么不直接阻止管理员删除自己?

      if ($user_to_delete == $current_logged_in_user) {
         // Sorry, you can't delete yourself...
      }
      

      或者在应用程序的配置文件中存储一组超级管理员。不允许任何人删除超级管理员用户。

      // In the config file...
      $super_admins = array("you", "someone_else");
      
      if (in_array($user_to_delete, $super_admins)) {
        // Sorry, you can't delete a super-admin from the UI.
        // Delete him from the application config first...
      }
      

      为了保护你自己多一点,如果你只需要一个无法删除的超级管理员,请在配置中使用无法在代码中修改的常量:

      define('SUPER_ADMIN', 'you');
      

      *注意:不能构建常量数组,但是有一个解决方法涉及serialize()in this question

      【讨论】:

      • 使用超级管理员用户:define('SUPER_ADMIN', 'you');听起来很好,但是如何在 conf 文件中定义它,因为我的配置文件只包含我的数据库的密码和用户名
      • @dames 无论您在配置文件中采用何种格式,无论是全局变量还是某些配置对象或常量,只需将其中一个定义为 SUPER_ADMIN 并确认您没有删除该记录。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-04
      • 2010-12-10
      • 1970-01-01
      • 2019-06-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多