PHP поддерживает взаимодействие с большим колличеством различных систем управления базами данных. Традиционно PHP используют совместно с MySQL. К примеру, в PHP4 поддержка MySQL даже была обеспечена по умолчанию. Однако, не стоит забывать и про другие СУБД, которые могут быть полезны при решении определенных задач, если функциональные возможности и производительность MySQL недостаточны. Список СУБД, которые официально поддерживаются разработчиками PHP.
MySQL
SQLite
PostgreSQL
Oracle (OCI8)
Microsoft SQL Server
Sybase
ODBC
mSQL
IBM DB2, Cloudscape и Apache Derby
Informix
Ovrimos SQL
Lotus Notes
DB++
DBM
dBase
DBX
FrontBase
FilePro
Ingres II
SESAM
Firebird / InterBase
Paradox File Access
MaxDB
В PHP 5 были произведены некоторые изменения, касающиеся СУБД (MySQL и SQLite).
В PHP 5 больше не входят клиентские библиотеки MySQL по причинам связанным с лицензией и поддержкой. Поддержка MySQL не прекращается, просто теперь она по умолчанию не включена. Эта означает, что для того чтобы включить по умолчанию MySQL необходимо самостоятельно отредактировать php.ini и разкомментировать строку с подключением php_mysql.dll. Эта библиотека включена в установочный пакет под Windows.
Начиная с PHP 5, модуль SQLite встроен в PHP. SQLite - это встраиваемая SQL СУБД, а не клиентская библиотека для соединения с сервером баз данных (таким как MySQL или PostgreSQL). Библиотека SQLite читает и записывает напрямую в файлы базы данных на диске.
MySQL + PHP
Интерфейс программирования приложений(Application Programming Interface или API), описывает классы, методы, функции и переменные, которые ваше приложение должно использовать для выполнения поставленной задачи. В случае PHP, API для доступа к базам данных доступны в качестве расширений PHP.
API может быть процедурным или объектно ориентированным. В процедурном API, для совершения необходимых действий вы вызываете функции, тогда как в объектно ориентированном API вы инстанциируете классы и вызываете их методы.
Если вы пишите PHP приложение, которому необходимо взаимодействовать с базой данных MySQL, то у вас есть несколько API на выбор:
Расширение MySQL
Расширение MySQLi («i» означает улучшенный)
PDO - PHP Data Objects (Объекты данных PHP)
Рекомендуется использовать mysqli или PDO_MySQL. Не рекомендуется использовать старое расширение mysql ,так как оно объявлено устаревшим в PHP 5.5.0 и окончательно убрано в PHP 7.
Возможности расширения MySQLi и PDO
Основное преимущество PDO над MySQLi в поддержке различных драйверов. На момент написания этой статьи, PDO поддерживает 12 различных драйверов, в отличие от MySQLi, который поддерживает только MySQL.
Что это значит? В ситуациях, когда в вашем проекте вы решите поменять базу данных, с PDO этот процесс будет достаточно прозрачным. Итак, все что вам нужно будет сделать, это изменить строку подключения и несколько запросов, если в них используются методы, не поддерживаемые вашей новой базой данных. С MySQLi вам придется переписать каждую строчку кода - включая запросы.
На данном курсе в качестве основного инструмента для подключения к серверу баз данных MySQL используется расширение mysqli
Подключение/отключение
Этот простой пример показывает, как соединиться с базой данных.
$host = "localhost";
$login = "root";
$passwd = "";
$db = "my_database";
// Создание соединения
$conn = mysqli_connect($host, $login, $password, $db);
// Проверка на установление соединенияif (!$conn) {
die("Connection failed: " . mysqli_connect_error());
}
echo"Connected successfully";
//Закрытие соединения
mysqli_close($сonn);
Открытое соединение MySQL и результирующие наборы автоматически удаляются сразу по окончании работы PHP скрипта. Следовательно, закрывать соединения и очищать результирующие наборы не обязательно, но рекомендуется, так как это сразу же освободит ресурсы базы данных и память, занимаемую результатами выборки, что может положительно сказаться на производительности.
Расширение mysqli предоставляет двойной интерфейс программисту. Поддерживаются как процедурная, так и объектно-ориентированная парадигмы программирования.
mysqli расширение весьма схоже с интерфейсом старого расширения, и во многих случаях функции отличаются только префиксом в имени. Некоторые mysqli функции принимают дескриптор соединения первым аргументом, в отличие от соответствующих им функций старого расширения, которые принимают его в качестве последнего необязательного аргумента.
В дополнение к процедурному пользователи могут использовать объектно-ориентированный интерфейс. Документация заточена именно под объектный интерфейс.
Каких-либо принципиальных отличий в производительности между интерфейсами нет.
Выполнение запроса
Отправка запроса к MySQL из PHP сводится к простому вызову функции mysqli_query(), которая принимает два параметра: объект подключения и строку запроса на языке SQL.
....
$query = "SELECT * FROM city";
$result = mysqli_query($conn, $query);
var_dump($result); // возвращает FALSE в случае неудачи
....
В отличие от командной строки MySQL, здесь в конце запроса точка с запятой не нужна, поскольку для завершения запроса используется функция mysqli_query(), которая не может использоваться для запроса, состоящего из последовательно отправляемях частей. Поэтому MySQL знает, что запрос завершен, и не ищет точки с запятой.
Функция mysqli_query() возвращает объект, который содержит результат запроса. В случае неудачи данный объект содержит значение false.
Можно подумать что содержимое переменной $result будет таким же, как тот результат, который возвращался запросом, вводимым в командной строке, с горизонтальныйми и вертикальными линиями, шапкой и т.д. Но в PHP функция mysqli_query() возвращает не такой результат. В случае успешного выполнения запроса переменная будет содержать ресурс(объект), позволяющий извлечь результаты этого запроса.
После возвращения объекта $result его можно использовать для поэлементного извлечения нужных вам данных с помощью имеющейся в PHP функцией mysqli_fetch_assoc().
// запрос к БДif($result = mysqli_query($conn, $query))
if( mysqli_num_rows($result) > 0 ){
printf("<table>");
// результат в виде ассоциативного массиваwhile($row = mysqli_fetch_assoc($result))
printf("<tr><td>%d</td><td>%s</td><td>%s</td><td>%s</td><td>%s</td></tr>", $row["ID"], $row["Name"], $row["CountryCode"], $row["District"], $row["Info"]);
printf("</table>");
}
Функция mysqli_fetch_assoc() возвращает ассоциативный массив, соответствующий результирующей выборке или NULL, если других рядов не существует. Имена полей, возвращаемые этой функцией являются регистро-зависимыми. Эта функция устанавливает NULL-поля в значение NULL PHP.
Существует похожая на mysqli_fetch_assoc() функция. Это функция mysqli_fetch_row(), которая выбирает одну строку данных из результирующего набора и возвращает ее в виде массива, в котором индексы элементов соответствуют номерам столбцов (начиная с 0). Каждый последующий вызов функции будет возвращать массив с данными следующей строки набора или NULL, если строки закончились.
$query = "SELECT * FROM city ORDER BY ID DESC LIMIT 100"; // интересный запрос для вывода последних 100 записей// запрос к БДif($result = mysqli_query($conn, $query))
if( mysqli_num_rows($result) > 0 ){
printf("<table>");
while($row = mysqli_fetch_row($result))
printf("<tr><td>%d</td><td>%s</td><td>%s</td><td>%s</td><td>%s</td></tr>", $row[0], $row[1], $row[2], $row[3], $row[4]);
printf("</table>");