Эта тема на forum.dklab.ru


aNciEnT: Вопрос о загрузке данных из БД в массив
У меня такой вопрос.
Скажем, есть массивы $modSettings и $settings. И есть таблицы - modSettings & settings, и в них хранятся значения для этих массивов.
И мне нужно загрузить в эти массивы значения из их табличных эквивалентов. Но:

$request = db_query("
SELECT variable, value
FROM {$db_prefix}modSettings", false, false);
$modSettings = array();
if (!$request)
db_fatal_error();
while ($row = mysql_fetch_row($request))
$modSettings[$row[0]] = $row[1];
mysql_free_result($request);

Такая конструкция мне не подходит, потому что я хочу сделать массивы более информативными чтобы незапутатьца, типа заместо $modSettings['dbServer'] -> $modSettings['dbSettings']['dbServer']. Вот в этом-то и проблема. Как это сделать? И как так же поступить с массивом $settings чтобы не пришлось делать копирование инструкций(CTRL+C, CTRL+V) с переименованием ?? Тоесть, чтобы сделать эти дела одновременно для двух массивов, хоть в них и будут хранитца несколько иные значения, но при этом чтобы не пришлось делать копирование операций просто с заменой значений и имени массива...

Кто не сложно, помогите пожалуйста.
chin:
Кхм... Ничего не понял.. Три раза читал Ваш вопрос, но всеравно в голове вместо его смысла крутится что-то такое: "я хочу чтобы в массив можно было записать незапутаца и как же поступать делать копирование с переименованием? при этом чтобы не пришлось вот в этом проблема, потому что я хочу сделать, а если переделать, то получаеца, что ничего не получаеца... при этом надо чтобы более информативно!" (-:

Вы не могли бы по-конкретнее поставить вопрос? Например, привести пару записей из {$db_prefix}modSettings?
Вам нужен многомерный массив?

while ($row = mysql_fetch_row($request))
$modSettings['dbSettings'][$row[0]] = $row[1];

ничего не понимаю...
aNciEnT:
Эмм. Хорошо, вообщем так...
Этот код:

$request = db_query("
SELECT variable, value
FROM {$db_prefix}modSettings", false, false);
$modSettings = array();
if (!$request)
db_fatal_error();
while ($row = mysql_fetch_row($request))
$modSettings[$row[0]] = $row[1];
mysql_free_result($request);
Говорит о следующем: что в таблице есть поле скажем dbServer, значение этого поля - localhost. Это дело присваивается $modSettings как $modSettings['dbServer - по имени полю($row[0])'] = а_здесь_значение_этого_поле_в_таблице($row[1]).
Тоесть, echo $modSettings['dbServer'] выведет "localhost".

А проблема сообственно в следующем. $modSettings - это у меня массив для работы с сайтовыми настройками, рядовыми, типа "Включить поддержку BBCode", "Опубликовать автора статьи" и прочее. А $settings - используетца уже для главных настроек сайта... типа "Включить поддержку ЧПУ", "Использовать gZip Output для вывода информации", "Настройки базы данных" и тд. Поэтому, и бы хотел это дело упорядочить. Скажем... ну, пример на $settings - заместо размещения в $settings информации по типу $settings['dbServer'] = значение..., а я хочу размещать ее по типу $settings['database_options']['dbServer'] = значение..
Вот в этом и вопрос. Как ТАК сделать? Потому что помимо скажем $settings['database_options']['...'] у меня еще будет $settings['siteOptions']['..'], $settings['pathes']['...'] и так далее. Вот в этом и вопрос, я незнаю как это сделать... ведь в таблицах там все "в перемешку".

Теперь, надеюсь, ясно мысль изложил? :-)
chin:
Ах вот оно что!
Всеравно ничего не понял!.. шутка (-:

Вариант 1
Добавить в базе еще один столбик, в котором будет хранится имя раздела, к которому относится то или иное свойство.
К примеру:
--------------- modSettings --------------

--- variable ---- value ---- partition ---
dbServer | localhost | database
dbUser | root | database
dbPass | password | database
dbBase | mydb | database
modRewrite| On | site
bbCode | Off | site
activate | Yes | register
dCode | No | register

Теперь можно все это извлечь примерно вот таким образом:
$request = db_query("SELECT variable, value, partition FROM {$db_prefix}modSettings", false, false);
if (!$request) db_fatal_error();
$modSettings = array();
while($row = mysql_fetch_row($request))
$modSettings[$row[3]][$row[0]] = $row[1];

mysql_free_result($request);
Получите то, что хотели.

Вариант 2
(я бы так сделал только в том случае, если бы нельзя было внести изменения в таблицу БД)
Предварительно описать какие параметры, к какому разделу относятся в PHP массиве. Потом по нему задавать соответствующий подраздел.
$partitions = array(
'dbServer' => 'database',
'dbUser' => 'database',
'dbPass' => 'database',
'dbBase' => 'database',
'modRewrite' => 'site',
'bbCode' => 'site',
'activate' => 'register',
'dCode' => 'register',
);

$request = db_query("SELECT variable, value, partition FROM {$db_prefix}modSettings", false, false);
if (!$request) db_fatal_error();
$modSettings = array();
while($row = mysql_fetch_row($request))
{
// Если эта настройка была описана в массиве разделов, определаем этот раздел
// если нет, ставим раздел по умолчанию: "other"
$partition = ( isset($partitions[$row[0]]) ? $partitions[$row[0]] : "other" );

$modSettings[$partition][$row[0]] = $row[1];
}

mysql_free_result($request);

Если еще несколько вариантов, но это уже извращение (-:

Я правильно понял Вашу задачу?
aNciEnT:
Блин! Вы попали в точку!!! Задушевное спасибо!!!

Но это, я был бы непротив, и если бы вам было не трудно, если бы вы опубликовали еще парочку... эм, "извращенских" вариантов.
chin:
Вариант, если у Вас, опять таки, нет возмодности изменять таблицу БД, но Вы не хотите описывать массив в коде:
Создать одну дополнительную таблицу, где будут храниться данные разделов (те-же, что и в массиве).
------- modSettings --------

--- variable ---- value ----
dbServer | localhost
dbUser | root
dbPass | password
dbBase | mydb
modRewrite| On
bbCode | Off
activate | Yes
dCode | No

--------- Partitions ---------

--- variable --- partition ---
dbServer | database
dbUser | database
dbPass | database
dbBase | database
modRewrite| site
bbCode | site
activate | register
dCode | register
Тогда запрос будет примерно такой:
$request = db_query("
SELECT
{$db_prefix}modSettings.variable, {$db_prefix}modSettings.value, partitions.partition
FROM
{$db_prefix}modSettings, partitions
WHERE
partitions.variable = {$db_prefix}modSettings.variable", false, false);

if (!$request) db_fatal_error();
$modSettings = array();
while($row = mysql_fetch_array($request))
$modSettings[$row['partition']][$row['variable']] = $row['value'];

mysql_free_result($request);

Извращенский способ :)

Эта тема на forum.dklab.ru