用于动态选择数据库的环境变量

时间:2018-01-02 23:09:30

标签: php mysql

我如何根据用户设置更改数据库。假设我在美国各地都有用户。当他们登录时,我希望能够按状态分隔我的数据库。我知道我可以在打开连接时轻松更改数据库。但是我已经读过凭证(在这种情况下是数据库信息)应该放在一个安全的地方(即不在代码中)。我在何处以及如何在共享主机中完成此操作。我最初想的是一个.env文件夹,但我甚至不知道从哪里开始!

2 个答案:

答案 0 :(得分:1)

在我管理的一个应用中,每个数据库的凭据都保存在数据库中!所以应用程序必须有一个" master"凭证首先连接到一个中央数据库,因此它可以找出它应该用于相应用户的内容。该应用程序的主凭据保存在Java属性文件中。这是一个Java应用程序。

任何语言都可以做类似的事情。例如,PHP具有.ini文件,您可以将其与PHP应用程序一起存储,但在HTML doc根目录之外。使用parse_ini_file()加载它们。

在每次请求PHP应用程序时,连接到数据库两次似乎需要做很多工作(Java通过维护存在数小时或数天的连接池来减轻这种情况)。如果是这样,您可以将凭据缓存在密钥/值存储中,如memcached。

所以伪代码/逻辑将是:

  1. 应用初始化以处理请求
  2. 从SESSION,URL或其他
  3. 确定用户
  4. 检查memcached以查看MySQL凭据和&数据库在缓存中
  5. 如果在缓存中找不到:

    一个。打开ini文件并解析它以获取主凭据。 ini文件的位置可能是硬编码的,也可能是环境中的。

    湾连接到用户凭据数据库并读取凭据&相应应用用户的数据库

    ℃。存储凭据&缓存中的数据库,以便下一个请求可以快速找到它们

  6. 无论哪种方式,现在应用程序已准备好连接到正确的用户数据库

答案 1 :(得分:-3)

我不是在讨论每个用户的多数据库连接的专业和反对意见。

你能想到的是一个主数据库,每个人最初都会连接到这个数据库。在这里,您为数据库服务器定义了一个附加表(注意:它们必须可以从连接到它的webfrontend到达!)和另一个用于user2database关系的表。

旁注:“应该放在一个安全的地方”意味着你没有一个带有凭证的文件,这个文件位于可以从互联网上访问的空间中。 事实上,将这些信息放在代码文件中的某个地方,但在webroot之外是现状。在代码中使用它有一个好处,即使它可以通过Web访问,调用脚本的人只会看到它的输出,而不是源代码。相反,文本文件将“按原样”提供......