[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: файл с настройками
maximka787
ребят, глупый вопрос, но у всех по разному сделано, посоветуйте в каком виде лучше хранить переменные сайт, например логина и пароля к БД (в отдельном файле)
на мой взгляд лучше инклудить
define("DB_USERNAME", "max");

есть ли тут подвох, например то что это переменная глобального типа или еще что?
и в какой лучше виде хранить все такие мелкие но часто меняемые переменные.



Спустя 11 минут, 22 секунды (22.08.2011 - 12:43) Nikitian написал(а):
Написал небольшой класс. Пользуйтесь на здоровье :)
Свернутый текст
<?php
/**
* Класс хранения настроек
*
@author Nikitian
*/

class Config{
static $instance = false;
var $config=array();
var $filename='config.php';
function Config($filename=''){
if($filename=='')
$filename=$this->filename;
$this->load($filename);
}

/**
* Загрузка конфига
*
@param string $filename
*/

function load($filename=''){
//Загрузка конфига
if($filename=='')
$filename=$this->filename;
$filename=dirname(__FILE__).'/'.$filename;
if(file_exists($filename)){
$this->config=parse_ini_file($filename,true);
}
}


/**
* Получение секции как массива, либо конкретного элемента
*
@param string $section Секция
*
@param mixed $key|false Элемент. Если не указывать, то возвращает секцию массивом
*
@return array,string
*/

function get($section,$key=false){
if($key===false){
if(isset($this->config[$section]))
return$this->config[$section];
return false;
}
if(isset($this->config[$section][$key]))
return $this->config[$section][$key];
return false;
}

/**
* Установка новых параметров
*
@param string $section
*
@param string $key
*
@param string $value
*
@return string
*/

function set($section,$key,$value){
$this->config[$section][$key]=$value;
return $this->config[$section][$key];
}

/**
* Удаление элемента или целой секции
*
@param string $section Секция
*
@param string $key|false Элемент. Если не указано, то удаляется вся секция!
*
@return bool|true
*/

function del($section,$key=false){
if($key===false){
unset($this->config[$section]);
}
else{
unset($this->config[$section][$key]);
}
return true;
}

/**
* Проверка наличия элемента
*
@param string $section
*
@param string $key
*
@return bool
*/

function have($section,$key){
return isset($this->config[$section][$key]);
}

/**
* Сохранение всех изменений конфига
*/

function save(){
if(!is_array($this->config) || sizeof($this->config)==0)
$this->__construct();
$filename=dirname(__FILE__).'/'.$this->filename;
if(!file_exists($filename))die('No file config ['.$filename.']');
if(!is_writable($filename))die('No permissions for write file ['.$filename.']');
$this->write_php_ini($this->config, $filename);
}

function write_php_ini($array, $file){
$res = array();
foreach($array as $key => $val){
if(is_array($val)){
$res[] = "[$key]";
foreach($val as $skey => $sval)
$res[] = "$skey = ".(is_numeric($sval) ? $sval : '"'.addslashes($sval).'"');
}
else
$res[] = "$key = ".(is_numeric($val) ? $val : '"'.addslashes($val).'"');
}
$this->safefilerewrite($file, implode("\r\n", $res));
}
function safefilerewrite($fileName, $dataToSave){
if (file_exists($fileName) && $fp = fopen($fileName, 'w')){
fwrite($fp,';<?php /*'."\n");
$startTime = microtime();
do{
$canWrite = flock($fp, LOCK_EX);
if(!$canWrite)
usleep(round(rand(0, 100)*1000));
}
while((!$canWrite)and((microtime()-$startTime) < 1000));
if ($canWrite){
fwrite($fp, $dataToSave);
flock($fp, LOCK_UN);
}
fwrite($fp,"\n".'; */ ?>');
fclose($fp);
}
else
die('No write '.$fileName);
}

/**
* Класс хранения настроек
*
@param string $filename
*
@return Config
*/

static function getInstance($filename='') {
if (!Config::$instance) {
Config::$instance = new Config($filename);
}
return Config::$instance;
}
}
Всё хранится в ini-подобном файле, но даже при прямом вызове данные не видны

Спустя 4 минуты, 31 секунда (22.08.2011 - 12:47) maximka787 написал(а):
Nikitian
ну и класс)) интересная вещь, сложнаяяяя)))) для меня, но в целом понятная. а на счет define реально лучше не использовать? если у меня переменные константы и неизменны. то чем плох?

Спустя 1 минута, 27 секунд (22.08.2011 - 12:49) linker написал(а):
Не знаю, чем ты решил, что define() плох.

Спустя 7 минут, 2 секунды (22.08.2011 - 12:56) Nikitian написал(а):
define для того, что можно захардкодить, но по соображениями логичности кода собирается в одном месте. Эти данные меняться не будут. Если будут, то они уже не являются константами по определению и в дефайны их нелогично пихать. Как-то так.

Спустя 3 минуты, 55 секунд (22.08.2011 - 13:00) maximka787 написал(а):
linker
Nikitian
Я лично ЗА define в такого рода настройках, просто почитал в некоторых статьях что неудобно, и нелогично, наверно пример спутал и он не похож на мой. Боялся что безопасности это вредит

Спустя 4 минуты, 1 секунда (22.08.2011 - 13:04) linker написал(а):
Неизменяемость данных гарантированных константами распространяется только на время выполнения программы, это нисколько не ограничивает изменение их значения в процессе разработки программистом или иных случаях, когда условия последующей работы требуют иных значений. Иными словами, константа является константой только в процессе выполнения программы.

Спустя 1 минута, 18 секунд (22.08.2011 - 13:05) bodja написал(а):
Просто не делайте из дефайна переменную ,ну и с регистер глобалс поакуратнее.

Спустя 5 минут, 9 секунд (22.08.2011 - 13:10) linker написал(а):
define() никогда не делает переменных, а только неизменяемые константы.

Спустя 9 минут, 45 секунд (22.08.2011 - 13:20) bodja написал(а):
Я имел ввиду типа так
$p=DB_USERNAME;
А потом оперирование c $p

Спустя 8 минут, 24 секунды (22.08.2011 - 13:28) linker написал(а):
Всё зависит от контекста, если переменную $p необходимо инициализировать начальным значением, то нет ничего в этом плохого
define('VALUE', 10);
$p = VALUE;
for($i = 0; $i < 10; ++ $i)
$p += $i;

Спустя 7 минут, 43 секунды (22.08.2011 - 13:36) bodja написал(а):
Тут на форуме любят шугать типа таким

if ($p==$adm) {
//админ часть
}


и это будет находиться в другом файле ну и регистер, сами понимаете :D

Спустя 4 минуты, 47 секунд (22.08.2011 - 13:41) linker написал(а):
Выключаем register_globals и не парим себе мозг. Данный вид проблемы не из-за констант или переменных, а из-за лени - не хотим использовать $_POST, $_GET массивы и то, только в определённых условиях.

Спустя 16 минут, 25 секунд (22.08.2011 - 13:57) bodja написал(а):
Жаль только,что про это не все знают или не догадываются. biggrin.gif

Спустя 2 минуты, 50 секунд (22.08.2011 - 14:00) linker написал(а):
Ну об этом не догадываются только те, кто до сих пор сидит на четвёртом PHP. Все остальные уже в теме.


_____________
..Работает - не трогай!
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.