Как подключить mysql к php
Перейти к содержимому

Как подключить mysql к php

  • автор:

Как подключить mysql к php

Сервер MySQL поддерживает различные способы передачи данных. Соединения могут использовать протоколы TCP/IP, сокеты Unix-доменов или именованные пайпы Windows.

Имя хоста localhost имеет особое значение. Оно используется только в сокетах Unix доменов. Чтобы открыть TCP/IP-соединение с локальным хостом, необходимо использовать 127.0.0.1 вместо имени хоста localhost .

Пример #1 Специальное назначение localhost

$mysqli = new mysqli ( «localhost» , «user» , «password» , «database» );

echo $mysqli -> host_info . «\n» ;

$mysqli = new mysqli ( «127.0.0.1» , «user» , «password» , «database» , 3306 );

echo $mysqli -> host_info . «\n» ;

Результат выполнения приведённого примера:

Localhost via UNIX socket 127.0.0.1 via TCP/IP

Умолчания для параметров соединений

В зависимости от функции, осуществляющей подключение, какие-то параметры можно не задавать. Если параметр не задан, модуль попытается использовать значение по умолчанию для этого параметра, которое задано в конфигурационном файле PHP.

Пример #2 Задание значений по умолчанию

mysqli.default_host=192.168.2.27 mysqli.default_user=root mysqli.default_pw="" mysqli.default_port=3306 mysqli.default_socket=/tmp/mysql.sock

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

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

Если имя хоста не задано или передана пустая строка, клиентская библиотека использует для подключения к Unix-сокету хоста localhost . Если сокет не задан или передана пустая строка, и при этом запрошено подключение к Unix-сокету, библиотека попытается подключиться к сокету /tmp/mysql.sock .

В Windows-системах, если в качестве имени хоста передаётся . , библиотека попытается открыть соединение на основе именованного пайпа. В этом случае имя сокета будет воспринято как имя пайпа. Если имя сокета не задано, то будет использовано значение \\.\pipe\MySQL .

Если соединение не использует ни сокет Unix-домена, ни именованный пайп Windows, и при этом не задан порт для подключения, библиотека использует номер порта 3306 .

В драйвере mysqlnd и клиентской библиотеке MySQL (libmysqlclient) заложена та же логика определения умолчаний.

Настройки соединения

Настройки соединения позволяют, например, задать какие-то команды, которые нужно выполнить сразу после подключения, или отдать распоряжение использовать определённый набор символов. Настройки должны быть заданы до подключения к серверу.

Когда требуется задать настройки соединения, операция подключения выполняется в три этапа: функцией mysqli_init() или mysqli::__construct() создаётся дескриптор подключения, затем подключение настраивается с помощью функции mysqli::options() , и наконец устанавливается сетевое соединение с сервером посредством функции mysqli::real_connect() .

Объединение подключений в пул

Модуль mysqli поддерживает постоянные соединения с базой данных, которые представляют из себя специальный вид объединяемых соединений. По умолчанию каждое открытое скриптом соединение закрывается либо самим скриптом в ходе выполнения, либо автоматически по завершении работы скрипта. Постоянные соединения отличаются тем, что не закрываются, а помещаются в пул для повторного использования в дальнейшем. Если требуется подключиться к тому же серверу и базе данных, с тем же именем пользователя, паролем, сокетом и портом, то вместо создания нового подключения из пула извлекается уже существующее. Повторное использование подключений позволяет избежать накладных расходов на создание новых соединений.

Каждый PHP-процесс использует свой пул подключений mysqli. В зависимости от конфигурации веб-сервера, PHP-процесс может обслуживать один или несколько запросов. Соответственно, соединение из пула могут последовательно использовать несколько скриптов.

Постоянное соединение

Новое подключение создаётся, только если в пуле не найдётся свободного подключения с теми же данными хоста, имени пользователя, пароля, сокета, порта и базы данных по умолчанию. Механизм постоянных соединений можно включать и выключать PHP директивой mysqli.allow_persistent. Максимальное количество соединений, которые может открыть скрипт, ограничено значением mysqli.max_links. Максимальное количество соединений, которые может открыть один PHP-процесс, ограничено значением mysqli.max_persistent. Следует заметить, что веб-сервер может порождать множество PHP процессов.

Главный недостаток постоянных подключений заключается в том, что перед повторным использованием их состояние не сбрасывается к изначальному. Например, открытые и незавершённые транзакции не будут автоматически откатываться. Также, если во время нахождения соединения в пуле для процесса изменились какие-либо разрешения или уровни доступа, этот факт никак не отразится на подключении при его извлечении из пула. Такое поведение может привести к нежелательным результатам. Хотя, с другой стороны, название постоянный можно рассматривать, как обещание, что подключение и правда останется в том состоянии, в котором оно было помещено в пул.

Модуль mysqli поддерживает обе интерпретации термина постоянное соединение: состояние соединения может сохраняться, а может и сбрасываться в изначальное. По умолчанию при извлечении из пула, соединение сбрасывается. mysqli делает это неявным вызовом функции mysqli::change_user() каждый раз, когда подключение используется повторно. С точки зрения пользователя подключение выглядит, как только что созданное.

Однако, вызов функции mysqli::change_user() довольно дорогостоящая операция. Для улучшения быстродействия можно перекомпилировать модуль с установленным флагом MYSQLI_NO_CHANGE_USER_ON_PCONNECT .

Выбор между безопасным поведением подключений и наилучшим быстродействием остаётся за пользователем. Здесь нельзя дать однозначного совета. Для простоты использования, по умолчанию включён безопасный режим с очисткой соединений.

Смотрите также

  • mysqli::__construct()
  • mysqli_init()
  • mysqli::options()
  • mysqli::real_connect()
  • mysqli::change_user()
  • $mysqli::host_info
  • MySQLi Configuration Options
  • Persistent Database Connections

Подключения и управление подключениями

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

Пример #1 Подключение к MySQL

$dbh = new PDO ( ‘mysql:host=localhost;dbname=test’ , $user , $pass );
?>

Если при подключении произошла ошибка, будет выброшено исключение PDOException . Его можно перехватить и обработать, либо оставить на откуп глобальному обработчику ошибок, который задан функцией set_exception_handler() .

Пример #2 Обработка ошибок подключения

try $dbh = new PDO ( ‘mysql:host=localhost;dbname=test’ , $user , $pass );
> catch ( PDOException $e ) // Например, через какое-то время повторить попытку соединения
>
?>

Внимание

Как и остальные исключения, исключение PDOException можно отловить явно — через блок catch или неявно — через функцию set_exception_handler() . По умолчанию же непойманное исключение будет преобразовано в фатальную ошибку уровня E_FATAL_ERROR . Фатальня ошибка будет содержать стек вызовов, появляется риск утечки информации о соединении. Поэтому на сервере, который работает в производственной среде, в файле php.ini для опции display_errors должо быть установлено значение 0 .

При успешном подключении к базе данных в скрипт будет возвращён созданный объект PDO. Соединение остаётся активным в течение жизни объекта. Чтобы закрыть соединение, необходимо уничтожить объект путём удаления всех ссылок на него (этого можно добиться, присваивая null всем переменным, указывающим на объект). Если не сделать этого явно, PHP автоматически закроет соединение по окончании работы скрипта.

Замечание: Если существуют другие ссылки на данный экземпляр PDO (например, из объекта PDOStatement или другие переменные, ссылающиеся на него), они также должны быть удалены (например, присвоением null переменной, ссылающейся на PDOStatement).

Пример #3 Закрытие соединения

$dbh = new PDO ( ‘mysql:host=localhost;dbname=test’ , $user , $pass );
// здесь мы каким-то образом используем соединение
$sth = $dbh -> query ( ‘SELECT * FROM foo’ );

// соединение больше не нужно, закрываем
$sth = null ;
$dbh = null ;
?>

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

Пример #4 Постоянные соединения

$dbh = new PDO ( ‘mysql:host=localhost;dbname=test’ , $user , $pass , array(
PDO :: ATTR_PERSISTENT => true
));
?>

Значение параметра PDO::ATTR_PERSISTENT преобразовывается в логическое значение ( bool ) (включить/отключить постоянные подключения), если это не числовая строка ( string ), которая в этом случае позволяет использовать несколько пулов постоянных подключений. Это полезно, если разные соединения используют несовместимые настройки, например, разные значения PDO::MYSQL_ATTR_USE_BUFFERED_QUERY .

Замечание:

Чтобы использовать постоянные соединения, необходимо добавить константу PDO::ATTR_PERSISTENT в массив параметров драйвера, который передаётся конструктору PDO. Если просто задать этот атрибут функцией PDO::setAttribute() уже после создания объекта, драйвер не будет использовать постоянные соединения.

Замечание:

Если вы используете PDO ODBC драйвер и ваши ODBC библиотеки поддерживают объединение подключений в пул (ODBC Connection Pooling) (unixODBC и Windows точно поддерживают, но могут быть и другие), то рекомендуется вместо постоянных соединений пользоваться этим пулом. Пул подключений ODBC доступен всем модулям текущего процесса; если PDO сам кеширует соединение, то это соединение будет недоступно другим модулям и не попадёт в пул. В результате каждый модуль будет создавать дополнительные подключения для своих нужд.

User Contributed Notes

There are no user contributed notes for this page.

  • PDO
    • Введение
    • Установка и настройка
    • Предопределённые константы
    • Подключения и управление подключениями
    • Транзакции и автоматическая фиксация изменений
    • Подготовленные запросы и хранимые процедуры
    • Ошибки и их обработка
    • Большие объекты (LOB)
    • PDO
    • PDOStatement
    • PDORow
    • PDOException
    • Драйверы PDO
    • Copyright © 2001-2024 The PHP Group
    • My PHP.net
    • Contact
    • Other PHP.net sites
    • Privacy policy

    Взаимодействие с MySQL через mysqli

    Библиотека MySQLi представляет альтернативный способ подключения к базе данных MySQL. Причем он предоставляет два подхода: процедурный и объектно-ориентированный. Рассмотрим применение обоих подходов.

    Создание подключения в объектно-ориентированном стиле

    Для создания подключения к серверу MySQL в объектно-ориентированном стиле применяется конструктор mysqli() , в который передаются настройки подключения — адрес сервера MySQL, имя пользователя и пароль:

    $conn = new mysqli("адрес_сервера", "имя_пользователя", "пароль");

    Конструктор создает объект mysqli , через который осуществляется взаимодействие с базой данных. Однако если подключение не удалось установить, то устанавливается свойство $conn->connect_error , которое содержит информацию об ошибке. Поэтому перед взаимодействием с MySQL мы можем проверить успешность подключения:

    if ($conn->connect_error) < die("Connection failed: " . $conn->connect_error); >

    После окончания выполнения скрипта подключение к MySQL закрывается автоматически. Однако мы можем закрыть подключение и до окончания работы скрипта с помощью метода close() :

    con ->close();

    Теперь соединим все вместе выполним подключение к локальному серверу MySQL:

    connect_error)< die("Ошибка: " . $conn->connect_error); > echo "Подключение успешно установлено"; $conn->close(); ?>

    Поскольку подключение производится к локальному серверу MySQL, то первый параметр конструктора mysqli — строка «localhost». Второй параметр в качестве имени пользователя использует «root» — пользователь, который содается на сервере MySQL по умолчанию. И третий параметр — пароль пользователя «root».

    Подключение в процедурном стиле

    Для подключения в процедурном стиле применяется функция mysqli_connect , которая принимает адрес сервера, имя и пароль пользователя:

    $conn = mysqli_connect("адрес_сервера", "имя_пользователя", "пароль");

    Функция возвращает объект, который используется для подключения к базе данных. Однако если подключение не удалось установить, то функция возвращает false . Поэтому перед взаимодействием с MySQL мы можем проверить успешность подключения:

    if (!$conn)

    С помощью функции mysqli_connect_error() можно получить информацию об ошибке.

    Для закрытия подключения применяется функция mysqli_close() , которая в качестве параметра принимает ранее созданный объект подключения:

    mysqli_close($conn);
     echo "Подключение успешно установлено"; mysqli_close($conn); ?>

    Взаимодействие PHP и MySQL

    После установки и настройки базы данных MySQL можно приступать к написанию сценариев PHP для взаимодействия с базой данных. В настоящей статье приведено описание всех основных функций, позволяющих передавать данные в прямом и обратном направлениях от веб-сайта к базе данных. Информация, касающаяся создания базы данных MySQL, приведена в предыдущей статье «Проектирование базы данных», в примерах ниже мы будем использовать созданные таблицы тестовой базы users (если не хотите прорабатывать примеры из предыдущей статьи можете воспользоваться дампом базы данных users).

    Неважно, насколько простые или сложные у вас сценарии, если они общаются с базой данных, они начинаются с одних и тех же нескольких действий:

    1. Подключение к установленной базе данных MySQL.
    2. Использование команды USE в отношении нужной базы данных MySQL.
    3. Отправка SQL базе данных.
    4. Получение результатов.
    5. Обработка результатов.

    Действия 3, 4 и 5 будут изменяться в зависимости от характера выполняемой работы. Сценарий, создающий таблицы, немного отличается от сценария, который ведет поиск в существующих таблицах. Но первые два действия — подключение к MySQL и использование нужной базы данных — всегда одни и те же, независимо от предназначения сценария.

    Курс PHP для начинающих

    Расширения mysql и mysqli

    PHP предлагает на выбор разработчику два расширения для работы с базами данных MySQL. Расширение mysql предоставляет процедурный интерфейс и предназначено для использования с MySQL версии 4.1.3 или более ранними версиями. Его также можно использовать и с более свежими версиями СУБД, но в этом случае многие возможности сервера, появившиеся после версии 4.1.3, будут недоступны программисту.

    Расширение mysqli, или как его еще называют улучшенное (improved) MySQL расширение, было разработано, чтобы дать возможность программистам в полной мере воспользоваться функционалом MySQL сервера версий 4.1.3 и выше. Расширение mysqli включается в поставку PHP версий 5 и выше. mysqli имеет ряд преимуществ и усовершенствований по сравнению с mysql, которые заключаются в следующем:

    • Объектно-ориентированный интерфейс;
    • Поддержка подготавливаемых запросов;
    • Поддержка мультизапросов;
    • Поддержка транзакций;
    • Улучшенные возможности отладки;
    • Поддержка встроенного сервера.

    Наравне с объектно-ориентированным расширение предоставляет и процедурный интерфейс. В последующих примерах я буду использовать расширение mysqli, т.к. mysql является устаревшим.

    Курс PHP для начинающих

    Подключение к базе данных MySQL

    Сначала нужно сообщить вашему PHP-сценарию, как нужно подключиться к базе данных. Этот процесс, по сути, сообщает PHP, что нужно делать то же самое, что вы выполняли, начиная работу со своим клиентом командной строки MySQL. Чтобы подключиться к базе данных, PHP нужно будет передать следующую информацию: имя хоста вашей базы данных, имя пользователя, пароль и имя базы данных.

    Запустите свой текстовый редактор и создайте новый сценарий, назвав его connect.php. Сценарий должен быть как можно проще, потому что вам нужно всего лишь подключиться к своей базе данных, воспользоваться с помощью команды USE необходимой базой данных и запустить пробный SQL-запрос, чтобы убедиться, что все работает. Введите в сценарий следующие строки:

    '.mysqli_connect_errno().' - '.mysqli_connect_error().'

    '); > echo "

    Вы подключились к MySQL!

    ";

    Если база данных запускается на той же машине, на которой находятся PHP и файлы обслуживания сети, хост-именем базы данных будет, как правило, localhost, которое означает «локальная машина». После создания этого файла его удобно будет подключать на страницах сайта:

         Основы PHP и MySQL  

    Вот так все просто! И хотя здесь есть несколько новых для вас команд, вы, наверное, уже знаете почти все, что происходит в этом сценарии. Сначала в нем используется новая команда: mysqli_connect. Она просто получает имя хоста базы данных, имя пользователя, пароль, имя базы данных и осуществляет подключение. Происходит все то же самое, как и при запуске окна командной строки mysql и подключении к удаленной базе данных. В случае успешного выполнения этой команды она возвращает ресурс, содержащий ссылку на подключение к базе данных; если установить подключение не удалось функция mysqli_connect() возвращает значение false — мы проверяем это в условном операторе и, если соединения нет, прекращаем дальнейшее выполнение сценариев и выводим сообщение об ошибке.

    Функция mysqli_connect_errno() возвращает код ошибки, а mysqli_connect_error() — текст ошибки. Если инструкция mysqli_connect сумела создать подключение без всяких проблем, она возвращает это подключение, PHP пропустит строку с инструкцией die, а затем выведет строку «Вы подключились к MySQL!».

    Курс PHP для начинающих

    Выбор кодировки

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

    В моем случае вывод окажется следующем:

    В этом случае нужно установить требуемую кодировку для базы данных. Это можно сделать с помощью следующего запроса, который должен быть первым запросом после подключения к базе данных (измените файл connect.php):

    '.mysqli_connect_errno().' - '.mysqli_connect_error().'

    '); > mysqli_query($link, "SET NAMES utf8"); echo "

    Вы подключились к MySQL!

    ";

    В результате будет получен корректный вывод данных:

    Курс PHP для начинающих

    Вывод SQL-результатов

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

    Здесь используется еще одна новая для вас функция перехода от PHP к MySQL: mysqli_query(). При выполнении команды mysqli_query() фактически происходит выборка данных из базы данных и передача интерпретатору PHP своего рода квитанции, содержащей информацию о состоянии выполнения операции. К этому моменту данные передаются во временное хранилище, которое не является непосредственно доступным ни из среды MySQL, ни из среды PHP; это хранилище можно рассматривать как своего рода промежуточную область. Необходимые данные уже на месте, но ожидают того момента, когда поступит команда на их передачу пользователю. Чтобы данные стали полностью доступными в среде PHP, требуется одна из функций выборки с префиксом mysqli_fetch:

    Функции PHP для выборки данных из базы MySQL

    Функция Описание
    mysqli_fetch_row() Возвращает строку в виде массива с числовым индексом.
    mysqli_fetch_object() Возвращает строку в виде объекта.
    mysqli_fetch_array() Возвращает строку в виде ассоциативного массива.

    В нашем примере мы использовали функцию mysqli_fetch_row() позволяющую осуществить выборку из базы данных информации, содержащейся в указанных строках, таким образом, чтобы каждая строка вывода содержала данные из одной строки или информацию, связанную с уникальным идентификатором (если таковой имеется). Для доступа к элементам массива с числовым индексом применяются обозначения в виде целых чисел в квадратных скобках, называемых смещениями полей. Следует помнить, что такие смещения всегда начинаются с целочисленного нуля. А если в ходе доступа отсчет начат с единицы, то будет пропущено значение из первого столбца.

    Курс PHP для начинающих

    Объектно-ориентированный интерфейс mysqli

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

    Классы расширения mysqli

    Класс Описание
    mysqli Представляет связь между PHP и базой данных MySQL
    mysqli_driver Позволяет выполнять остановку-запуск встроенного сервера
    mysqli_result Представляет результирующий набор, полученный из запроса в базу данных
    mysqli_sql_exception Специальный класс исключений mysqli

    Эти классы содержат огромное количество свойств и методов которые вы можете изучить по приведенной ссылке — MySQLi Summary. Я же перепишу предыдущий пример с выводом таблиц в объектно-ориентированном стиле (немного усложним этот пример и выведем данные таблиц):

    connect_error) < die('

    '.$link->connect_errno.' - '.$link->connect_error.'

    '); > $link->query("SET NAMES utf8"); echo "

    Вы подключились к MySQL!

    ";

    Исходный файл

     > ?>     Основы PHP и MySQL /* Стилизация таблиц */ table < border-collapse:separate; border:none; border-spacing:0; margin:8px 12px 18px 6px; line-height:1.2em; margin-left:auto; margin-right:auto; overflow: auto >table th < font-weight:bold; background:#666; color:white; border:1px solid #666; border-right:1px solid white >table th:last-child < border-right:1px solid #666 >table caption < font-style:italic; margin:10px 0 20px 0; text-align:center; color:#666; font-size:1.2em >tr < border:none >td < border:1px solid #666; border-width:1px 1px 0 0 >td, th < padding:15px >tr td:first-child < border-left-width:1px >tr:last-child td query('SHOW TABLES'); // В случае неудачного запроса генерируем исключение if (!$result) throw new MySQL_Exception($link->error); // Пример вставки данных в таблицу $link->query("INSERT INTO customers VALUES (NULL, 'Андрей', 'Петров', '+7-920-555-55-55')"); // Отображаем результаты echo '

    Таблицы, имеющиеся в базе данных:

    '; while ($row = $result->fetch_row()) < // Усложним задачу отобразив структуру таблиц echo ""; // Получить названия столбцов $result1 = $link->query("SELECT * FROM "); if (!$result1) throw new MySQL_Exception($link->error); for($i = 0; $i < $link->field_count; $i++) < $field_info = $result1->fetch_field(); echo ""; > echo ''; // Получить данные while ($row1 = $result1->fetch_row()) < echo ''; foreach($row1 as $_column) < echo ""; > echo ""; > echo '
    name>
    '; > > catch (Exception $ex) < echo 'Ошибка при работе с MySQL: '.$ex->getMessage().''; > ?>

    В результате получим полную структуру базы данных users:

    Проектирование базы данных Базы данных и веб-формы

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *