Как я могу эффективно получить большое количество настроек базы данных в виде переменных PHP? - PullRequest
3 голосов
/ 28 марта 2010

В настоящее время все настройки моего скрипта находятся в файле PHP, который я «включаю». Я нахожусь в процессе перемещения этих настроек (около 100) в таблицу базы данных под названием «настройки». Однако я изо всех сил пытаюсь найти эффективный способ извлечения их всех в файл.

Таблица настроек имеет 3 столбца:

  • ID (автоинкременты)
  • имя
  • значение * * 1 010

Два примера строки могут быть:

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 ]

7 голосов
/ 28 марта 2010

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 голос
/ 28 марта 2010

Ну, я, кажется, понял это:

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

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

Это работает, хотя я не был заинтересован в использовании eval (), но я думаю, что это единственный способ.

Теперь мне интересно, на многих ли хостах отключена функция eval (). Есть мысли?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...