Mysql如果不存在则自动插入特定记录,或者如果更新特定记录则插入新记录

时间:2012-08-25 21:48:23

标签: php mysql

我正在使用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

如果没有添加用户名和密码,并且如果更新了默认用户名和密码,则会插入默认用户名和密码,而不是删除更新后的用户名和密码。 我希望我说得很清楚,因为我非常感谢一些帮助和建议。谢谢

2 个答案:

答案 0 :(得分:1)

为什么不阻止管理员删除自己,而不是不断地重新创建管理员用户?

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的解决方法

答案 1 :(得分: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”时。如果“当前用户”本身没有访问级别“admin”,则无论如何都会匹配。

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

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

然后,如果您想使用配置文件(如建议的那样)或数据库逻辑来自定义您的应用程序,那么它实际上取决于您的设置。