<?php
include_once $_SERVER['DOCUMENT_ROOT'] . '/include/shared-manual.inc';
$TOC = array();
$TOC_DEPRECATED = array();
$PARENTS = array();
include_once dirname(__FILE__) ."/toc/book.pdo.inc";
$setup = array (
  'home' => 
  array (
    0 => 'index.php',
    1 => 'PHP Manual',
  ),
  'head' => 
  array (
    0 => 'UTF-8',
    1 => 'ru',
  ),
  'this' => 
  array (
    0 => 'pdo.connections.php',
    1 => 'Подключения и управление подключениями',
    2 => 'Подключения и управление подключениями',
  ),
  'up' => 
  array (
    0 => 'book.pdo.php',
    1 => 'PDO',
  ),
  'prev' => 
  array (
    0 => 'pdo.constants.fetch-modes.php',
    1 => 'Режимы выборки',
  ),
  'next' => 
  array (
    0 => 'pdo.transactions.php',
    1 => 'Транзакции и автоматическая фиксация изменений',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'ru',
    'path' => 'reference/pdo/connections.xml',
  ),
  'history' => 
  array (
  ),
);
$setup["toc"] = $TOC;
$setup["toc_deprecated"] = $TOC_DEPRECATED;
$setup["parents"] = $PARENTS;
manual_setup($setup);

contributors($setup);

?>
<div id="pdo.connections" class="chapter">
 <h1 class="title">Подключения и управление подключениями</h1>

 <p class="para">
  Для установки соединений создают экземпляры базового класса — PDO.
  Неважно, через какой драйвер разработчик взаимодействует с базой данных;
  объекты подключения создают по имени класса PDO, независимо от драйвера.
  Конструктор класса принимает аргументы, которые определят источник базы данных
  (англ. Data Source Name, DSN) и необязательные имя пользователя и пароль, если передали.
 </p>
 <p class="para">
  <div class="example" id="example-1">
   <p><strong>Пример #1 Подключение к БД MySQL</strong></p>
   <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /><br />$dbh </span><span style="color: #007700">= new </span><span style="color: #0000BB">PDO</span><span style="color: #007700">(</span><span style="color: #DD0000">'mysql:host=localhost;dbname=test'</span><span style="color: #007700">, </span><span style="color: #0000BB">$user</span><span style="color: #007700">, </span><span style="color: #0000BB">$pass</span><span style="color: #007700">);<br /><br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

  </div>
 </p>
 <p class="para">
  Модуль выбросит исключение <code class="literal">PDOException</code>,
  если при подключении возникнут ошибки. Исключение перехватывают
  и обрабатывают, или оставляют глобальному обработчику исключений приложения,
  который установили функцией <span class="function"><a href="function.set-exception-handler.php" class="function">set_exception_handler()</a></span>.
 </p>
 <p class="para">
  <div class="example" id="example-2"><p><strong>Пример #2 Пример обработки ошибок подключения</strong></p>
   <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /><br /></span><span style="color: #007700">try {<br />    </span><span style="color: #0000BB">$dbh </span><span style="color: #007700">= new </span><span style="color: #0000BB">PDO</span><span style="color: #007700">(</span><span style="color: #DD0000">'mysql:host=localhost;dbname=test'</span><span style="color: #007700">, </span><span style="color: #0000BB">$user</span><span style="color: #007700">, </span><span style="color: #0000BB">$pass</span><span style="color: #007700">);<br />} catch (</span><span style="color: #0000BB">PDOException $e</span><span style="color: #007700">) {<br />    </span><span style="color: #FF8000">// Например, через какое-то время повторить попытку соединения<br /></span><span style="color: #007700">}<br /><br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

  </div>
 </p>
 <div class="warning"><strong class="warning">Внимание</strong>
  <p class="para">
   Как и остальные <a href="language.exceptions.php" class="link">исключения</a>,
   исключение <span class="classname"><a href="class.pdoexception.php" class="classname">PDOException</a></span> перехватывают явно —
   через блок <a href="language.exceptions.php#language.exceptions.catch" class="link"><code class="literal">catch</code></a> или неявно — функцией <span class="function"><a href="function.set-exception-handler.php" class="function">set_exception_handler()</a></span>.
   По умолчанию непойманное исключение преобразуется в фатальную ошибку уровня
   <strong><code>E_FATAL_ERROR</code></strong>.
   Фатальная ошибка будет содержать стек вызовов, из-за которой появляется риск утечки информации о соединении.
   Поэтому на сервере, который работает в производственной среде, в файле <var class="filename">php.ini</var> для опции
   <a href="errorfunc.configuration.php#ini.display-errors" class="link"><code class="literal">display_errors</code></a>
   устанавливают значение <code class="literal">0</code>.
  </p>
 </div>
 <p class="para">
  После успешного подключения к базе данных экземпляр класса PDO возвращается в скрипт.
  Соединение остаётся активным в течение жизни объекта PDO.
  Потребуется уничтожить объект, чтобы закрыть соединение. Объект уничтожают
  путём удаления ссылок на объект через присваивание значения <strong><code><a href="reserved.constants.php#constant.null">null</a></code></strong> переменным,
  которые содержат объект. PHP автоматически закроет соединение по окончании работы скрипта,
  если не сделать этого явно.
 </p>
 <blockquote class="note"><p><strong class="note">Замечание</strong>: 
  <span class="simpara">
   Другие ссылки, которые по-прежнему указывают на экземпляр PDO, также потребуется удалить.
   Такие ссылки остаются в экземпляре PDOStatement или в других переменных,
   которые ссылаются на тот же экземпляр PDO. Ссылки удаляют
   путём присваивания значения <strong><code><a href="reserved.constants.php#constant.null">null</a></code></strong> переменной, которая ссылается на объект PDOStatement.
  </span>
 </p></blockquote>
 <p class="para">
  <div class="example" id="example-3">
   <p><strong>Пример #3 Пример закрытия соединения</strong></p>
   <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /><br />$dbh </span><span style="color: #007700">= new </span><span style="color: #0000BB">PDO</span><span style="color: #007700">(</span><span style="color: #DD0000">'mysql:host=localhost;dbname=test'</span><span style="color: #007700">, </span><span style="color: #0000BB">$user</span><span style="color: #007700">, </span><span style="color: #0000BB">$pass</span><span style="color: #007700">);<br /><br /></span><span style="color: #FF8000">// С этого места пользуемся соединением...<br /></span><span style="color: #0000BB">$sth </span><span style="color: #007700">= </span><span style="color: #0000BB">$dbh</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">query</span><span style="color: #007700">(</span><span style="color: #DD0000">'SELECT * FROM foo'</span><span style="color: #007700">);<br /><br /></span><span style="color: #FF8000">// ...а здесь соединение больше не требуется; закрываем его<br /></span><span style="color: #0000BB">$sth </span><span style="color: #007700">= </span><span style="color: #0000BB">null</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">$dbh </span><span style="color: #007700">= </span><span style="color: #0000BB">null</span><span style="color: #007700">;<br /><br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

  </div>
 </p>
 <p class="para">
  Установка постоянных соединений с серверами баз данных часто приносит пользу приложениям.
  Постоянные соединения не закрываются при завершении работы скрипта,
  кешируются и переиспользуются, когда другой скрипт запрашивает соединение
  с теми же учётными данными. С постоянными соединениями не требуется создавать
  новые подключения при каждом обмене данными с базой, что увеличивает скорость работы таких приложений.
 </p>
 <p class="para">
  <div class="example" id="example-4">
   <p><strong>Пример #4 Постоянные соединения</strong></p>
   <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /><br />$dbh </span><span style="color: #007700">= new </span><span style="color: #0000BB">PDO</span><span style="color: #007700">(</span><span style="color: #DD0000">'mysql:host=localhost;dbname=test'</span><span style="color: #007700">, </span><span style="color: #0000BB">$user</span><span style="color: #007700">, </span><span style="color: #0000BB">$pass</span><span style="color: #007700">, array(<br />    </span><span style="color: #0000BB">PDO</span><span style="color: #007700">::</span><span style="color: #0000BB">ATTR_PERSISTENT </span><span style="color: #007700">=&gt; </span><span style="color: #0000BB">true<br /></span><span style="color: #007700">));<br /><br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

  </div>
 </p>
 <p class="para">
  Значение параметра <strong><code><a href="pdo.constants.php#pdo.constants.attr-persistent">PDO::ATTR_PERSISTENT</a></code></strong> преобразовывается
  в логическое значение (<span class="type"><a href="language.types.boolean.php" class="type bool">bool</a></span>): включить или выключить постоянные подключения,
  если только это не числовая строка (<span class="type"><a href="language.types.string.php" class="type string">string</a></span>), которая разрешает использовать
  несколько пулов постоянных подключений. Это приносит пользу, когда разные соединения
  используют несовместимые настройки, например, разные значения
  режима буферизации <strong><code><a href="ref.pdo-mysql.php#pdo.constants.mysql-attr-use-buffered-query">PDO::MYSQL_ATTR_USE_BUFFERED_QUERY</a></code></strong>.
 </p>
 <blockquote class="note"><p><strong class="note">Замечание</strong>: 
  <p class="para">
   Постоянные соединения включают путём добавления константы
   <strong><code><a href="pdo.constants.php#pdo.constants.attr-persistent">PDO::ATTR_PERSISTENT</a></code></strong> в массив параметров драйвера,
   которые передают конструктору класса PDO. Драйвер не будет использовать
   постоянные соединения, если установить этот атрибут
   методом <span class="methodname"><a href="pdo.setattribute.php" class="methodname">PDO::setAttribute()</a></span> после создания объекта.
  </p>
 </p></blockquote>
 <div class="warning"><strong class="warning">Внимание</strong>
  <p class="para">
   Модуль PDO не выполняет очистку постоянных подключений. Временные таблицы, блокировки, транзакции
   и другие изменения состояния могут оставаться от предыдущего использования подключения,
   вызывая непредвиденные проблемы. Дополнительные сведения смотрите в разделе
   <a href="features.persistent-connections.php" class="link">Постоянные соединения с базами данных</a>.
  </p>
 </div>
 <blockquote class="note"><p><strong class="note">Замечание</strong>: 
  <p class="para">
   При взаимодействии с ODBC-драйвером модуля PDO и если ODBC-библиотеки поддерживают
   объединение подключений в пул по протоколу ODBC, как это делают unixODBC и Windows,
   и, возможно, другие системы, то вместо постоянных PDO-соединений рекомендуют
   оставлять кеширование соединений на уровне ODBC-пула.
   Пул соединений драйвера ODBC разделяет соединения с другими модулями
   в процессе; если PDO-объект попросят кешировать соединение, то такое соединение
   не вернётся в пул соединений драйвера ODBC, из-за чего драйвер создаст дополнительные подключения
   для обслуживания других модулей.
  </p>
 </p></blockquote>
</div>
<?php manual_footer($setup); ?>