Как правильно настроить PDO-соединение



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

Большинство ответов не так, как я это делаю, или я могу просто не получить ответы правильно. Во всяком случае, я никогда не думал об этом, потому что то, как я это делаю, работает для меня.



но вот сумасшедшая мысль; может быть, я делаю все это неправильно, и если это так; я действительно хотел бы знать, как правильно подключиться к базе данных MySQL с помощью PHP и PDO и сделать это легко доступный.



вот как я это делаю:



во-первых, вот моя структура файла (урезанная):



public_html/

* index.php

* initialize/
-- load.initialize.php
-- configure.php
-- sessions.php


621   4  

4 ответов:

цель

как я вижу, ваша цель в данном случае двоякая:

  • создать и поддерживать одно / многократное подключение к базе данных
  • убедитесь, что соединение настроено правильно

решение

Я бы рекомендовал использовать как анонимную функцию, так и заводской шаблон для работы с PDO-соединением. Использование его будет выглядеть так:

$provider = function()
{
    $instance = new PDO('mysql:......;charset=utf8', 'username', 'password');
    $instance->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $instance->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
    return $instance;
};

$factory = new StructureFactory( $provider );

затем в другом файле или ниже тот же файл:

$something = $factory->create('Something');
$foobar = $factory->create('Foobar');

сама фабрика должна выглядеть примерно так:

class StructureFactory
{
    protected $provider = null;
    protected $connection = null;

    public function __construct( callable $provider )
    {
        $this->provider = $provider;
    }

    public function create( $name)
    {
        if ( $this->connection === null )
        {
            $this->connection = call_user_func( $this->provider );
        }
        return new $name( $this->connection );
    }

}

этот способ позволит вам иметь централизованную структуру, которая гарантирует, что соединение создается только при необходимости. Это также значительно упростило бы процесс модульного тестирования и обслуживания.

поставщик в этом случае будет найден где-то на стадии начальной загрузки. Этот подход также даст четкое расположение, где можно определить конфигурацию, которую вы используется для подключения к БД.

имейте в виду, что это крайне упрощенный пример. Вы также можете извлечь выгоду из просмотра двух следующих видео:

кроме того, я настоятельно рекомендую читать правильный учебник об использовании PDO (есть журнал плохого учебника онлайн).

Я бы предложил не использовать $_SESSION для глобального доступа к подключению к БД.

вы можете сделать одну из нескольких вещей (в порядке худшего к лучшему практики):

  • открыть $dbh используя global $dbh внутри ваших функций и классов
  • используйте одноэлементный реестр и получите доступ к нему глобально, например:

    $registry = MyRegistry::getInstance();
    $dbh = $registry->getDbh();
    
  • введите обработчик базы данных в классы, которые в нем нуждаются, например Итак:

    class MyClass {
        public function __construct($dbh) { /* ... */ }
    }
    

Я очень рекомендую последний. Он известен как инъекция зависимости (DI), инверсия контроля (IoC) или просто голливудский принцип (Не звоните нам, мы позвоним вам).

однако, это немного более продвинутый и требует больше "жгут" без рамки. Итак, если инъекция зависимостей слишком сложна для вас, используйте одноэлементный реестр вместо группы глобальных переменных.

недавно я пришел к аналогичному ответу/вопросу самостоятельно. Это то, что я сделал, в случае, если кто-то заинтересован:

<?php
namespace Library;

// Wrapper for \PDO. It only creates the rather expensive instance when needed.
// Use it exactly as you'd use the normal PDO object, except for the creation.
// In that case simply do "new \Library\PDO($args);" with the normal args
class PDO
  {
  // The actual instance of PDO
  private $db;

  public function __construct() {
    $this->args = func_get_args();
    }

  public function __call($method, $args)
    {
    if (empty($this->db))
      {
      $Ref = new \ReflectionClass('\PDO');
      $this->db = $Ref->newInstanceArgs($this->args);
      }

    return call_user_func_array(array($this->db, $method), $args);
    }
  }

чтобы вызвать его, вам нужно только изменить эту строку:

$DB = new \Library\PDO(/* normal arguments */);

и тип-намек, если вы используете его (\Library\PDO $DB).

это действительно похоже как на принятый ответ, так и на ваш; однако у него есть заметное преимущество. Рассмотрим этот код:

$DB = new \Library\PDO( /* args */ );

$STH = $DB->prepare("SELECT * FROM users WHERE user = ?");
$STH->execute(array(25));
$User = $STH->fetch();

хотя это может выглядеть как обычный PDO (он меняется на это \Library\ только), он на самом деле не инициализирует объект, пока вы не вызовете первый метод, какой бы он ни был. Это делает его более оптимизированным, так как создание объекта PDO немного дорого. Это прозрачный класс, или то, что он называется дух, форма Загрузка. Вы можете рассматривать $DB как обычный экземпляр PDO, передавая его, выполняя те же операции и т. д.

$dsn = 'mysql:host=your_host_name;dbname=your_db_name_here'; // define host name and database name
    $username = 'you'; // define the username
    $pwd='your_password'; // password
    try {
        $db = new PDO($dsn, $username, $pwd);
    }
    catch (PDOException $e) {
        $error_message = $e->getMessage();
        echo "this is displayed because an error was found";
        exit();
}

на http://ask.hcig.co.za/?p=179

Comments

    Ничего не найдено.