 | Ваше первое (а также второе) PHP-приложение Как было сказано ранее, PHP очень популярен среди языков программирования для Web за счет своей простоты и удобства встраивания в обычный HTML-код (Hypertext Markup Language, язык гипертекстовой разметки). HTML-теги выглядят как <head> и </div>, а PHP-код встраивается в него внутри тегов <? ?>.
Первая PHP-программа Итак, самая простая PHP-программа может выглядеть примерно так, как показано в листинге 4.
Листинг 4. Пример простой PHP-программы
<html>
<head> <title> Hello, World!</title> </head>
<body>
<h1>
<? echo 'Hello, World! ?>
</h1>
</body>
</html>
|
Для запуска этой программы откройте редактор gedit командой sudo gedit /var/www/hello.php и напечатайте приведенный код. Сохраните файл, перейдите к FireFox и введите в адресной строке http://127.0.0.1/hello.php. Вы должны увидеть страницу, сходную с изображенной на рисунке 4. Если это так, то lighttpd и PHP работают правильно.
Рисунок 4. Результат работы PHP-программы "Hello, World!", выданный lighttpd
Вторая PHP-программа
А теперь перейдем к написанию более сложного примера, в котором мы соберем воедино все компоненты LAMP, а база данных MySQL будет хранить некую информацию. Предлагаю создать программу, отображающую всех сотрудников Superheroes, Inc. – аутсорсинговой компании, предоставляющей услуги супергероев. Для этого необходимо проделать следующие шаги:
- Спроектировать и создать базу данных, содержащую таблицу со списком сотрудников.
- Наполнить таблицу некоей информацией.
- Написать PHP-код, соединяющийся с базой данных и выводящий список на Web-странице.
Создание и наполнение базы данных
Приведенный в листинге 5 фрагмент кода, представляющий собой SQL-скрипт, делает следующее:
- Создает базу данных с именем superheroes.
- Создает таблицу с именем members внутри базы данных superheroes.
- Добавляет в таблицу members четыре записи.
- Создает в MySQL пользователя hero и наделяет его правами на чтение и изменение нашей базы данных.
Листинг 5. SQL-скрипт для создания и наполнения базы данных superheroes
DROP DATABASE IF EXISTS `superheroes`;
CREATE DATABASE `superheroes`;
USE `superheroes`;
DROP TABLE IF EXISTS `members`;
CREATE TABLE `members` (
`id` int(11) NOT NULL,
`name` varchar(128) NOT NULL,
`city` varchar(128) NOT NULL,
`superpower` varchar(128) NOT NULL,
`initiated` date NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `id` (`id`),
KEY `name` (`name`)
) ENGINE=MyISAM;
INSERT INTO `members`
(`id`, `name`, `city`, `superpower`, `initiated`)
VALUES
(1,'Бэтмен','Готэм-сити','Детективные способности','1939-05-01'),
(2,'Человек-паук','Нью-Йорк','Паутины','1962-08-01'),
(3,'Красный дьявол','Нью-Йорк, Hell\'s Kitchen','Радиолокация','1964-04-01'),
(4,'Супермен','Метрополис','Сила','1938-06-01');
GRANT ALL ON `superheroes`.*
TO 'hero'@'localhost' IDENTIFIED BY 'shizzle';
|
Как правило, во избежание неразберихи для каждого Web-приложения создают свою базу данных MySQL и используют уникальную учетную запись для доступа. Также никогда не используйте в приложении учетную запись root MySQL, так как неправильное поведение программы может привести к потере всех данных. На практике обычно создают в MySQL другого суперпользователя, а пользователя root удаляют.
Как и раньше, создайте с помощью gedit файл, вставьте в него приведенный фрагмент кода и сохраните под именем superheroes.sql. Далее используйте утилиту командной строки mysql для запуска скрипта. Так как пользователь hero еще не создан, придется выполнить скрипт от MySQL-пользователя root:
$ mysql -uroot -p < superheroes.sql
Enter password: |
Введите ваш пароль для MySQL-пользователя root и нажмите Enter. Чтобы увидеть результат, соединитесь с базой данной уже от имени hero и выведите содержимое таблицы, которое показано в листинге 6.
Листинг 6. База данных Superheroes
$ mysql -uhero -pshizzle superheroes
mysql> select * from members;
-----+----------------+----------------+-------------------------+-------------
| id | name | city | superpower | initiated |
-----+----------------+----------------+-------------------------+-------------
| 1 | Бэтмен | Готэм-сити | Детективные способности | 1939-05-01 |
| 2 | Человек-паук | Нью-Йорк | Паутины | 1962-08-01 |
| 3 | Красный дьявол | Нью-Йорк, | Радиолокация | 1964-04-01 |
| | | Hell's Kitchen | | |
| 4 | Супермен | Метрополис | Сила | 1938-06-01 |
-----+-----------------+---------------+-------------------------+-------------
4 rows in set (0.00 sec)
|
Отлично! База данных готова. Создание Web-страницы В Листинге 7 приведен PHP-код, используемый в нашей Web-странице Листинг 7. PHP-код для создания страницы Superheroes, Inc.
<html>
<head>
<title>
Сотрудники Superheroes, Inc.
</title>
</head>
<body>
<?
if ( ! ( $connection = mysql_connect("localhost", "hero", "shizzle" ) ) ) {
die( 'Возникла ошибка. Проверьте сетевые настройки.' );
}
if ( !mysql_select_db( "superheroes", $connection ) ) {
die( 'Возникла ошибка. Проверьте базу данных и права доступа.' );
}
$query = "select * from members order by name";
if ( ! ( $result = mysql_query( $query, $connection ) ) ) {
die( 'Возникла ошибка. ' . mysql_error() );
}
?>
<table>
<tr>
<th>Имя</th>
<th>Сверхъестественные способности</th>
<th>Город</th>
</tr>
<?
while ($row = mysql_fetch_assoc($result)) {
?>
<tr>
<td><? echo $row{'name'}; ?></td>
<td><? echo $row{'superpower'}; ?></td>
<td><? echo $row{'city'}; ?></td>
</tr>
<?
}
?>
</table>
<?
mysql_close( $connection );
?>
</body>
</html>
|
Наберите этот код в редакторе gedit (или скопируйте и вставьте из браузера) и сохраните в файл под именем /var/www/superhero.php. Запустите Firefox и откройте страницу с адресом http://127.0.0.1/superhero.php. Через мгновение – быстрее, чем пролетит пуля – появится страница появится страница, показанная на рисунке 5.
Рисунок 5. Список доступных контрактников-супергероев
Анализ используемого PHP-кода
Давайте проанализируем наш PHP-код. Для него обычный HTML-текст является как бы контейнером, а PHP-код встраивается в него с помощью тегов <? ?>. Таким образом возможно сочетать HTML- и PHP-код, что мы и сделали для отображения таблицы героев. Приложение соединяется с локальным MySQL-сервером, выбирает базу данных, выполняет запрос и выводит результат. А теперь то же самое, но подробнее:
- Функция
mysql_connect() устанавливает соединение с MySQL-сервером, находящимся на локальной машине (локальную машину принято называть localhost), используя авторизационные данные hero.
- Функция
mysql_select_db() делает базу данных superheroes текущей, поэтому все последующие операции чтения, записи, изменения и удаления будут применены к этой базе данных (до тех пор, пока другая база данных не будет выбрана функцией mysql_select_db()).
- Функция
mysql_query() запрашивает информацию у базы данных. Наш запрос охватывает все столбцы и все строки таблицы, отсортированные по полю имени. mysql_query() возвращает набор результатов (result set) – своего рода указатель на список всех подходящих строк.
- Цикл далее интерпретирует строки набора результатов как ассоциативный массив: индексами массива являются имена – в нашем случае это имена интересующих столбцов. (Вспомните, что в обычных массивах для индекса используется целое число). Например,
$row{'name'} означает содержимое поля name текущей строки.
- После того как весь результат выведен в HTML-таблицу, соединение с базой данных закрывается функцией
mysql_close(). На этом PHP-программа завершается.
Вот и все! Конечно, нашей программе еще очень далеко до Web-страниц Twitter или Mint.com (см. ссылки в разделе Ресурсы), однако мы все же продемонстрировали, что запустить Web-приложение легко и просто (и дешево). Не забывайте, что в Ubunto доступны мириады программ – достаточно одной команды Aptitude.
Усовершенствования и оптимальные методики
Разумеется, по мере усложнения ваших приложений необходимо улучшать их и следовать оптимальным методикам. Вот некоторые из них:
- Описывайте логику и представления раздельно
- Не забывайте об объектно-ориентированном подходе
- Используйте готовые программные среды
Раздельное описание логики и представления
Храните раздельно ваш код (логику) и HTML (представление). Практически во всех языках Web-программирования есть механизмы шаблонов, реализующие это разделение. После инициализации всех пользовательских структур данных управление передается на подсистему шаблонов, которая распознает и отображает содержимое структур. Благодаря шаблонам HTML-код легче воспринимать "на глаз", а работа четко разделяется между разработчиком и дизайнером. Одной из систем шаблонов, широко используемой для PHP, является Smarty. Для Perl популярна система Template Toolkit.
Объектно-ориентированный подход
Все современные языки программирования так или иначе поддерживают объекты. Имея опыт работы с C++ или Smalltalk, вы без труда найдете язык для Web-программирования с поддержкой ООП. Например, Perl обладает весьма гибким синтаксисом, а его девиз – "все можно сделать несколькими способами". И напротив, существуют и весьма строгие языки, такие как Python, в котором символ пробела является неотъемлемой частью синтаксиса.
Готовые программные среды
Подумайте об использовании готовых программных сред – в большинстве случаев "изобретать велосипед" не нужно. Программная среда может представлять собой просто набор классов, а может включать полный набор принципов, утилит и технологий, являющихся плодом творения других людей и ускоряющих ваш путь к рынку. Осмотритесь вокруг – быть может, вы сначала найдете подходящую программную среду, которая, в свою очередь, определит выбор языка программирования.
Одна из программных сред – Ruby on Rails – фактически приобщила тысячи программистов к языку Ruby. Скриптовый язык Ruby обладает мощью Perl, объектно-ориентированными средствами Java и кратким синтаксисом Python. Если вы собираетесь заняться Web-разработкой на Open Source, вам стоит взглянуть на Ruby on Rails.
|  |