mysql04 35

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

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

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

  1. Подключение к установленной базе данных MySQL.

  2. Использование команды USE в отношении нужной базы данных MySQL.

  3. Отправка SQL базе данных.

  4. Получение результатов.

  5. Обработка результатов.

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

Расширения 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 является устаревшим.

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

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

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

Файл connect.php
<?php
	error_reporting(0);
	$db_host = 'localhost';
	$db_user = 'root';
	$db_password = '';
	$db_name = 'users';
	
	$link = mysqli_connect($db_host, $db_user, $db_password, $db_name);
	if (!$link) {
    	die('<p style="color:red">'.mysqli_connect_errno().' - '.mysqli_connect_error().'</p>');
	}
		
	echo "<p>Вы подключились к MySQL!</p>";

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

Файл index.php
<?php
	require_once 'connect.php';
?>
<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
<title>Основы PHP и MySQL</title>
</head>

<body>
</body>
</html>

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

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

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

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

Код PHP
<?php
	require_once 'connect.php';
	
	$result = mysqli_query($link, "SELECT * FROM customers;");
	
	echo '<p>Все пользователи: </p><ul>';
	while ($row = mysqli_fetch_row($result)) {
		echo "<li>Имя: {$row[1]}</li>";
	}
	echo '</ul>';
?>
<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
<title>Основы PHP и MySQL</title>
</head>

<body>
</body>
</html>

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

"Кракозябры" при выводе данных из базы с другой кодировкой

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

Код PHP
<?php
	error_reporting(0);
	$db_host = 'localhost';
	$db_user = 'root';
	$db_password = '';
	$db_name = 'users';
	
	$link = mysqli_connect($db_host, $db_user, $db_password, $db_name);
	if (!$link) {
    	die('<p style="color:red">'.mysqli_connect_errno().' - '.mysqli_connect_error().'</p>');
	}
	
	mysqli_query($link, "SET NAMES utf8");
		
	echo "<p>Вы подключились к MySQL!</p>";

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

Правильное переключение кодировки

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

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

Код PHP
<?php
	require_once 'connect.php';
	
	// Определим собственный класс исключений для ошибок MySQL
	class MySQL_Exception extends Exception {
		public function __construct($message) {
			parent::__construct($message);
		}
	}
	
	try {
    	// Запрос к базе данных
		$result = mysqli_query($link, "SHOW TABLES");
        
		// В случае неудачного запроса генерируем исключение
		if (!$result) throw new MySQL_Exception(mysqli_error($link));
			
		// Отображаем результаты
		echo '<p>Таблицы, имеющиеся в базе данных: </p><ul>';		
		while ($row = mysqli_fetch_row($result)) {
			echo "<li>Таблица: {$row[0]}</li>";
		}
		echo '</ul>';
	}
	catch (Exception $ex) {
		echo 'Ошибка при работе с MySQL: <b style="color:red;">'.$ex->getMessage().'</b>';
	}
?>
<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
<title>Основы PHP и MySQL</title>
</head>

<body>
</body>
</html>

Здесь используется еще одна новая для вас функция перехода от 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() позволяющую осуществить выборку из базы данных информации, содержащейся в указанных строках, таким образом, чтобы каждая строка вывода содержала данные из одной строки или информацию, связанную с уникальным идентификатором (если таковой имеется). Для доступа к элементам массива с числовым индексом применяются обозначения в виде целых чисел в квадратных скобках, называемых смещениями полей. Следует помнить, что такие смещения всегда начинаются с целочисленного нуля. А если в ходе доступа отсчет начат с единицы, то будет пропущено значение из первого столбца.

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

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

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

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

Файл connect.php
<?php
	//error_reporting(0);
	$db_host = 'localhost';
	$db_user = 'root';
	$db_password = '';
	$db_name = 'users';
	
	$link = new MySQLi($db_host, $db_user, $db_password, $db_name);
	if ($link->connect_error) {
    	die('<p style="color:red">'.$link->connect_errno.' - '.$link->connect_error.'</p>');
	}
	
	$link->query("SET NAMES utf8");
		
	echo "<p>Вы подключились к MySQL!</p>";
Исходный файл
<?php
	require_once 'connect.php';
	
	// Определим собственный класс исключений для ошибок MySQL
	class MySQL_Exception extends Exception {
		public function __construct($message) {
			parent::__construct($message);
		}
	}
?>
<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
<title>Основы PHP и MySQL</title>
<style>
/* Стилизация таблиц */
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 { border-bottom-width:1px }
</style>
</head>

<body>
<?php
	try {
		// Запрос к базе данных
		$result = $link->query('SHOW TABLES');
        
        // В случае неудачного запроса генерируем исключение
		if (!$result) throw new MySQL_Exception($link->error);
		
		// Пример вставки данных в таблицу
		$link->query("INSERT INTO customers VALUES (NULL, 'Андрей', 'Петров', '+7-920-555-55-55')");
			
        // Отображаем результаты			
		echo '<p>Таблицы, имеющиеся в базе данных: </p>';		
		while ($row = $result->fetch_row()) {
			// Усложним задачу отобразив структуру таблиц
			echo "<table><caption> {$row[0]} </caption><tr>";
			
			// Получить названия столбцов
			$result1 = $link->query("SELECT * FROM {$row[0]}");
			if (!$result1) throw new MySQL_Exception($link->error);
			
			for($i = 0; $i < $link->field_count; $i++)
			{
				$field_info = $result1->fetch_field();
				echo "<th>{$field_info->name}</th>";
			}
			
			echo '</tr>';
			
			// Получить данные
			while ($row1 = $result1->fetch_row()) {
				echo '<tr>';
				foreach($row1 as $_column) {
					echo "<td>{$_column}</td>";
				}
				echo "</tr>";
			}
			
			echo '</table>';
		}
	}
	catch (Exception $ex) {
		echo 'Ошибка при работе с MySQL: <b style="color:red;">'.$ex->getMessage().'</b>';
	}
?>
</body>
</html>

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

Пример использования классов mysqli - вывод структуры базы данных
Проектирование базы данных
Базы данных и веб-формы

Комментарии (0)

Результаты поиска по запросу

Система Orphus