PHP и СУБД

PHP поддерживает взаимодействие с большим колличеством различных систем управления базами данных. Традиционно PHP используют совместно с MySQL. К примеру, в PHP4 поддержка MySQL даже была обеспечена по умолчанию. Однако, не стоит забывать и про другие СУБД, которые могут быть полезны при решении определенных задач, если функциональные возможности и производительность MySQL недостаточны. Список СУБД, которые официально поддерживаются разработчиками PHP.

В 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 на выбор:

Рекомендуется использовать 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_connect
mysqli_close
mysqli_connect_errno
mysqli_connect_error

Процедурный и объектно-ориентированный интерфейс

Расширение 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() возвращает не такой результат. В случае успешного выполнения запроса переменная будет содержать ресурс(объект), позволяющий извлечь результаты этого запроса.

mysqli_query
mysqli_errno
mysqli_error

Извлечение результата

После возвращения объекта $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() →

Функция 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>");
					
				

Извлечение результата функцией mysqli_fetch_row() →

mysqli_fetch_assoc
mysqli_num_rows
mysqli_fetch_row