如何有效地检索大量数据库设置作为PHP变量?

时间:2010-03-28 11:08:59

标签: php mysql database settings

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

设置表有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'];

等等

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

有更好的方法吗?

2 个答案:

答案 0 :(得分:7)

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

答案 1 :(得分:1)

好吧,我似乎已经弄清楚了:

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

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

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

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