<?php
include_once $_SERVER['DOCUMENT_ROOT'] . '/include/shared-manual.inc';
$TOC = array();
$TOC_DEPRECATED = array();
$PARENTS = array();
include_once dirname(__FILE__) ."/toc/book.mysqli.inc";
$setup = array (
  'home' => 
  array (
    0 => 'index.php',
    1 => 'PHP Manual',
  ),
  'head' => 
  array (
    0 => 'UTF-8',
    1 => 'ru',
  ),
  'this' => 
  array (
    0 => 'mysqli.overview.php',
    1 => 'Краткий обзор',
    2 => 'Краткий обзор',
  ),
  'up' => 
  array (
    0 => 'book.mysqli.php',
    1 => 'MySQLi',
  ),
  'prev' => 
  array (
    0 => 'book.mysqli.php',
    1 => 'MySQLi',
  ),
  'next' => 
  array (
    0 => 'mysqli.quickstart.php',
    1 => 'Краткое руководство',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'ru',
    'path' => 'reference/mysqli/overview.xml',
  ),
  'history' => 
  array (
  ),
);
$setup["toc"] = $TOC;
$setup["toc_deprecated"] = $TOC_DEPRECATED;
$setup["parents"] = $PARENTS;
manual_setup($setup);

contributors($setup);

?>
<div id="mysqli.overview" class="chapter">

  <h1 class="title">Краткий обзор</h1>


  <p class="para">
   Раздел описывает инструменты, которые помогают программистам разрабатывать PHP-приложения,
   которые взаимодействуют с базой данных MySQL.
  </p>

  <p class="para">
   <strong>Об API-интерфейсе</strong>
  </p>

  <p class="para">
   Программный интерфейс приложения (англ. Application Programming Interface, API)
   определяет набор классов, методов, функций и переменных, к которым приложению потребуется обращаться,
   чтобы выполнить поставленные задачи. PHP-приложения взаимодействуют с базами данных через API-интерфейсы,
   которые приложениям обычно открывают PHP-модули.
  </p>

  <p class="para">
   Программисты взаимодействуют с модулями через процедурный или объектно-ориентированный API-интерфейс.
   При работе через процедурный API задачи выполняют путём вызова функций,
   при взаимодействии через объектно-ориентированный API-интерфейс создают экземпляры классов,
   а затем вызывают методы этих объектов. Из этих двух интерфейсов часто выбирают последний,
   поскольку код в объектно-ориентированном стиле лучше организован, что снижает сложность
   восприятия кода и упрощает тестирование и поддержку.
  </p>

  <p class="para">
   Язык программирования PHP предлагает разработчикам несколько API-интерфейсов,
   через которые PHP-приложения взаимодействуют с базами данных MySQL.
   Документ описывает эти интерфейсы и даёт рекомендации
   по выбору конкретного способа подключения к базе данных из приложения.
  </p>

  <p class="para">
   <strong>О коннекторе</strong>
  </p>

  <p class="para">
   В MySQL-документации термин <em>коннектор</em> (англ. connector) относится
   к части программного обеспечения, которая разрешает приложению подключаться к серверу баз данных MySQL.
   БД MySQL предоставляет коннекторы для разных языков
   программирования, включая язык PHP.
  </p>

  <p class="para">
   Разработчику потребуется написать PHP-код, чтобы PHP-приложение научилось взаимодействовать
   с сервером баз данных: подключаться, отправлять запросы
   и выполнять другие операции, которые связаны с базой данных.
   Серверу баз данных потребуется ПО, чтобы предоставить API-интерфейс,
   через который PHP-приложение будет взаимодействовать с сервером,
   и чтобы управлять обменом информацией между приложением и сервером баз данных,
   для чего иногда также требуются промежуточные библиотеки.
   Это программное обеспечение называется коннектором, поскольку разрешает приложению
   <em>подключаться</em> (англ. to connect) к серверу баз данных.
  </p>

  <p class="para">
   <strong>О драйвере</strong>
  </p>

  <p class="para">
   Драйвер — часть программного обеспечения, которую разработали
   для взаимодействия приложения с конкретным типом сервера баз данных.
   Приложение вызывает методы коннектора, тот обращается к своему драйверу конкретной СУБД,
   а драйвер со своей стороны обращается к нижележащим библиотекам —
   клиентской библиотеке MySQL Client Library или встроенному драйверу MySQL Native Driver.
   Эти библиотеки реализуют низкоуровневый протокол взаимодействия с MySQL-сервером баз данных.
  </p>

  <p class="para">
   Например, PHP-модуль <a href="mysqli.overview.php#mysqli.overview.pdo" class="link">PDO</a>, который поддерживает доступ
   к базам данных на уровне абстракции, содержит набор драйверов для доступа к конкретным базам данных.
   В список доступных модулю драйверов входит драйвер PDO_MYSQL,
   который разрешает модулю PDO взаимодействовать с сервером MySQL.
  </p>

  <p class="para">
   Термины «коннектор» и «драйвер» иногда употребляют как синонимы,
   это сбивает с толку. В MySQL-документации термин <q class="quote">драйвер</q>
   зарезервировали за программным обеспечением, которое предоставляет
   часть пакета коннектора для конкретной базы данных.
  </p>

  <p class="para">
    <strong>О модуле</strong>
  </p>

  <p class="para">
   В PHP-документации встречается ещё один термин — <em>модуль</em>.
   Код самого PHP состоит из ядра и дополнительных модулей, которые расширяют
   функциональность ядра. Для работы с СУБД MySQL ядро PHP расширили модулем
   <code class="literal">mysqli</code> и модулем PDO с MySQL-драйвером. Оба модуля включили
   в инфраструктуру модулей языка PHP.
  </p>

  <p class="para">
   Обычно модули предоставляют PHP-программисту API-интерфейс,
   через который разработчик получает доступ к функциям модуля программно.
   При этом отдельные модули в инфраструктуре PHP-модулей не раскрывают для программиста никаких интерфейсов.
  </p>

  <p class="para">
   MySQL-драйвер модуля PDO, например, не раскрывает API-интерфейс для программиста,
   но предоставляет интерфейс вышележащему абстрактному слою, который представляет модуль PDO.
  </p>

  <p class="para">
   Термины «API-интерфейс» и «модуль» нельзя воспринимать как одно и то же,
   поскольку модуль не обязан раскрывать API-интерфейс для программиста.
  </p>

  <p class="para">
   <strong>
    О главных API-интерфейсах языка PHP для работы с БД MySQL
   </strong>
  </p>

  <p class="para">
   PHP предлагает два API-интерфейса для подключения к серверу баз данных MySQL:
  </p>

  <ul class="itemizedlist">

    <li class="listitem">
      <p class="para">
        PHP-модуль mysqli
      </p>
    </li>

    <li class="listitem">
      <p class="para">
        PHP-модуль PDO
      </p>
    </li>

  </ul>

  <p class="para">
    Каждый модуль содержит достоинства, но встречаются и недостатки. Цель следующей части обзора
    состоит в кратком описании характеристик каждого API-интерфейса.
  </p>

  <p class="para">
    <strong>О PHP-модуле mysqli</strong>
  </p>

  <p class="para">
   Модуль <code class="literal">mysqli</code>, или <em>улучшенный</em> модуль MySQL (англ. improved MySQL),
   разработали, чтобы PHP-программисты получили выгоду, которую дают новые функции MySQL-систем версии 4.1.3 и выше.
   Модуль <code class="literal">mysqli</code> включается в пакет PHP версии 5 и выше.
  </p>

  <p class="para">
   Модуль <code class="literal">mysqli</code> содержит преимущества,
   главные из которых по сравнению с модулем <code class="literal">mysql</code> состоят в следующем:

   <ul class="itemizedlist">

    <li class="listitem">
     <p class="para">
      Объектно-ориентированный интерфейс
     </p>
    </li>

    <li class="listitem">
     <p class="para">
       Поддержка подготовленных запросов
     </p>
    </li>

    <li class="listitem">
     <p class="para">
       Поддержка мультизапросов
     </p>
    </li>

    <li class="listitem">
     <p class="para">
       Поддержка транзакций
     </p>
    </li>

    <li class="listitem">
     <p class="para">
       Расширенные инструменты отладки
     </p>
    </li>

   </ul>
  </p>

  <p class="para">
   Наравне с объектно-ориентированным интерфейсом модуль предоставляет и процедурный
   интерфейс.
  </p>

  <p class="para">
   Модуль <code class="literal">mysqli</code> встраивается в инфраструктуру модулей языка PHP,
   исходный код модуля лежит в каталоге <var class="filename">ext/mysqli</var>.
  </p>

  <p class="para">
   Подробнее о модуле <code class="literal">mysqli</code>
   рассказывает раздел <a href="book.mysqli.php" class="xref">MySQLi</a>.
  </p>

  <p class="para" id="mysqli.overview.pdo">
   <strong>О модуле PDO</strong>
  </p>

  <p class="para">
   Модуль PDO — абстракция коннектора, которая определяет интерфейс доступа к базам данных для PHP-приложений.
   Модуль PDO раскрывает для PHP-приложений согласованный API-интерфейс,
   при взаимодействии с которым приложение не зависит от типа конкретного сервера баз данных,
   к которому подключается. Теоретически, при работе через API-интерфейс модуля PDO
   один сервер баз данных легко заменить другим, например поменять Firebird на MySQL,
   и для этого потребуются внести в PHP-код только незначительные изменения.
  </p>

  <p class="para">
   К другим примерам абстракций коннекторов баз данных относятся пакет JDBC для Java-приложений
   и пакет DBI для приложений на языке программирования Perl.
  </p>

  <p class="para">
   Преимущества модуля PDO состоят в чистоте, простоте и переносимости API-интерфейса,
   а главный недостаток модуля — недоступность продвинутых функций,
   которые поддерживаются последними версиями MySQL-сервера. К таким функциям, например, относятся
   множественные запросы, которые модуль PDO не поддерживает.
  </p>

  <p class="para">
   Модуль PDO встраивается в инфраструктуру модулей языка PHP,
   исходный код модуля лежит в директории <var class="filename">ext/pdo</var>.
  </p>

  <p class="para">
   Подробнее о модуле рассказывает раздел <a href="book.pdo.php" class="xref">PDO</a>.
  </p>

  <p class="para">
   <strong>О драйвере модуля PDO для работы с СУБД MySQL</strong>
  </p>

  <p class="para">
   MySQL-драйвер модуля PDO не относится к API-интерфейсу, который модуль раскрывает
   для программиста. MySQL-драйвер модуля PDO лежит на уровне ниже самого модуля PDO
   и взаимодействует с MySQL-сервером. Программист вызывает функции API-интерфейса модуля PDO,
   а модуль взаимодействует с драйвером для отправки данных и команд на MySQL-сервер.
  </p>

  <p class="para">
   MySQL-драйвер модуля PDO взаимодействует с MySQL-серверами, но модуль также включает драйверы
   для взаимодействия с серверами баз данных Firebird, PostgreSQL и другими СУБД.
  </p>

  <p class="para">
   MySQL-драйвер модуля PDO встраивается в инфраструктуру модулей языка PHP,
   исходный код модуля лежит в каталоге <var class="filename">ext/pdo_mysql</var>.
   Модуль не раскрывает API-интерфейс PHP-программисту.
  </p>

  <p class="para">
    Дополнительно о MySQL-драйвере модуля PDO рассказывает раздел
    <a href="ref.pdo-mysql.php" class="xref">PDO-драйвер СУБД MySQL</a>.
  </p>

  <p class="para" id="mysqli.overview.mysqlnd">
    <strong>О родном драйвере PHP для работы с СУБД MySQL</strong>
  </p>

  <p class="para">
   Модуль <code class="literal">mysqli</code> и MySQL-драйвер модуля PDO взаимодействуют с MySQL-сервером
   путём обращения к низкоуровневой библиотеке, которая реализует
   протокол взаимодействия с СУБД. Раньше единственной доступной библиотекой была
   клиентская библиотека MySQL Client Library, которая распространяется как пакет
   <code class="literal">libmysqlclient</code>.
  </p>

  <p class="para">
   Однако интерфейс, который предоставляла библиотека <code class="literal">libmysqlclient</code>,
   не был оптимизирован для взаимодействия с PHP-приложениями, поскольку библиотека
   <code class="literal">libmysqlclient</code> разрабатывалась для работы с приложениями на языке C.
   Поэтому как альтернативу MySQL-библиотеке <code class="literal">libmysqlclient</code> разработали
   родной PHP-драйвер для взаимодействия с СУБД MySQL — MySQL Native Driver,
   который распространяется как PHP-модуль и называется <code class="literal">mysqlnd</code>.
  </p>

  <p class="para">
   Модуль <code class="literal">mysqli</code> и PDO-драйвер для СУБД MySQL
   настраиваются отдельно — либо для работы с внешней библиотекой <code class="literal">libmysqlclient</code>,
   либо для работы с родным PHP-драйвером <code class="literal">mysqlnd</code>.
   Внутренний драйвер работает быстрее и расходует меньше памяти
   по сравнению с внешней библиотекой <code class="literal">libmysqlclient</code>,
   поскольку драйвер <code class="literal">mysqlnd</code> разработали непосредственно для работы в PHP-системах.
   Поэтому лучше предпочесть родной PHP-драйвер.
  </p>

  <p class="para">
   Родной PHP-драйвер для взаимодействия с СУБД MySQL встраивается в инфраструктуру модулей языка PHP,
   исходный код модуля лежит в каталоге <var class="filename">ext/mysqlnd</var>.
   Модуль не раскрывает API-интерфейс для PHP-программиста.
  </p>



  <p class="para">
    <strong>Сравнение функций модулей</strong>
  </p>

  <p class="para">
    Следующая таблица сравнивает функциональность основных методов
    подключения к СУБД MySQL из PHP-приложения:
  </p>

  <table id="mysqli.overview.option.comparison" class="doctable table">
   <caption><strong>Сравнение API-интерфейсов для взаимодействия PHP-приложений с СУБД MySQL</strong></caption>
    
      <col width="34*" />
      <col width="33*" />
      <col width="33*" />
      <thead>
        <tr>
          <th class="empty">&nbsp;</th>
          <th>PHP-модуль mysqli</th>
          <th>PHP-модуль PDO через драйвер PDO_MySQL и родной PHP-драйвер для СУБД MySQL</th>
        </tr>

      </thead>

      <tbody class="tbody">
        <tr>
          <td>Версия PHP, в которой представили модуль</td>
          <td>5.0</td>
          <td>5.0</td>
        </tr>

        <tr>
          <td>Статус разработки MySQL</td>
          <td>Разработка продолжается</td>
          <td>Разработка продолжается</td>
        </tr>

        <tr>
          <td>API поддерживает наборы символов</td>
          <td>Да</td>
          <td>Да</td>
        </tr>

        <tr>
          <td>API поддерживает подготовленные запросы на стороне сервера</td>
          <td>Да</td>
          <td>Да</td>
        </tr>

        <tr>
          <td>API поддерживает подготавливаемые запросы на стороне клиента</td>
          <td>Нет</td>
          <td>Да</td>
        </tr>

        <tr>
          <td>API поддерживает хранимые процедуры</td>
          <td>Да</td>
          <td>Да</td>
        </tr>

        <tr>
          <td>API поддерживает множественные запросы</td>
          <td>Да</td>
          <td>По большей части</td>
        </tr>

        <tr>
          <td>Поддержка всего функционала MySQL 4.1+</td>
          <td>Да</td>
          <td>По большей части</td>
        </tr>

      </tbody>
    
  </table>


</div>
<?php manual_footer($setup); ?>