2010-03-28 2 views
3

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

В таблице параметров имеет 3 колонки:

  • ID (autoincrements)
  • имя
  • значение

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

admin_user   john 
admin_email_address [email protected] 

Единственный Я могу думать о том, чтобы восстановить eac установка час, как это:

$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']; 

и т.д. и т.п.

Действовать таким образом будет занимать много кода и, вероятно, будет медленным.

Есть ли лучший способ?

+0

На самом деле настройка настроек (о, какое выражение) происходит намного быстрее, включая их как скрипт PHP, чем чтение и разбор их из базы данных. Я понимаю мотивацию - ведь базы данных предназначены для данных, но в этом случае вы можете экономить на скорости и реализации. PHP - это виртуальная машина, и довольно быстрый - при включении скрипта он запускается в кратчайшие сроки. – amn

+0

Еще лучше, рассмотрели ли вы GENERATING скрипт PHP, который настраивает параметры (pardon again) PHP, из базы данных? То есть, если ваши настройки не меняются очень часто, или вы меняете их очень предсказуемым образом, и они просто находятся в базе данных для удобства. – amn

ответ

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 
+0

100 настроек на самом деле не стоит помещать их в базу данных. Просто используйте файл, который говорит ' 'и т. д. – Zarel

+0

Я могу понять, чтобы установить настройки в базу данных, а не проблема. Их проще изменить с помощью интерфейса администрирования. 100 настроек действительно невелики. В дополнение к тому, что сказал cletus, я предлагаю добавить систему кэша где-то посередине. Учитывая, что одной из ваших страниц не требуется доступ к базе данных (поскольку она не нужна или потому, что она также использует кешированные элементы), вы получите много времени (да, соединение с базой данных медленное). – Savageman

1

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

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

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

Он работает, хотя я не был заинтересован в использовании Eval(), но я т hink это единственный способ.

Теперь мне интересно, есть ли у многих хостов eval() отключено. Есть предположения?

+0

просто используйте код cletus дал вам. также подумайте о том, чтобы прочитать http://stackoverflow.com/faq, чтобы убедиться, что вы понимаете, как работает SO. – user187291

+0

У меня был другой взгляд на код cletus, и я получил его работу. Большое спасибо. Я думаю, что это будет означать обновление каждого случая, когда мои настройки уже используются, но я уверен, что это будет стоить в долгосрочной перспективе. Я прочитаю FAQ ЧАСТОТЫ. – Steven

Смежные вопросы