получение переменной из публичной области видимости для подключения к базе данных

0
<?php  
$settings['hostname'] = '127.0.0.1';
$settings['username'] = 'root';
$settings['password'] = 'root';
$settings['database'] = 'band';
$settings['dbdriver'] = 'mysql';

/**
* DATABASE
*/
class database
{
 protected $settings;
 function __construct()
 {

 }

 function connect() 
    {
  $this->start = new PDO(
  $this->settings['dbdriver'] . ':host='. 
  $this->settings['hostname'] . ';dbname='. 
  $this->settings['database'],
  $this->settings['username'],
  $this->settings['password'],
  array(PDO::ATTR_PERSISTENT => true));

  $this->start->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING );
    }
}
?>

ok im все еще студент, поэтому сегодня я узнаю о базе данных о масштабах и связях вопрос в том, как я могу поместить $settings из класса в защищенные настройки $в классе?

  • 0
    Почему вы делаете обертку PDO? Если это для целей обучения, игнорируй меня глупо.
  • 0
    хорошо для подобной функции fetch ($ sql, $ data = array ()) {$ fetch = $ this-> start-> prepare ($ sql); $ Fetch-> Execute ($ данные); return $ fetch-> fetch (PDO :: FETCH_ASSOC); }
Показать ещё 1 комментарий
Теги:

3 ответа

3
Лучший ответ

Вы уже находитесь на правильном пути в коде, который вы показываете: не используйте общедоступную (глобальную) область видимости вообще - он не считает, что хорошая практика в ООП зависит от глобальных переменных, потому что она разрушает инкапсуляцию. Вместо этого вводите настройки в объект при его инициализации.

Для этого можно добавить конструктор:

function __construct($settings)
 {
   $this->settings = $settings;
 }

а затем инициализируйте класс следующим образом:

 $database= new database($settings); 

или так, чтобы предотвратить перемещение переменной с конфиденциальными данными:

 $database= new database(array('hostname' => '127.0.0.1',
                  'username' => 'root',
                  'password' => 'root',
                  'database' => 'band',
                  'dbdriver' => 'mysql'));

В качестве побочного примечания, при использовании в производстве, подумайте об удалении переменной password из массива после подключения для обеспечения безопасности. Это ничего существенного, кроме приятной дополнительной вещи.

  • 0
    Действительно ли полезно сбрасывать переменную пароля? Как только злоумышленник соберет доступ к вашему приложению для выполнения кода, отмена пароля больше не поможет. Он может запускать запросы даже без пароля.
  • 0
    @nikic это больше подходит для ситуаций, когда полный дамп переменной выполняется из скрипта (например, когда производственное приложение случайно запускается с настройками отчетов об ошибках разработки). Я видел фреймворки, делающие var_dump на ошибки в подробном режиме. Это не очень важно, но не может повредить
Показать ещё 2 комментария
1

Либо передайте аргумент функции $settings as, импортируйте его в текущую область с помощью global, либо получите доступ через $GLOBALS.

Пропустить как аргумент:

public function __construct(array $settings) {
    $this->settings = $settings;
}

Импорт с использованием global:

public function __construct() {
    global $settings;
    $this->settings = $settings;
}

Используйте $GLOBALS:

public function __construct() {
    $this->settings = $GLOBALS['settings'];
}

Я бы выбрал проход как вариант arg. Другие версии - это только грязные хаки (imho).

0

Лучшим способом было бы либо посмотреть в файле конфигурации (например, XML файл) для конфигурации, либо вызвать метод connect() (или ваш конструктор) с требуемыми параметрами.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню