Наши партнеры








Книги по Linux (с отзывами читателей)

Библиотека сайта rus-linux.net

PHP и MySQL - рабочие инструменты сайтостроителя

Сергей Лосев < slosev@hardnsoft.ru>

Часть 1 (настоящий выпуск). Первое знакомство с PHP и MySQL

    Вводная часть знакомит с инструментами PHP и MySQL.

Часть 2. Кругом новости, но как их ввести и отобразить?

    Как PHP и MySQL применяются при вводе, хранении и отображениии новостей?

Часть 3. Статьи для сайта - это и текст, и иллюстрации, и таблицы

    PHP и MySQL для ввода и макетирования статьи.

Часть 4. Дополнительные сервисы

    Использование PHP и MySQL для создания форумов, голосований и отзывов к материалам.

Если раньше Web-мастеров в первую очередь волновали вопросы оформления страниц (какой редактор выбрать для верстки Web-страниц, применять ли модные <навороты> и т.п.), то сегодня на первый план выходят проблемы внутренней структуры сайта. Она должна быть такой, чтобы можно было изменить внешний вид сайта в соответствии с новыми шаблонами, не переверстывая десятки и сотни гипертекстовых файлов. Сегодня в моде так называемый инфодизайн - дизайн с минимальным количеством графических элементов оформления, но с понятной структурой, удобными навигацией по разделам и администрированием, а также с дополнительными сервисами (например, представлением документов в форматах для просмотра на экране и для печати, поиском информации на сайте, добавлением отзывов к статье и пр.).

Ни одну из этих задач невозможно решить без применения системы управления базами данных вместе со скриптовыми языками, исполняемыми на Web-сервере. Конечно, можно возразить, что, во-первых, Web-серверы понимают инструкции SSI (Server Side Include), в которых предоставляются команды для включения вспомогательных файлов в главный (обычно это index.html или index.shtml), а во-вторых, даже применяя скриптовые языки, всю информацию можно хранить в виде обыкновенных текстовых файлов, а затем обрабатывать ее построчно или даже пословно. Однако первый способ не позволяет создавать по настоящему динамические информационные ресурсы, а недостатки второго проявляются при увеличении объемов хранящейся на сервере информации. Нужные сведения с каждым разом становится все сложнее находить, обрабатывать и отображать.

СУБД понимают язык запросов SQL независимо от того, под управлением какой операционной системой они и Web-сервер работают. Хотя и есть определенные нюансы в использовании команд SQL различных баз данных, но зачастую они сводятся к различию в синтаксисе некоторых команд и их опциях; троица же ключевых команд - SELECT, INSERT и UPDATE, которые служат для выбора, добавления и обновления информации, обычно стандартна.

В этой статье из цикла, посвященного современному <сайтостроению>, мы поговорим о популярной системе MySQL и языке программирования PHP, а также рассмотрим, как с их помощью можно решать задачи, с которыми сталкивается любой разработчик Интернет-сайта: подготовка и отображение новостей, ввод и отображение текстовой информации, поиск на сайте, организация дополнительных сервисов (<узнавания> посетителя, форумов, опросов и т.д.). Оба эти средства являются бесплатными и предоставляются всеми без исключения хостинг-провайдерами.


Конкретная задача - конкретные инструменты

Поскольку журнал Hard'n'Soft является компьютерным изданием, пусть создаваемый сайт будет посвящен компьютерам, программному обеспечению и информационным технологиям. В качестве примера будет рассматриваться гипотетический сайт, включающий три ключевых раздела: новости, каталог программ и статьи. Отметим, что, прежде чем проектировать новый информационный ресурс, следует провести определенные исследования, подготовить, хотя бы в тезисном виде, бизнес-план, найти коллег, партнеров, которые помогут поддерживать ресурс в работающем состоянии, хостинг-провайдера, обеспечивающего приемлемые условия для функционирования сайта (с учетом планируемого трафика, канала и прочих факторов). Впрочем, рассмотрение всех этих маркетинговых и организационных мероприятий выходит за рамки статьи. Мы же сосредоточимся на главном - проектировании и разработке скриптов для функционирования сайта.

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

Для создания прототипа такого сайта можно воспользоваться любым редактором - это может быть даже обыкновенный <Блокнот>, хотя при быстром макетировании сайта лучше все-таки работать с WYSIWYG-редакторами - все равно три четверти содержимого созданного гипертекстового файла будет изменено. Помимо общего дизайна следует подготовить и так называемую таблицу стилей, которая будет использоваться для оформления таблиц, заголовков, абзацев и ссылок на сайте. При создании шаблона главной страницы можно задействовать и графические элементы оформления: линии, отделяющие столбцы друг от друга, заголовки разделов, фон страницы и ячеек. Кроме того, следует определиться с последовательностью отображения информации. В принципе, даже для очень сложного сайта с десятками различных разделов достаточно одной-единственной страницы, поскольку ей (вернее, скрипту, который исполняется на сервере) можно передавать параметры. Так, указав ссылку
index.php3?content=news
или
index.php3?content= article,
можно из <кусочков> кода собрать соответственно страницу новостей или страницу для просмотра материалов. Если для представления разделов сайта используются отдельные гипертекстовые файлы, то каждый из них должен быть оформлен в едином для сайта стиле. Поэтому index.html или index.php3 следует разбить на части и поместить заголовок страницы в один файл, скрипты, формирующие новости - во второй, а статьи - в третий и т.д.

Определившись с примерным шаблоном страницы (это, впрочем, не означает, что он в дальнейшем не будет меняться), следует приступить к разработке его <внутренностей>. Выбор языка PHP обусловлен тем, что это совсем несложное в изучении средство с синтаксисом, напоминающим C, но более простое в использовании. Его удобство заключается еще и в том, что код скриптов на PHP располагается непосредственно внутри гипертекстового файла, а соответствующий модуль на сервере, перед тем как передать данные на клиентскую машину, попросту выполняет инструкции PHP, заменяя их тегами HTML. Аналогичный способ используется и в системах Active Server Page и ColdFusion, с которыми читатели Hard'n'Soft уже знакомы. Но главное преимущество PHP в его доступности - для использования всех без исключения средств языка не нужно оплачивать лицензии. Более того, PHP распространяется методом Open Source, и вместе с интерпретатором можно загрузить и его исходный код.

PHP существует для многих платформ - Linux, FreeBSD, Windows, так что для создания сайта совершенно необязательно искать операционную систему Linux, устанавливать и настраивать ее. Версии PHP для Windows и Linux полностью идентичны друг другу - отладив скрипты в одной системе, можно без проблем запускать их в другой. То же самое касается и серверной СУБД MySQL, и Web-сервера Apache. Далее мы будем рассматривать работу в среде Windows.

По большому счету для отладки сайта в локальном режиме подойдет любой персональный Web-сайт, позволяющий обрабатывать нестандартные типы файлов (а файлы типа PHP3 или PHTML являются нестандартными), - он может быть создан на основе Personal Web Server, Internet Information Server, Apache или других свободно распространяемых программ. Для подключения к такому сайту PHP следует, во-первых, установить соответствие между файлом и приложением, во-вторых, сообщить Web-серверу о том, что соответствующий тип данных должен предварительно обрабатываться специальным препроцессором, и, в-третьих, указать, что файл index.php3 (или index.phtml) является основным. Кроме того, в настройках Web-сервера задается местоположение гипертекстовых файлов на жестком диске (для этого лучше завести отдельный каталог).

Настройка системы управления базами данных MySQL выполняется чуть сложнее. После ее установки на жесткий диск нужно составить несложный BAT-файл с двумя командами (первая служит для подавления выдачи сообщений на экран, вторая запускает базу данных с указанием, в каком каталоге планируется хранить данные):

@echo off
c:\mysql\bin\mysqld.exe
-- basedir c:/mysql


Этот BAT-файл следует запускать каждый раз в начале работы локального Web-сервера. Для удобства его можно поместить непосредственно на рабочий стол Windows.

В завершение работ по настройке следует включить загрузку библиотеки функций для обслуживания MySQL. В Windows для этого необходимо открыть файл PHP3.INI и убрать значок комментария (точку с запятой) для PHP3_MYSQL. DLL в разделе загружаемых модулей. После этого можно приступать к использованию PHP и MySQL.


Что может PHP

PHP - язык написания скриптов, которые встраиваются непосредственно в гипертекстовые файлы и исполняются на Web-сервере. Программа на PHP заключается в теги , а интерпретатор обрабатывает команды между этой парой тегов и формирует окончательный файл, передающийся на локальную машину. Как уже упоминалось, язык PHP довольно простой и основные его конструкции (циклы, условия, функции) напоминают С.

В настоящее время выпущена четвертая версия PHP с улучшенными производительностью и возможностями. Так, в PHP 4 появились сессии, подобные Active Server Page и позволяющие манипулировать данными в течение всего сеанса доступа пользователя, расширены встроенные функции системы. Вместе с тем предыдущая, третья версия языка применяется достаточно широко, что объясняется ее прекрасной совместимостью с основными серверами реляционных систем управления базами данных (в PHP 4 на момент его выхода существовали проблемы совместимости с СУБД Interbase).

Пользователи, хотя бы немного знакомые с языком С, без проблем смогут работать и с PHP. Действительно, как и в С, каждая конструкция PHP заканчивается точкой с запятой, блоки программ выделяются фигурными скобками, для операций присваивания используется знак равенства (<=>), а для сравнения - двойное равенство (<==>). Язык поддерживает унарные операции, наподобие <++>, <-=>, <+=> и др. Помимо большого числа встроенных функций для работы со строками, числами, датами, файлами и массивами можно объявлять дополнительные функции при помощи ключевого слова function. К особенностям PHP, пожалуй, относится формат записи переменных и массивов - каждый идентификатор переменной начинается со значка $.

Функции в PHP применяются так же, как и в аналогичных алгоритмических языках, хотя в большинстве конкретных областей применения PHP можно обойтись без функций. Их объявление и использование оказываются оправданными только в очень сложных случаях. PHP поддерживает рекурсивный вызов функций, но, поскольку эта система все-таки интерпретирующая, чрезмерная вложенность вызовов приведет к исчерпанию памяти и аварийному завершению скрипта (в окне Web-броузера появятся соответствующие сообщения об ошибке). Примеры рекурсивных функций, которые могут использоваться на сайте, мы рассмотрим, когда речь пойдет о форумах - вывод записей форума проще всего запрограммировать при помощи небольшой рекурсивной процедуры.

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

// переменной $myvar присваивается строковое выражение
$myvar=<filename.txt>;
// переменная $myvar преобразуется в массив, каждый элемент которого - отдельная строка файла
$myvar=File($myvar);
// переменной $myvar присваивается числовое значение
$myvar=0;


Массивы автоматически создаются при загрузке содержимого файла или при чтении строки таблицы, но их можно объявлять и при помощи функции array(), например:

$a=array();
$a[1]=<январь>;
$a[2]=<февраль>;
:
:
$a[12]=<декабрь>;


В квадратных скобках указывается индекс массива. Если он опускается, то массив считается динамическим. Так, можно написать:

$b=array(); $b[]=1;
$b[]=2;
$b[]=3;
$b[]=4;


При этом в элементе $b[0] будет храниться значение 1, а в $b[2] - значение 3.
Для вывода значений в PHP используются операторы echo, print и функция printf(). Как правило, конструкции echo и print делают одно и то же, а функция printf(), помимо выдачи строковых значений, выполняет их форматирование, например:

$name=<Петров>;
$name1=<Петр>;
print <<table>>;
printf(<<tr><td>%s</td><td>%s</td></tr>\n>, $name, $name1);
print <</table>>


PHP тесно интегрирован с Web. Это, в частности, означает, что вносимые в формы значения, передаваемые гипертекстовому файлу параметры или <печенья> (cookies), сохраненные Web-броузером, автоматически конвертируются в переменные. Так, описав в форме поле ввода <input type=<text> name=<pdate> size=<12> value=<дата>>, в скрипте можно манипулировать переменной $pdate. Интеграция с Web позволяет создавать динамические Web-страницы, зависящие от некоего параметра, например гиперссылки, по которой перешел пользователь, или введенного в форму значения. Скажем, задав в файле список тем опросов, можно вывести их в традиционной для сайтов форме.

<form method=<POST> action=<dovotes.php3>>
<?
$votefile=File(<votes.txt>);
for ($i=0; $i<count
($votefile); $i++)
{
print <<p><input type=radio name=iselect value= $votefile[$i]>>;
}
?>
<center><input type=<submit> value=<Готово> name=<B1>></center>
</form>


Почему выбрана MySQL

PHP поддерживает множество реляционных баз данных, в том числе Informix, Oracle, Sybase и др. Тем не менее немало скриптов на PHP используют сравнительно небольшую и компактную СУБД MySQL, совместимую с ANSI SQL и обеспечивающую высокую производительность. Типы данных, которые можно хранить в таблицах, включают целочисленные и вещественные значения различной разрядности, фиксированные и динамические строки, даты, Blob-поля для хранения произвольных данных (например, графических изображений). MySQL является реляционной СУБД и в SQL-запросах позволяет связывать таблицы по общим полям, поддерживает индексы, автоинкрементные поля, а также множество функций для преобразования данных.

В документации, которой комплектуются версии MySQL как для Windows, так и для Linux, отражены различные нюансы использования СУБД. К тому же для нее разработаны самые разнообразные надстройки, предоставляющие графический или Web-интерфейс для манипуляции данными - создания таблиц, добавления и редактирования в них записей, отбора нужных строк. Скажем, с помощью системы phpMyAdmin, написанной целиком на PHP и соответственно поставляемой в исходных текстах, можно подготовить структуру таблиц, ввести начальные значения вручную или из текстового файла специального формата, а также проверить работоспособность SQL-запросов.


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

Все функции, обеспечивающие взаимодействие между PHP и MySQL, вынесены в отдельную библиотеку, указываемую в настройках интерпретатора скриптов. Последовательность шагов для подключения к базе данных и управления табличными данными традиционна - сначала устанавливается связь, потом выдается запрос и обрабатывается результат. Для подключения к базе данных нужны три параметра: имя хост-узла, имя пользователя и пароль. Определив три переменные: hostname, username и password, можно затем отбирать нужные данные, как показано ниже в несложном примере:

if (!mysql_connect(hostname, username, password))
{ print <ошибка!>; exit; }
$r=mysql_db_query(dbname,


В функции mysql_db_query() указываются имя базы данных и необходимый SQL-запрос, который передается MySQL. В запросе можно использовать объявленные в скрипте переменные. Строковые значения и даты, обычно заключаемые в кавычки, обрамляются апострофами или специально предусмотренными в PHP обозначениями \<символ>, например \n - перевод строки, \'' - кавычка.

Результат исполнения запроса возвращается в переменной $r, однако, если SQL-команды записаны неправильно, в эту же переменную возвращается значение -1. Получить значения отдельных полей позволяет функция mysql_fetch_array(), при этом автоматически создается массив:

$f=mysql_fetch_array($r);
print <<p>$f[title]> // содержимое поля title
print <<p>$f[author]> // содержимое поля author
print <<p>$f[articletext]> // текст статьи из поля articletext


Ознакомившись с общими принципами работы PHP, можно переходить к созданию скриптов, обеспечивающих работу сайта. В следующей части будут приведены <рецепты> по созданию модулей для новостной ленты, касающиеся ввода новостей, выбора способа их хранения, отображения календаря и др., а также описаны возникающие при этом подводные камни.