【问题标题】:How can I efficiently retrieve a large number of database settings as PHP variables?如何有效地将大量数据库设置检索为 PHP 变量?
【发布时间】:2011-02-01 17:22:28
【问题描述】:

目前我的所有脚本设置都位于我“包含”的 PHP 文件中。我正在将这些设置(大约 100 个)移动到一个名为“设置”的数据库表中。但是,我正在努力寻找一种将它们全部检索到文件中的有效方法。

设置表有 3 列:

  • ID(自动增量)
  • 姓名
  • 价值

两个示例行可能是:

admin_user            john
admin_email_address   john@example.com  

我能想到的检索每个设置的唯一方法是这样的:

$result = mysql_query("SELECT value FROM settings WHERE name = 'admin_user'");
$row = mysql_fetch_array($result);
$admin_user = $row['value'];

$result = mysql_query("SELECT value FROM settings WHERE name = 'admin_email_address'");
$row = mysql_fetch_array($result);
$admin_email_address = $row['value'];

等等等等

这样做会占用大量代码并且可能会很慢。

有没有更好的办法?

【问题讨论】:

  • 实际上,将这些设置为 PHP 脚本比从数据库中读取和解析它们要快得多。我理解动机——毕竟数据库是用于数据的——但在这种情况下,您可以节省速度和实施。 PHP 是一个虚拟机,而且速度非常快——当你包含一个脚本时,它会立即运行。
  • 更好的是,您是否考虑过从数据库生成一个 PHP 脚本,该脚本通过 PHP 设置设置(再次原谅)?也就是说,如果您的设置不经常更改,或者您以非常可预测的方式更改它们,这些只是为了方便而在数据库中。

标签: php mysql database settings


【解决方案1】:

100 个设置?一次加载它们。这根本不需要时间。您绝对不想一次加载它们。

$result = mysql_query('SELECT * FROM settings');
$settings = array();
while ($row = mysql_fetch_assoc($result)) {
  $settings[$row['name']] = $row['value'];
}

如果您需要以某种方式划分这些,取决于您的需要,您可以将一个类别或其他东西放在桌面上,然后加载特定类别中的所有设置。

我建议将其抽象为某种对象:

class Settings {
  private $settings;

  public function __get($name) {
    if (!$this->settings)) {
      $result = mysql_query('SELECT * FROM settings');
      $this->settings = array();
      while ($row = mysql_fetch_assoc($result)) {
        $this->settings[$row['name']] = $row['value'];
      }
    }
    return $this->settings[$name];
  }
}

这样设置在您尝试访问之前不会加载:

$settings = new Settings;
echo $settings->admin_name; // now they're loaded

【讨论】:

  • 100 个设置也不值得将它们放入数据库中。只需使用显示<?php $admin_user = 'john'; $admin_email_address = 'john@example.com'; ?> 等的文件即可。
  • 我可以理解将设置放入数据库中,这不是问题。使用管理界面更容易更改它们。 100个设置真的不大。除了 cletus 所说的,我建议在两者之间添加一个缓存系统。考虑到您的某个页面不必访问数据库(因为它不需要或因为它还使用缓存项),您将获得大量时间(是的,与数据库的连接很慢)。
【解决方案2】:

好吧,我似乎已经想通了:

$settings = mysql_query("SELECT * FROM settings");

while ($row = mysql_fetch_assoc($settings)) {
eval('global $' . $row['name'] . ';');
eval('$' . $row['name'] . ' = "' . $row['value'] . '";');
}

虽然我并不热衷于使用 eval(),但它确实有效,但我认为这是唯一的方法。

我现在想知道是否有许多主机禁用了 eval()。有什么想法吗?

【讨论】:

  • 只需使用 cletus 给你的代码。还可以考虑阅读 stackoverflow.com/faq 以确保您了解 SO 的工作原理。
  • 我又看了一下 cletus 的代码,我得到了它的工作。非常感谢克莱图斯。我认为这将意味着更新我的设置已经使用的每个案例,但我相信从长远来看这是值得的。我会阅读 SO FAQ。
猜你喜欢
  • 2020-05-08
  • 1970-01-01
  • 1970-01-01
  • 2023-03-24
  • 1970-01-01
  • 2021-09-16
  • 1970-01-01
  • 2017-06-15
  • 2018-06-27
相关资源
最近更新 更多