Скачиваний:
1
Добавлен:
01.05.2025
Размер:
254.98 Кб
Скачать

Select single

Тэг SELECT SINGLE - это то же самое, что и Select, но на экране пользователь видит одновременно несколько элементов выбора (три по умолчанию). Если их больше, то предоставляется автоматический вертикальный скроллинг. Количество одновременно отображаемых элементов определяется атрибутом SIZE. Пример:

<FORM>
<SELECT SINGLE NAME=group SIZE=4>
<OPTION> AT 386
<OPTION> AT 486
<OPTION> AT 586
<OPTIONS> Pentium PRO
</SELECT>
</FORM>

Select multiple

Тэг SELECT MULTIPLE похож на тэг SELECT SINGLE, но пользователь может одновременно выбрать более чем один элемент списка. Атрибут SIZE определяет количество одновременно видимых на экране элементов, атрибут MULTIPLE - максимальное количество одновременно выбранных элементов. Пример:

<FORM>
<SELECT SINGLE NAME=group SIZE=4 MULTIPLE=2>
<OPTION> AT 386
<OPTION> AT 486
<OPTION> AT 586
<OPTIONS> Pentium PRO
</SELECT>
</FORM>

Если выбрано одновременно несколько значений, то серверу передаютс соответствующее выбранному количество параметров NAME=VALUE с одинаковыми значениями NAME, но разными VALUE.

Отправление файлов при помощи форм

Формы можно использовать для отправки не только небольших информационных сообщений ввиде параметров, а также и для отправки файлов.

Внимание! Поскольку данная возможность требует поддержки получения файлов WEB - сервером, то, соответственно, необходимо, чтобы сервер поддерживал получение файлов!

Например:

<FORM ENCTYPE="multipart/form-data" ACTION="url" METHOD=POST>
Отправить данный файл: <INPUT NAME="userfile" TYPE="file">
<INPUT TYPE="submit" VALUE="Отправить файл">
</FORM> <FORM action="http://pandemonium.cs.nstu.ru/~gun/docs/sites.htm" encType="multipart/form-data" method="post">
Отправить данный файл: <INPUT name="userfile" type="file">
<INPUT type="submit" value="Отправить файл">
</FORM>

Установка PHP на локальный компьютер

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

1. Веб-сервер Apache

Программа, которая исполняет функции http-сервера. Именно с ее помощью и будет функционировать веб-сервер. Эта программа исполняет все необходимые функции, под ее руководством работает большинство ресурсов сети. Наш не исключение, в силу гибкости и универсальности Apache мы будем использовать именно этот сервер. В дальнейшем вы увидите, насколько просто использовать эту программу в домашних условиях и насколько широкие возможности она предоставляет.

2. Язык PHP

Непосредственно сам PHP, с которым мы будем работать. Именно эта программа даст вам возможность использовать PHP-скрипты на сайтах, созданных в рамках сервера Apache. В качестве версии я сразу выбираю PHP4, как наиболее перспективную и стабильную версию. Кроме того, эта версия содержит богатые возможности по сравнению с предыдущими, которыми мы также будем пользоваться в дальнейшем.

Для работы сервера и всех наших дальнейших проектов целесообразно выделить отдельный диск на вашем компьютере. Конечно, вам не придется покупать новый винчестер, нам вполне хватит возможностей виртуального диска. Что такое виртуальный диск? Это имитация жесткого диска в системе. Если вы знакомы с возможностями MS-DOS, то уже поняли, что я имею в виду. Виртуальный диск имеет свое, отдельное имя в системе (например, диск F:) и в качестве своего корневого каталога использует обычный каталог на основном диске. Создается виртуальный диск следующей командой:

subst F: C:\server

Где F: - это имя виртуального диска, а C:\server - это папка на основном диске, которая и будет корневым каталогом нового диска F. Теперь давайте создадим новый диск. Для этого выполните следующие действия:

Создайте на диске C: папку "server".

Откройте в Windows меню "выполнить", которое находиться кнопке "Пуск" и наберите строчку "subst F: C:\server". При этом должно открыться окно с корневым каталогом вашего нового диска.

Обратите внимание, что как здесь, так и дальше я буду использовать именно диск F: в качестве сервера и папку C:\server в качестве корневого каталога этого диска. Я настоятельно советую вам использовать именно эти параметры, чтобы в дальнейшем не было путаницы. В следующих уроках я буду исходить из того, что у вас все настроено именно так.

Готово? Тогда давайте продолжим установку. Первое, что нам необходимо совершить - это установить веб-сервер Apache. Программа, которую вы загрузили, является установщиком и сама копирует все необходимые файлы. Однако дальше не все так гладко и не достаточно будет просто завершить все шаги установки. Чтобы установить сервер именно так, как нам требуется, давайте действовать следующим методом.

Установка Apache

Запускаем файл установки Apache. После запуска установщика нажимаем кнопку "NEXT" и "YES", пока не дойдет очередь до указания пути установки. По умолчанию записан путь "C:\Program Files\Apache Group\Apache". Это нас абсолютно не устраивает - нужно установить Apache на свежевыделенный диск F. Для этого нажимаем "Browse" и указываем путь "f:\usr\apache" (если такого каталога нет, система спросит нужно ли его создать, на что отвечайте утвердительно). Почему именно "F:\usr\apache"? Дело в том, что каталог "usr" на сервере является служебным, лежащим отдельно от каталогов, где размещаются файлы сайтов и прочие элементы сервера. Каталог "usr" на сервере - это вроде каталога "Windows\System" в Windows. Далее вы еще столкнетесь с этим каталогом при администрировании вашего сервера. Нажимаем "NEXT", выбираем "Typical" - обычная установка. Ждем еще пару раз "NEXT" и сервер наконец устанавливается на наш компьютер, выполняя копирование файлов. Все! Вы только что установили на свой компьютер свой персональный сервер, на котором можете создавать неограниченное количество сайтов с неограниченными возможностями.

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

Установка PHP

Продолжим. Теперь нам нужно установить PHP. Вы имеете файл, загруженный с официального сайта PHP. Это уже не установщик - это обычный ZIP-архив. Создайте в том же каталоге "F:\usr\" папку "php" и разархивируйте его в получившийся каталог "F:\usr\php".

Теперь посмотрите содержимое каталога "F:\usr\php". Вы видите файл php.exe и наряду с ним папки ddl, extensions, java, Mibs и т.п.? Да? Отлично! Поздравляю, PHP готов исполнять ваши команды. Осталось только познакомить Apache с PHP - они, кстати, образуют отлично работающую пару.

Настройка сервера Apache и PHP

С установкой программ покончено. Теперь перейдем к их настройке. В первую очередь вам нужно найти файл "php.ini-dist" в каталоге "F:\usr\php" и скопировать его в папку C:\Windows, причем переименовать его на новом месте в файл "php.ini". В итоге у вас должен получиться файл "C:\Windows\php.ini". Оставим его как есть, ничего в нем не изменяя и перейдем к настройке Apache. Здесь все немного сложнее.

Открываем файл "F:\usr\apache\conf\httpd.conf" в каком-нибудь текстовом редакторе, например "Блокноте". Это очень важный файл, который содержит все настройки вашего сервера. В нем необходимо задать несколько параметров. Начнем.

1. Найдите в файле httpd.conf строчку "#ServerName new.host.name". Измените ее на строчку "Servername localhost". Обратите внимание, что знак "#" в начале строки убирается.

2. Далее найдите строчку "DocumentRoot "f:/usr/apache/htdocs" и измените ее на "DocumentRoot "f:/project/www". Обратите внимание на _отсутсвие_ слеша вконце.

3. Теперь найдите строчку "<Directory "f:/usr/apache/htdocs">" и измените ее на "<Directory "f:/project/www">. Слэш опять отсутсвует.

4. Также найдите и измените строку "ErrorLog logs/error.log" на строку "ErrorLog F:/project/logs/error.log" и строку "CustomLog logs/access.log common" на "CustomLog F:/project/logs/access.log common".

5. Теперь перейдите в самый конец файла httpd.conf и впишите в него такие строчки:

ScriptAlias /php/ "f:/usr/php/"

AddType application/x-httpd-php .php .phtml .php4

Action application/x-httpd-php "/php/php.exe"

Эти строчки добавляют в настройки Apache возможность выполнения файлов с расширением .php, .phtml или .php4 как программ, написанных на PHP (php скриптов).

6. Ну а теперь создайте каталог "F:\project", и в нем два каталога "www" и "logs". В итого вы должны получить такое дерево каталогов:

F:\project

F:\project\www

F:\project\logs

Все! Поздравляю, вы установили и настроили полноценный http-сервер с поддержкой PHP. Теперь дело за малым - научиться включать и выключать сервер, а также немножко его протестировать. Этим мы и займемся далее.

Работа с сервером Apache

При инсталляции сервера программа установки создала в Главном меню (Кнопка "Пуск", далее "Программы") папку "Apache Web Server". В этой папке находиться несколько ярлыков. Нам потребуются следующие из них:

Start Apache - для запуска сервера

Stop Apache - для остановки сервера

При желании вы можете скопировать их на Рабочий стол, чтобы иметь возможность быстро запускать и выключать сервер.

Двигаемся далее и подходим к самому главному моменту - запуску сервера. Если вы произвели все указанные действия, то этот этап Вы точно преодолеете без проблем. Но перед запуском я хотел бы предложить вам сделать еще кое-что, чтобы наверняка протестировать работу вашего сервера.

Итак, создайте в папке "F:\project\www\" файл с именем "index.html" следующего содержания:

<html>

<head><title>Главная страница сервера</title></head>

<body bgcolor=#ffffff>

Поздравляю Вас, сервер работает!<br>

Протестируйте PHP: <a href="test.php">test.php</a>

</body>

</html>

Создайте там же файл с именем "test.php" такого содержания:

<?

echo phpinfo();

?>

Открывайте ваш броузер и набирайте в нем адрес "http://127.0.0.1". Вы должны увидеть уже набранное приветствие, т.е. код файла "index.html". Перейдите по ссылке, ведущей к файлу "test.php". Что вы видите? Броузер должен вывести довольно большой файл с кучей различных обозначений и гордым заголовком "PHP Version 4.0.6" вместе в логотипом PHP. Это - результат работы нашего маленького скрипта "test.php", а точнее функции phpinfo(), которую мы в нем написали. Эта функция выводит все параметры PHP, установленного в системе.

Первая программа на PHP

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

Шаг 1.

Для редактирования файлов вам понадобиться "Блокнот". На первых порах его будет более чем достаточно. Итак, открывайте "Блокнот" и записывайте в нем следующий код:

<?

echo "<b>Hello, world!</b>";

print "<p>PHP работает. Поздравляю вас!";

?>

Шаг 2.

Сохраняйте файл с именем "1.php" в папке "F:\project\www\1.php".

Шаг 3.

Запускайте Apache и наберите адрес нового скрипта, а именно http://127.0.0.1/1.php. Работает? Замечательно! Если нет, проверьте написание скрипта. Все должно быть написано в точности как в моем примере.

Ну а теперь давайте разберем программу на PHP. Посмотрите на скрипт - видите, он начинается и заканчивается символами "<?" и "?>" ? Это первое и обязательное условие. Весь PHP код, который содержится в скрипте, должен выделяться этими знаками. Они означают начало и конец кода, который нужно обработать.

Далее вы видите строку echo "<b>Hello, world!</b>";

echo - это функция, которая выводит любую информацию на экран. За ней в двойных кавычках идет строка, которую echo печатает. Следующая строчка похожа, только вместо echo используется print. Эта функция также выводит информацию на экран и ничем не отличается от echo. Вот вам пример двух, пожалуй, самых главных функций PHP.

Собственно, то что вы увидели в броузере и есть результат выполнения этих двух команд. Это - выведенные ими две строчки html кода. Правда, просто? Я и обещал, что не будет ничего сложного.

Структура, синтаксис и основные элементы программы

Программа на PHP всегда оформляется с учетом определенных требований языка. Это называется синтаксисом. Синтаксис программы это правила, по которым пишется программа, разделяются и оформляются различные ее элементы. В этом разделе я расскажу вам об основных элементах программы и их оформлении. Также вы узнаете как правильно оформлять программу на PHP и для чего это нужно.

Структура программы

Как вы уже знаете, в скрипте PHP код выделяется значками "<?" и "?>". Однако вся прелесть программы PHP в том, что это не обязательно должен быть чистый PHP код. Это может быть простой текст (обычно html код), с любым количеством блоков PHP кода (<? ... ?>) в любых местах и любом виде. Это позволяет обрабатывать не весь файл целиком, а только некоторые его участки, а остальное выводить как есть. Например, представьте страничку сайта, где 10 КБ html кода, а с помощью PHP выводиться только текущая дата. Было бы неприятно, если из-за даты пришлось бы печатать все 10 КБ с помощью echo() или print(). Но возможности PHP нас от этого избавляют, позволяя вставить всего одну строчку, которая будет печатать дату именно там, где нам нужно.

Это чрезвычайно удобно, в будущем вы обязательно оцените это. Выглядит это примерно так:

Просто текст.

<?

echo "А это уже PHP";

?>

Как видите, вы вольны использовать файл с расширением ".php" как вам угодно. Он может даже вообще не содержать участков php кода.

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

То есть, программа такого вида:

<?

echo "Строка 1";

echo "Строка 2";

echo "Строка 3";

?>

и такого вида:

<?echo "Строка 1";echo "Строка 2";

echo "Строка 3";?>

...является одним и тем же скриптом.

Зато имеет огромное значение символ ";" (точка с запятой). Это обязательный символ, который должен стоять в конце каждого оператора. Символ ";" закрывает оператор программы, при его отсутствии вы будете получать ошибку. Обычно PHP будет сообщать что-то вроде Parse error: parse error, expecting "," or ";". В конце каждой функции, переменной и т.п. должен стоять этот символ. Не забывайте про него.

Вот пример программы, когда символ ";" отсутствует (эта программа работать не будет):

<?

echo "Строка 1"

echo "Строка 2";

?>

Кроме того, богатый синтаксис PHP выражается в возможности по-разному оформлять блоки PHP кода. Изученный нами пример оформления (<? ... ?>) является не единственным, помимо него еще несколько способов.

Это:

<? ... ?>

<?php ... ?>

<script language="php"> ... </script>

Вы можете использовать любой из этих стилей оформления программы на PHP. Лично я рекомендую (и буду далее использовать в примерах) самый первый способ (<? ... ?>) как более короткий и поэтому самый удобный. Но при другие способы забывать не стоит, чтобы не удивляться в дальнейшем при встрече с ними.

Комментарии

Кроме того, в программе PHP часто используются так называемые "комментарии". Это примечания, заметки, комментарии к программе, которые пропускаются обработчиком и не выводятся на экран. То есть совершенно игнорируются. Комментарии бывают двух типов: однострочные и многострочные.

Однострочный комментарий начинается двумя слешами "//" и продолжается до конца строки:

<?

echo "Строка"; // функция echo() выводит строку

?>

Многострочный комментарий начинается символами "/*" и заканчивается символами "*/". Такие комментарии могут быть в несколько строк:

<?

/* в этой программе используется

только одна функция,

которая выводит данные на экран. */

echo "Строка";

?>

Функции

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

Функция всегда состоит из двух частей. Первая - это имя функции (echo), вторая часть - это параметры функции. Давайте разберем, как оформляется каждая из этих частей.

Имя функции

Имя функции (echo,print...) может быть написано в любом регистре, как вам больше нравиться. То есть регистр букв в имени функции не имеет совершенно никакого значения. К примеру, функцию echo можно написать такими способами: Echo, ECHO, EchO, eCho и т.п. Ошибки не будет.

Параметры функции

Параметры функции - это то, что передается ей из программы. Например, параметры для echo - это строка или переменная, которую она выводит на экран.

Пример:

<? echo "Строка"; ?>

Обратите внимание, что параметры могут оформляться по-разному. Вот основные методы оформления параметров:

<?

echo "Строка";

echo 'Строка';

echo ("Строка");

echo (Строка);

echo Строка;

echo();

?>

В первых двух вариантах разница состоит в синтаксисе написания строк. А вот остальные, когда в echo() варьируются варианты со скобками и без скобок - это на ваш выбор. С одной стороны, использовать команду echo() без скобок удобнее, с другой не все функции позволяют опускать скобки. Если функция имеет несколько параметров, то скобки опускать нельзя. Это главный принцип использования скобок.

Некоторые функции могут иметь несколько параметров, а могут и не иметь их вообще. Например функция phpinfo, которую мы использовали в прошлом выпуске. Отсутствия параметров обязательно указывается двумя скобками рядом с именем функции (как вы, видимо, успели заметить). Например, так: phpinfo(), echo() или print(). Не забывайте ставить эти скобки, тем более что PHP не сообщит вам об ошибке, он просто не выполнит функцию.

Теоретически к функции можно зачислить и третью часть - это точка с запятой ";", которая, как мы изучили выше, завершает любой оператор. Действительно, точка с запятой имеется у функции всегда, но она на самом деле не является ее частью. Этот символ лишь показывает завершение функции как оператора программы.

Переменные

Каждая переменная имеет свое имя и обозначается символом "$". Например, переменная $a. Вот как это выглядит в программе:

<?

$a = "Строка";

echo $a;

?>

Здесь используется переменная $a, которая хранит слово "Строка". Мы можем вывести эту переменную на экран (как в примере - с помощью функции echo() ), а также производить с ней некоторые другие действия. Имя переменной может состоять из латинских букв, цифр и символа подчеркивания "_", но не может начинаться с цифры. Также, имена переменных, в отличии от имен функций, чувствительны к регистру. Это означает, что переменные $a и $A - две разных переменных. Длина имени переменных может быть не более 255 символов.

Называться переменная может как угодно. Ей позволительно даже стать тезкой какой-нибудь функции, например:

<?

$echo = "Строка";

echo $echo;

?>

Это не вызовет никаких нареканий со стороны PHP.

Чтобы использовать переменные в программе, достаточно просто задать им значение как в предыдущем примере. В отличии от некоторых языков программирования (например, Паскаль) переменные не нужно описывать в отдельном разделе. По части использования переменных PHP очень похож на Бейсик.

Вот несколько примеров использования переменных:

<?

$a = "Строка";

$second_variable = "Вторая переменная";

$digit = 5;

echo $a,$second_variable,$digit;

?>

В примере используется три переменных, которые выводятся на экран с помощью echo(). Обратите внимание, как echo() умеет печатать данные - можно указывать любое количество параметров через запятую, в том числе комбинируя их со знакомыми нам приемами:

<?

$a = "Строка";

$digit = 5;

echo "Две переменных: ",$a,$digit, ' Можно использовать и одинарные кавычки ';

echo ("Такое оформление тоже работает: ", $a, '

Кстати, помните? Переносы и пробелы никак не

учитываются... ');

?>

Константы

Из школьного курса (в частности, курса физики) вы должны помнить определение константы. Если слово "переменная" явно подразумевает, что она может изменять свое значение, то "константа" этого делать не умеет. Задали ее один раз в программе и потом можем только использовать, изменять не получиться. В PHP константы оформляются в следующем виде:

define (a1,"Строка");

define (b1,123);

Здесь слово define - это оператор, описывающий константу. Далее в скобках идет имя константы (a1,b1) и ее значение ("Строка", 123). Обратите внимание, скобки в define обязательны, так как этот оператор имеет несколько параметров.

Пример использования констант:

<?

define (a1,"Строка");

define (b1,123);

echo a1,b1;

?>

Видите, при использовании константы в ее имени не указывается символ "$", в отличии от переменных. Это и идентифицирует в оператор как константу. Поэтому константа может повторять имена переменных, используемых в программе, но не может (как переменная) быть тезкой функции. Это значит, что если вы имеете в программе переменную $a = 123;, то имеете полное право создать константу define(a,"345");. Это будут два совершенно разных оператора. Однако вы не можете создать константу вида define(echo,"345");, так как echo - это имя функции. Кроме того, имена констант чувствительны к регистру, так же как и имена переменных.

Вот пример:

<?

/* переменная $a1 и константа a1 - это

совершенно разные элементы */

$a1 = "123";

define (a1,"Строка");

// echo - это ошибка. нельзя называть именами функций!

define (echo,"Строка1");

define (b1,123);

// A1 здесь не напечатается. Не забывайте про регистр!

echo a1,b1,A1;

?>

Типы данных в PHP

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

Числа

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

<?

$a = 123; // $a - это целое число

$b = 1.27; // $b - это дробное число

?>

Как вы видите, в дробном числе целая часть от дробной отделяется точкой.

Основные действия, которые можно производить с числами:

= Приравнивание. Означает занесение значения в переменную. Например, $a = 322;

+ Сложение.

- Вычитание.

* Умножение.

/ Деление.

% Остаток от деления.

Эти действия могут использовать в любом месте, где происходит работа с числами, в том числе и в параметрах функций. Обратите внимание, что в математических выражениях PHP соблюдает правила алгебры относительно порядка действий. То есть умножение (произведение) или деление обладает особым приоритетом. Например:

<?

$a = 12-4*5; // здесь $a будет равно -8.

$a = (12-4)*5; // а здесь $a уже равно 40.

echo $a;

?>

Давайте рассмотрим более конкретный пример работы с числами:

<?

$a = 10;

echo $a%3; // выводим остаток от деления $a на 3, то есть единицу.

$a = 15; // значение $a изменилось на 15.

$a = $a-5%3; // что сейчас находиться в $a ?

$b = 100;

echo $b / 9; // посмотрите, это уже дробный результат

/* можно использовать алгебру и

просто в качестве параметра к функции */

echo (12%5) * 7;

echo 12/9*1.2-($a+sin(180));

?>

Также, помимо основных действий (+,-,*...) в PHP есть также сокращенные действия, которые очень сильно облегчают жизнь программисту. Вот как они выглядят:

+= - прибавление

-= - вычитание

*= - умножение

/= - деление

%= - получение остатка

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

<?

$a = 10;

$a += 2; // теперь $a=12

?>

Здесь строчка $a += 2; означает $a = $a + 2;

То есть сокращенные действия позволяют присваивать значение переменной одним действием, "сворачивая выражение". Например, мы хотим присвоить к переменной $a произведение $b*$c. Это можно было бы написать как $a = $a + ($b*$c), но проще это сделать как $a += $b*$c.

Попробуйте попрактиковаться с этими действиями, очень полезно уметь ими пользоваться. Ну а сейчас давайте напишем более полезный пример, который будет кое-что для нас считать. Пусть это будет вычисление процентов от числа.

Вспомните, как это делается в математике? Пусть есть переменная $a, от которой нужно посчитать кол-во процентов, которое записано в переменной $percent. Мы должны поступить так: умножить количество процентов на само число и разделить получившийся результат на 100. Посмотрим как выглядит подобный алгоритм в лаконичных терминах PHP:

<?

$a = 355; // любое число, от которого мы считаем процент

$procent = 10; // сколько процентов считать?

echo "$procent% от $a = ".($procent*$a)/100;

?>

Обратите внимание, до чего же короткое получается выражение. Все сводиться к третьей строке кода, которая выводит нам числа, из которых мы и считаем сам результат (в этом примере, вывод будет такой: 10% от 355 = 35.5). Думаю, на этой строке стоит остановиться подробнее.

Что делает уже известная вам функция echo()? Сначала она выводит строку, которая оформлена в двойных кавычках (" ... "), обрабатывая внутри нее переменные. Именно в двойных кавычках могут соседствовать обычные символы и переменные, значения которых в этом случае выводятся на экран. Если вы напишите это в одинарных кавычках, то значения переменных обрабатываться не будут (в этом и есть разница двойных и одинарных кавычек). Далее эта конструкция скрепляется точкой (что, в данном случае, равносильно запятой) с алгебраическим выражением, которое считает процент. Т.о. мы получаем короткую и простую конструкцию, которая одновременно и выводит и считает все, что нам нужно.

Стоит отметить, что здесь сильно проявляется сходство PHP с языком Си. Если вы знакомы с этим языком, то подобные сокращения и "сжатый код" вас не удивят. Но если имеете опыт работы с другими языками (например Паскаль с его строгостью типов и выражений) или не имеете опыта программирования вообще, придется попрактиковаться в лаконичности кода. Это позволяет сильно оптимизировать программу и сократит размеры файла. Чтобы было понятнее, о чем я говорю, я хочу привести пример, как выглядела бы эта программа в Паскале (конечно, в терминах PHP):

<?

$a = 355;

$procent = 10;

echo $procent, "% от ", $a, " = ";

$a = ($procent*$a) / 100;

echo $a;

?>

Как видите, это немного больше. Расписано, что называется, по шагам.

Строки

Переменная типа "строка" содержит в себе набор любых символов. Оформляются строки двойными или одинарными кавычками:

<?

$a = ""; // это задает пустую строку или обнуляет существующую

$a1 = "mail@mail.info";

$a2 = 'a'; // строка в одинарных кавычках

$a3 = "Email: $a1"; // это уже выражение. В двойных кавычках можно использовать переменные, помните? Строка $a3 теперь равна "Email: dmitry@proge.info".

?>

Со строками, естественно, нельзя производить математических действий (нельзя ведь прибавить к букве "a" букву "z"), однако в некотором роде можно это делать совместно с числами. Здесь работает высокоэффективное преобразование типов, поистине доступное только в PHP. При этом действует такой принцип: если в строке записано число, например "15", то PHP будет производить арифметическое сложение строки и числа и возвращать число. Если строка содержит что-то кроме цифр, то результатом будет строка. Вот пример:

<?

$s = "5"; // $s - строка

$a = 10; // $a - число

echo $s.$a; // здесь просто выводим две переменных

echo $s,$a; // а можно и через запятую

echo $s+$a; // а здесь мы уже прибавляем строку к числу. Результат - 15.

$s = "Строка";

echo $s+$a; // здесь результат - уже строка, то есть "Строка10"

?>

Строки можно "склеивать" между собой, что в программировании называется "конкатенацией". Данная операция обозначается точкой "." или знаком "+".

<?

$s = "Строка1";

$s1 = "Строка2";

$s = $s.$s1; // "склеивание" строк через точку. Теперь $s = "Строка1Строка2";

$s = $s+$s1; // можно и через плюс

$s = $s+"Строка"; // а так можно прибавить и просто параметр

$s1 .= $s;// как и в числах, действует сокращенная конкатенация. Это означается $s1 = $s1.$s;

?>

Также в PHP можно обращаться к любому символу строки, указав его порядковый номер в квадратных скобках. Например, мы можем обратиться к символу "т" в переменной $s = "Строка", указав $s[1];

Обратите внимание, что символы в строке нумеруются с нуля, то есть символ "С" будет указываться как $s[0]; Пример:

<?

$s = "Строка1";

echo $s1[0];

$s[0] = $s[1]; // меняем символы в строке

echo $s; // смотрим результат

?>

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

StrLen($s) - вычисляет длину строки. Например: echo StrLen("12345"); выведет "5".

Substr($s, $start, $len) - возвращает часть строки $s, начиная с символа $start (не забывайте, что символы в строке нумеруются с нуля!) до символа $start+$len. Например:

<?

$s = "Пример строки";

$s1 = substr($s, 7, 7); // $s1 будет равно "строки"

echo $s1;

?>

StrToLower($s) - преобразует все символы строки в строчные буквы. Например, echo StrToLower("АБвг Abc"); выведет "абвг abc";

StrToUpper($s); - преобразует все символы строки в символы верхнего регистра. Например, echo StrToUpper("АБвг Abc"); выведет "АБВГ ABC";

Логический оператор IF

Очень часто в программе возникает необходимость выполнить проверку какого-нибудь условия. Например, является ли переменная $a числом или что больше $b или $c. Проверка логических условий осуществляется с помощью конструкции IF и логических действий, которые ему в этом помогают.

Конструкция IF состоит из следующих частей:

if (выражение) { < действие> } else { < действие> }

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

Эти две части выражения являются обязательными. Однако помимо обязательной части существует дополнительная, указываемая при желании. Это конструкция else { <действие> }. Суть ее состоит в следующем: если выражение в if неверно и условие не выполняется, управление передается действию (или блоку действий), которое указано после else. По-русски это можно представить таким образом:

ЕСЛИ (выражение) ТО {действия} ИНАЧЕ {действия}

Пример: Пусть нам нужно выяснить, что больше - $a или $b. Если $a - вывести строку "A больше B", если нет - строку "B больше A". Выглядеть это будет следующим образом:

<?

$a = 10;

$b = 15;

if ($a>$b) echo '$a больше, чем $b';

else echo '$b больше, чем $a';

?>

Как видите, в качестве выражения для проверки указано ($a>$b). Это звучит как "Если $a больше $b, то ... иначе ...". Символ ">" должен быть знаком вам из математики. Он обозначает "больше" и является в PHP одним из логических операторов.

Далее, есть определенная особенность в действиях после IF и ELSE. Если после IF или ELSE стоит всего одно действие (например, вывод строки), то оно указывается как есть. Если блок из нескольких действий - то они обязательно берутся в круглые скобки { ... }. Например, пусть мы проверяем $a>$b и, в случае, если больше, то вычитаем из $a переменную $b и выводим на экран. Если нет - прибавляем и выводим. Вот как это выглядит:

<?

$a = 10;

$b = 15;

if ($a>$b) {

$a -= $b; // вычитаем, то есть $a = $a - $b;

echo '$a = '.$a;

}

else {

$a += $b; // прибавляем, то есть $a = $a + $b;

echo '$a = '.$a;

}

?>

Cписок логических операторов, которые можно в любом количестве и в любой комбинации использовать в PHP:

< - "меньше"

> - "больше"

<= - "меньше или равно"

>= - "больше или равно"

! - "не"

&& - "и"

|| - "или"

== - "равно"

!= - "не равно"

Думаю, с первого раза некоторые из операторов могут показаться непонятными, поэтому остановлюсь на них подробнее. С симолами строгого и нестрогого равенства, думаю, проблем не возникнет, тем более что вы уже увидели их работу в пред. примере.

Оператор РАВНО (==)

Обратите внимание, в "равно" используется два знака равенства. Именно два:

if ($f==$c) ...

Это означает "ЕСЛИ $f РАВНО $C". Логическое "равно" очень сильно отличается от знака "приравнивание", обозначаемого одним знаком равенства. "Приравнивание" (=) означает занесение какого-либо значения в переменную, а логическое "равно" (==) именно проверку истинности равенства. Не забывайте про это. Если вы напишите в IF один знак равенства, то это будет ошибкой. И если напишите $a == $b+$c - это тоже будет ошибкой.

Оператор НЕ (!) и НЕ РАВНО (!=)

Оператор "!" означает отрицание или логическое "НЕ". Например, можно проверить, имеет ли переменная значение таким способом: if (!$a) {...}. Это означает ЕСЛИ (НЕ $a), ТО.... Соответственно, оператор "не равно" имеет этот символ (!=) Вот как можно проверить, равна ли одна переменная другой: if ($a != $b) { ... }.

Операторы И (&&) и ИЛИ (||)

Эти операторы обозначают логическое "И" и "ИЛИ". Например, нам нужно выполнить какие-либо действия, если переменная $a больше $b и меньше $c. Тогда мы выполним такую проверку:

if (($a>$b) && ($a<$c)) { ... что-нибудь сделаем ... }

Обратите внимание на круглые скобки в выражении - две отдельные проверки обособлены. Хоть в данном случае это и не обязательное условие, но выделение двух частей выражения позволяет навести порядок и придать проверке осмысленный вид.

Функции работы с переменными

Есть также набор полезных функций, который работают с переменными. Вот несколько самых главных:

Sqrt($a) - вычисляет квадратный корень из $a

Sin($a) - вычисляет синус $a в радианах.

Cos($a) - вычисляет косинус $a в радианах.

Tan($a) - вычисляет тангенс $a в радианах.

Abs($a) - вычисляет абсолютное значение аргумента (т.е. делает его положительным).

Exp($a) - e, в степени $a

GetType($a) - возвращает тип переменной. Возвращаемое значение это строка, содержащая одно из значений: "integer" - переменная явл. целым числом, "double" - дробным числом, "string" - это строка.

SetType($a,type) - эта функция устанавливает тип переменной. Параметр type - один из, "integer", "double" или "string".

IsSet($a) - проверяет, имеет ли указанная переменная значение. Если она не была инициализирована, возвращает "0", если в ней что-то записано - "1". Удобная функция для проверки существования переменных.

UnSet($a) - сбрасывает значение параметра $a, т.е. попросту обнуляет его.

Rand($min,$max) - возвращает случайное число, которое находиться в диапазоне между $min и $max. Например, функция Rand(0,10) вернет случайное число между нулем и десятью.

getRandMax() - возвращает максимальное число, которое можно получить с помощью функции Rand(). Обратите внимание, функция не имеет параметра, она просто возвращает значение.

Подробнее останавливаться на этих функциях, я думаю, не стоит - они очень простые и в случае, если вам захочется подробнее с ними разобраться, вам не составит труда сделать это самостоятельно, написав пару примеров с ними.

Цикл FOR

Циклы в программе вещь незаменимая. Основная суть этой конструкции это возможность повторения части программы несколько раз - определенное заданное количество или же пока соблюдается какое-либо условие. Без циклов не обходиться ни одна, даже самая простенькая программа. В этом выпуске мы наконец познакомимся с циклами в PHP и разберем, как они оформляются в программе. Первый и самый распространенный цикл - FOR. По-английски FOR означает "для". Именно так и можно перевести работу этого цикла. Давайте посмотрим, как он оформляется в программе:

<?

for ($i=0; $i<10; $i++) {

echo "i= ".$i;

echo "<br>";

}

?>

Обратите внимание на первую строчку, которая выделена жирным шрифтом. Это и есть конструкция цикла FOR. Расшифровывается она следующим образом:

Сначала пишется служебное слово for, которое означает начало цикла.

Далее в круглых скобках идет условие цикла, состоящее из трех выражений, разделенных точкой с запятой.

Первая часть - это выражение, которое задает начальное значение переменной цикла. В нашем случае "$i=0;" задает $i равное нулю.

Вторая часть - выражение, которое проверяется на истинность. Если оно верно - цикл выполняется. Как только оно перестает быть верным, цикл завершается. Вспомните IF - именно такое выражение используется здесь.

Третья часть - это шаг цикла. Здесь, как и в предыдущих, может быть совершенно любое выражение, которое изменяет начальное значение переменной цикла. В нашем случае это просто увеличение на 1 "$i++";

Итак, если исходить из этой расшифровки, то по-русски можно прочитать заголовок цикла FOR таким образом: "Выполнять цикл от $i равному нулю до $i меньше 10. По ходу цикла увеличивать $i на единицу." В нашем случае цикл будет выполняться 10 раз. В самый первый раз переменной $i присвоиться значение (часть 1), в следующий раз оно будет увеличиваться на единицу (часть 3) и проверяться на истинность (часть 2). Вот и вся незатейливая работа цикла FOR.

Обратите внимание на тот факт, что в качестве любого из трех частей может выступать совершенно любое выражение. Это может быть увеличение или уменьшение переменной, проверка формулы, функция и т.п. Также любая часть может отсутствовать вовсе: for ($i=0;$<10;) Но точку с запятой нужно ставить обязательно. Выражений может не быть вообще: for (;;) но, как видите, две точки с запятой обязательны. Кстати, последний пример создаст бесконечный цикл и есть все шансы подвесить сервер.

Вот примеры использования выражений в конструкциях FOR:

<?

for ($i+15-$a; $i<10 || $i>8;); // два выражения, 3-е отсутствует.

for ($i=10; $i>0; $i--); // цикл "по убыванию" - от 10 до 1

for (;;); // "пустой" - бесконечный цикл

?>

В цикле FOR, также как и в известной вам конструкции IF...THEN...ELSE действует правило, когда при наличии нескольких операторов в блоке они оформляются фигурными скобками: {...}. Если оператор один - достаточно поставить после него точку с запятой. Вот пример "свернутой" и "развернутой" конструкции:

<?

for ($i=1; $i<11;$i++) echo "i=$i<br>";

for ($i=0; $i<10; $i++) {

echo "i= ".$i;

echo "<br>";

}

?>

Это вся теория относительно цикла FOR. Конкретные примеры его использования смотрите в рубрике Пример в номер.

Цикл WHILE

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

<?

$i = 1;

while ($i<11) {

echo "i=$i<br>";

$i++;

}

?>

Здесь все просто и, если вы уже знакомы с циклом FOR, то разберетесь в этой конструкции без проблем. По порядку:

Сначала указывается служебное слово while, которое означает начало цикла.

Далее в скобках указывается логическое выражение, которое проверяется на истинность. Если оно верно - выполняется тело цикла. В нашем случае - если $i меньше 10, то цикл работает. Если нет - цикл завершается.

Как обычно, выражение может быть любой сложности. Также здесь, как и в других конструкциях языка, работает правило оформления нескольких операторов в скобках {...}. Если оператор один - скобки можно опустить.

Основное назначение цикла WHILE - изменение переменной цикла в самом теле цикла. Это бывает очень полезно, когда используются нематематические проверки. Хочу обратить ваше внимание на основное правило использования WHILE и FOR - когда нужно выполнить цикл строго определенное количество раз, используется FOR, так как он позволяет задать жесткий шаг. Когда нужно, чтобы количество выполнений (или, по-другому итераций) цикла зависело от программы и может быть различным в зависимости от текущих условий - используется WHILE.

Собственно, это и все, что можно сказать по циклу WHILE. Конструкция, согласитесь, очень проста. Конкретные примеры его использования смотрите в рубрике Пример в номер.

Цикл DO...WHILE

Еще один цикл, который можно использовать в PHP - это цикл DO...WHILE. По сути - этот тот же WHILE, только проверка выполняется не в начале, а в конце цикла. Вот как он выглядит:

<?

do {

$ii++;

echo $ii."<br>";

} while ($ii<10);

?>

В операторе WHILE() используется логическое выражение. Если оно истинно - цикл выполняется. Если нет - цикл завершает работу. Использование этого цикла, также как и WHILE, целесообразно тогда, когда количество итераций зависит от условий программы и для завершения работы блока требуется проверка логического условия.

Функции работы с файлами

При работе с файлами в PHP основной порядок действий следующий:

Открытие файла

Совершение необходимых действий (запись в файл или чтение из файла)

Закрытие файла.

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

$f = fopen("filename.txt","w");

Как вы видите, перед процедурой ставится переменная $f. Называться она может, естественно, как угодно, но присутствовать должна обязательно. После вызова fopen() в эту переменную помещается так называемый "дескриптор файла". Дескриптор нужен вот для чего. Представьте, что в программе мы открываем несколько файлов. Логично предположить, что в дальнейшем, когда мы будем, например, производить запись в файл, нам нужно будет указывать, в какой именно файл мы пишем. Вот для этого и нужен дескриптор - он указывает тот файл, к которому мы обращаемся в данный момент. Соответственно, для каждого открываемого файла нужен свой дескриптор, например, $f, $f1, $f2. Подробнее про использование дескриптора вы увидите в дальнейших примерах.

Далее разбираем синтаксис самой функции fopen(). Она имеет два аргумента. Первый - это путь к открываемому файлу, в нашем примере он называется "filename.txt". Путь может быть указан как угодно, например так: "F:\site\htdocs\files\file.txt", или так: "/site/htdocs/1.dat". Это может быть даже URL, например "http://127.0.0.2/file.html" или "http://yandex.ru". В этом случае, когда мы будем читать данные из файла, мы будем получать то, что выдает нам вебсервер.

Тут хочу сделать небольшое замечание и в очередной раз обратить ваше внимание на написание слешей. Если вы пишете программу для Windows то можно использовать обычное в этой системе написание слешей в именах файлов, то есть "\". Но имейте в виду, что при загрузке программы на сервер провайдера в систему Unix этот вариант написания путей работать не будет. В Unix необходимо использовать обратные слеши: "/". Как же быть, чтобы не путаться? Все очень просто: в Windows работает обратное написание слешей. То есть если вы напишите "/site/htdocs/file.txt" это будет работать и в Windows и в Unix. Запомните это и возьмите за правило именно так указывать пути в ваших программах.

Второй аргумент функции fopen() это так называемый параметр режима. Он указывает, для чего мы открываем этот файл - например, можно открыть файл только для чтения, или для чтения и записи. Основные варианты параметра режима:

"r" - открыть файл для чтения (сокр. "read")

"w" - открыть файл для записи (сокр. "write")

"a" - открыть файл для записи в конец файла (сокр. "add")

Разница параметров "w" и "a" в том, что при открытии файла с помощью "w" его содержимое перезаписывается, а при открытии с помощью "a" запись происходит в конец файла, то есть новые данные добавляются к уже имеющимся. Не забывайте про это важное отличие. Конкретные примеры использования функции fopen() вы увидите далее.

Для чтения строки из файла существует функция fgets():

$s = fgets($f,255);

Здесь $s - переменная, в которую будет помещена прочитанная строка. $f - это дескриптор файла, открытого с помощью fopen(), а 255 - количество байт, которое читается за один раз. Конкретно в данном примере мы читаем 255 байт. Строка читается либо пока не будет прочитано определенное заданное количество байт, либо пока не будет встречен символ переноса строки.

Существует также функция fgetss(), которая полностью идентичная fgets() за тем исключением, что она исключает из прочитанной строки все тэги HTML и PHP. То есть если с помощью fgetss() прочитать строку "<b>Строка</b>", результатом будет просто слово "Строка".

Для чтения символа из файла служит функция fgetc():

$c = fgetc($f);

Эта функция читает один символ. Здесь $c - прочитанный символ, а $f - дескриптор файла.

Для записи данных в файл служит основная функция fputs(): fputs($f,$s);

Здесь $f - дескриптор файла, а $s - записываемая строка.

Закрывает файл функция fclose($f). Файл обязательно закрывать всегда. Например, если вы не закрываете файл после записи, то изменения просто не сохранятся.

Функция feof($f) проверяет достигнут ли конец файла. $f - файловый дескриптор. Если конец файла достигнут, функция возвращает истину. По сути, файл можно вывести на экран такой небольшой программкой:

<?

$f = fopen("1.txt","r");

while (!feof($f)) echo fgets($f, 255);

fclose($f);

?>

И последняя функция:

$a = file("filename.txt");

Функция file() читает весь файл "filename.txt" и возвращает в переменную $a массив, каждый элемент которого содержит отдельную строку файла. При чтении строки разделяются символами переноса строки. Это одна из самых удобных функций для чтения файла, которая временами заменяет много действий. Вот пример вывода файла на экран с помощью file():

<?

$f = File("1.txt");

for ($i=0;$i<count($f);$i++) echo $f[$i];

?>

Существует в PHP также очень полезная функция implode(), которая соединяет все элементы массива в одну переменную. Иногда это очень удобно:

<?

echo implode("",File("1.txt"));

?>

Как вы видите, здесь мы выводим файл на экран всего одной строкой. Кстати, первый аргумент функции implode() указывает чем необходимо склеивать элементы массива. В этом примере мы задаем пустой символ, а попробуйте, например, так:

<?

echo implode("*",File("1.txt"));

?>

Ну а теперь давайте рассмотрим обработку файла на примере создания своей системы голосования. Переходим к следующему разделу.

Своя система голосования на PHP

Вы когда-нибудь хотели узнать мнение своих посетителей по тому или иному поводу? Например, "что Вы хотите видеть на сайте" или "нравиться ли Вам наш новый дизайн" ? Уверен, что такое желание возникало. Действительно, установка на сайте собственного опроса или системы голосования позволяет не только копить бесценную информацию о том, что думают Ваши посетители, но и придать сайту нелишнюю интерактивность.

В общем, достоинства собственной системы голосования очевидны. Но что делать, когда под рукой нет необходимого скрипта? Можно, конечно, воспользоваться бесплатными системами голосования, которые позволяют Вам установить форму с несколькими вопросами на свой сайт. В этом случае сам скрипт находиться на удаленном сервере и выполняет всю работу. Но, на мой взгляд, это не очень подходящий вариант: во-первых, эти системы вставляют свой баннер в голосование, во-вторых, работоспособность системы от Вас совершенно никаким образом не зависит. Также, некоторые системы требуют довольно продолжительного нахождения в Сети, поскольку вся настройка голосования происходит обычно on-line. А для некоторых пользователей это совсем немаловажный момент.

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

В этой статье я хочу показать Вам, как несложно сделать столь полезный скрипт голосования своими силами. Эта система реализует практически все необходимые функции.

Итак, начнем.

Давайте представим, что мы на сайте хотим объявить следующее голосование:

ВАШЕ МНЕНИЕ:

Как Вам наш новый дизайн?

5 - Отлично!

3 - Так себе, потянет...

1 - Ужасно!!!

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

Двигаемся дальше. Для начала нам нужно сделать этот опрос в виде HTML, определив имена для переменных.

<form action="/php/vote.php" method="get" target="_blank">

<input type="Hidden" name=id value=1>

<b>Как Вам наш новый дизайн?</b><p>

<input type="Radio" name=vote value=1 checked>Отлично!<br>

<input type="Radio" name=vote value=2>Так себе, потянет...<br>

<input type="Radio" name=vote value=3>Ужасно!!!<p>

<input type="Submit" value=" Голосовать! "><p>

<a href="/php/vote.php?id=1" target="_blank">Текущие результаты</a>

</form>

Это все. Теперь можно приступить к самому скрипту. Как видно из формы, нашему скрипту передается две переменных:

id=1: это номер голосования. Дальше Вы увидите, как он используется для создания нескольких независимых голосований.

vote=1: номер ответа, то есть конкретно выбранный вариант ответа Вашим посетителем.

Также к нашему скрипту ведет ссылка "Текущие результаты", указывающая только параметр id, без номера ответа. Дело в том, что скрипт при отсутствии параметра vote просто выводит результаты, без сопутствующей благодарности "Спасибо за Ваше мнение!" и каких-либо действий по учету голосования.

Продолжаем. Нашему скрипту потребуется собственная база данных с текстами вопросов и ответом к ним. Конкретное голосование - это один вопрос и набор ответов к нему, а также количество мнений на каждый ответ. Все голосования хранятся в отдельных текстовых файлах и определяются по переменной id, передаваемой через форму. В примере id - это цифра (или что угодно другое), которая является первой частью имени файла. Для примера, если id=1, значит база данных голосования лежит в таком файле: 1.dat или, в терминах PHP, $id.dat.

Впрочем, Вы увидите это далее на конкретном примере. Отсюда получается, что для создания голосования Вам достаточно создать новый файл в очень простом формате (см. далее) и html-форму, содержащую тексты вопросов и id голосования.

Итак, раз уж мы с Вами определились, что данные голосования хранятся в отдельных файлах, давайте рассмотрим формат конкретного файла. Он имеет такой вид:

Как Вам наш новый дизайн?

5~Отлично!

3~Так себе, потянет...

1~Ужасно!!!

Где 1я строка: это сам вопрос, остальные строки - пара "количество_мнений~ответ", как Вы поняли, разделенных тильдой "~". Теперь все, что нам осталось, это обрабатывать результаты.

Это делает следующий скрипт:

<?

// файл с конкретным голосованием

$data = File("$id.dat");

// выводим благодарности,

// если это не просто просмотр результатов

if ($vote) echo "<b><font color=red>

Спасибо за Ваше мнение!

</font></b><p>";

// выводим заголовок голосования - 1я строка файла

echo "<b>$data[0]</b><p>";

// печатаем список ответов и результатов - остальные строки

for ($i=1;$i<count($data);$i++) {

$votes = split("~", $data[$i]); // значение~ответ

echo "$votes[1]: <b>$votes[0]</b><br>";

}

// если это не просмотр результатов, а голосование,

// производим необходимые действия для учета голоса

if ($vote) {

$f = fopen("$id.dat","w");

fputs($f, "$data[0]");

for ($i=1;$i<count($data);$i++) {

$votes = split("~", $data[$i]);

if ($i==$vote) $votes[0]++;

fputs($f,"$votes[0]~$votes[1]");

}

fclose($f);

}

?>

Собственно, это все, что требуется. Как видите, скрипт достаточно прост, не выполняет каких-либо специфический действий, да и ресурсов много не потребляет. Конечно, сюда можно добавить многие другие полезные функции, например, сделать администраторский интерфейс для управления голосованиями через броузер и держать все данные по голосованиям в одном файле, чтобы не возиться каждый раз с $id.dat. Но это - в следующий раз, а пока моей целью было показать Вам, что столь полезная система голосования очень просто реализуется.

Регулярные выражения

Регулярные выражения используются для сложного манипулирования строками в PHP. Поддержка интерфейса между скриптом и регулярными выражениями осуществляется через следующие функции: split(), ereg(), ereg_replace(). (доп. редактора). Первым аргументом для всех трех функций - это строка, задающая регулярное выражение. Этот строка состоит из регулярных и специальных символов. Регулярные символы имеют то же значение что и при в других командах Unix, в то время как специальные символы имеют специальное значение. Далее следуюет - полный список специальных символов и их значения как это воспринимает синтаксический анализатор PHP:

`.'

Является специальным символом, который соответствует любому символу, за исключением символа новой строки. Используя конкатенацию, мы можем задавать регулярные выражения подобно 'a.b', которое соответствует любой трех-символьной строке, которая начинается с 'a' и заканчивается 'b'.

`*'

Сам по себе это не конструкция; это - суффикс, который означает, что предшествующее регулярное выражение, может быть повторено сколь угодно много раз. В строке "fo*", символ "*" применяется к символу "o', так "fo*" задает "f" с последующим любым количеством символов "o".

В случае нулевого количества символов "o" строка "fo*" будет также соответствовать "f".

Символ "*" Всегда применяет к *наименьшему* возможному предшествующему выражению. Таким образом, "fo*" задает повторение "o", а не повторение "fo".

Процесс сравненияr обрабатывает конструкцию "*", пытаясь согласовать настолько много повторений насколько много их их может быть найдено. Затем он продолжает обработку остальной части шаблона. Если, впоследствии, появится несоответсвтие с шаблогам, происходит возврат, путем отбрасывания некоторых повторений "*", в случае, если это делает возможным совпадение остальной части шаблона. Например, шаблон "c[ad]*ar" для строки "caddaar", "[ad]*" сначала совпадает с "addaa", но это не позволяет совпасть следующему символу "a" в шаблоне. Так последнее совпадение "[ad]" отменяутся, и следующий символ "a" пробуется вновь. Теперь шаблон сооветствует.

`+'

"+" Подобен "*" за исключением того, что требуется по крайней мере одно соответствие для предшествующего образца. Таким образом, "c[ad]+r" не совпадает с "cr", но совпадет с чем либо еще что может быть задано шаблоном "c[ad]*r".

`?'

"?" Подобен "*" за исключением того, что позволяет задать нуль или более соответствий для заданного шаблона. Таким образом, шаблон "c[ad]?r" будет задавать строки "cr" или "car" или "cdr", и ничего больше.

`[ ... ]'

"[" начинает "множество символов", которое завершается символом "]". В самом простом случае, символы между этими двумя скобками формируют множество. Таким образом, "[ad]" задает символы "a" или "d", и "[ad]*" задает любоую п оследовательность символов "a" и "d" (включая и пустую строку), из чего следует, что шаблон "c[ad]*r" задает "car", и т.д.

Диапазон символов также может быть включен в множество символов, с помощью символа "-", помещенного между двумя другими. Таким образом, шаблон "[a-z]" задает любой символ нижнего регистра. Диапазоны могут свободно перемежаться с одиночными символами, как в шаблоне "[a-z$%.]", который задает любой символ нижнего регистра или символы "$", "%" или точку.

Обратите внимание, что символы, обычно являющиеся специальными, внутри множества символов больше не являются таковыми. Внутри множества символов существует полностью отличный набор специальных символов : "]", "-" и "^".

Для того чтобы включить "]" в множество символов, нужно сделать его первым символом. Например, шаблон "[]a]" задает символ "]" или "a". Чтобы включить символ "-", нужно использовать его в таком контексте, где он не может указывать диапазон: то есть или первым символом, или сразу после диапазона.

`[^ ... ]'

"[^" начинает "исключающее множество символов", который задает любой символ за исключением заданных. Таким образом, шаблон "[^a-z0-9A-Z]" задает любой символ *за исключением* букв и цифр. "^" не является специальным символом в множестве, если только это не первый символ. Символ следующий после "^" обрабатывается так, как будто он является первым (это может быть "-" или "]").

`^'

Является специальным символом, который задает пустую строку - но только в случае если он стоит в начале строки шаблона. Иначе шаблон не будет соответствовать. Таким образом, шаблон "^foo" задает "foo" в начале строки.

`$'

Подобен "^", но только задает конец строки. Так шаблон, "xx*$" задает строку с одним или более символом "x" в конце строки.

`\'

Имеет два значения: экранирует вышеперечисленные специальные символы (включая "\"), и задает дополнительные специальные конструкции.

Так как "\" экранирует специальные символы, "\$" является регулярным выражением, задающим только символ "$", а "\[" является регулярным выражением, задающим только "[", и так далее.

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

Никакие новые специальные символы не определены. Все расширения к синтаксису регулярных выражений сделаны, определением новые двух-символьных конструкций, которые начинаются с "\".

`\|'

Задает альтернативу. Два регулярных выражения A и B с "\|" между ними формируют выражение, которое задает что-либо чему соответствует или А или B.

Так выражение, "foo\|bar" или "foo" или "bar", но никакую другую строку.

"\|" применяется к максимально большим окружающим выражениям. Только "\(...\)" вокруг выражений могут ограничивать мощность "\|".

Существует полная возможность перебора с возвратами , когда задано множество "\|".

`\( ... \)'

является конструкцией группирования , которая служит трем целям: 1. Заключать в себя множество "\|" альтернатив для других операций. Так, шаблон "\(foo\|bar\)x" соответствует или "foox" или "barx".

2. Включать сложное выражение для постфиксного "*". Так шаблон "ba\(na\)*" задает "bananana", и т.д., с любым (ноль или болеее ) количеством "na".

3. Отметить искомую подстроку для последующего обращения.

Эта последняя функция - не следствие идеи относительно группировки выражений скобками; это - отдельная особенность, которая задает второе значение для той-же самой конструкции "\(...\)" , так как нет практически никакого конфликта между этими двумя значениями. Вот объяснение этой особенности:

`\DIGIT'

После окончания конструкции "\(...\)" , анализатор запоминает начало и конец текста, совпавшего с этой конструкцией. Затем, позднее в регулярном выражении можно использовать "\" с поледующей цифрой (DIGIT), что означает "задать тот же самый текст, который соответствовует DIGIT нахождению в конструкции '\(...\)'". "\(...\)" конструкции пронумерованы в порядке возрастания в регулярном выражении.

Строкам задающим первые девять конструкций "\(...\)" , появляющимся в регулярном выражении - соответствуют числа от 1 до 9. "\1" до "\9" может быть использовано для обращения к тексту, соответствующей "\(...\)" конструкции. Эти 9 сохраненных конструкций известны также как регистры.

Например, шаблон "\(.*\)\1" задает любую строку, который состоит из двух идентичных частей. "\(.*\)" задает первую часть, которая может быть всем чем угодно, но последующая "\1" задает точно тот же тексту.

Сохраненные конструкции или регистры могут использоваться внутри одиночных выражений, или, они могут быть извлечены и использоваться где-либо еще. Добавление третьего параметра к reg_match() или reg_search() определит массив, в который будут записаны 9 регистров. При этом записывается дополнительный регистр (нулевой элемент) в котором задана строка совпавшая со всем выражением. Например:

<?$string = "This is a test"; $cnt = reg_match("\(\w*\).*\(\") echo $cnt; echo $regs[0]; echo $regs[1]; echo $regs[2]; >

Вышеупомянутое сначала напечатает количество совпавших символов (14 в этом случае) и затем всю совпавшую строку, споследующим первым словом строки и последним.

`\b'

Задает пустую строку, но только, если она находится в начале или в конце слова. Таким образом, "\bfoo\b" соответствует любому местонахождению "foo" в виде отдельного слова. "\bball\(s\|\)\b" соответствует "ball" или "balls" в виде отдельных слов.

`\B'

Задает пустую строку, если она не в начале или не в конце слова.

`\<'

Задает пустую строку, но только, если она - в начале слова.

`\>'

Задает пустую строку, но только, если она в конце слова.

`\w'

Задает любой символ, являющийся составной частью слова.

`\W'

Задает любой символ, который - не является составной частью слова.

Основные функции работы с массивами и строками

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

$s = implode($a,$c);

Мы уже познакомились с этой функцией в прошлом выпуске. Она позволяет соединять все элементы массива в одну строку. Здесь $s - строка, в которую будет помещен результат, $a - массив, $c - шаблон. Шаблон это набор символов для склейки строк. Этот набор будет вставлен между всеми элементами массива. Например, имеем такой массив:

$a[0] = "String1";

$a[1] = "String2";

$a[2] = "String3";

Соответственно, функция implode($a, "***") вернет нам строку "String1***String2***String3".

$a = explode($c,$s);

Функция explode является обратной implode. Она разбивает строку $s используя шаблон $c и помещает элементы в массив $a. Например, если взять строку "String1*String2*String3" и выполнить функцию $a = explode("*",$s), то получим такой массив:

$a[0] = "String1";

$a[1] = "String2";

$a[2] = "String3";

$a = split($c,$s);

Работа фунции абсолютно идентична explode, за тем исключением, что в ней можно использовать регулярные выражения. Это означает, что уже нельзя для простой разбивки строки использовать символ "*", так как он является регулярным выражением (см. раздел выше). Поэтому для разбивки строки можно использовать какий-нибудь другой символ, например, "~".

ereg($c,$s);

Функция ereg возвращает истину, если в строке $s найдено соответствие регулярному выражению $c. $c здесь это любой набор описанных в предыдущем разделе регулярных выражений. Например, мы имеем строку $s = "Here is testing string". Функция ereg("^Here.*",$s) вернет истину, так как в регулярном выражении указывается, что слово Here должно быть в начале строки (спец. символ "^" указывает на это), а после этого слова могут идти любые символы (конструкция ".*"). Вот пример программы, которая проверяет это соответствие:

<?

$s = "Here is testing string";

if (ereg("^Here.*",$s)) echo "Найдено!"; else echo "Не найдено.";

?>

А вот небольшой пример, который ищет шаблон в любой части слова:

<?

$s = "Here is testing string";

if (ereg(".*testing.*",$s)) echo "Найдено!"; else echo "Не найдено.";

?>

$s = ereg_replace($c,$c1,$s);

Эта функция заменяет все символы в строке $s, подходящие под регулярное выражение $c на символы $c1. Вот пример, в котором мы заменяем все цифры в строке на знаки "+":

<?

$s = "1 Here 2 is 3 testing 4 string 5";

$s = ereg_replace("[0-9]","+",$s);

echo $s;

?>

Как видите, функция возвращает результат в заданную переменную.

$s = str_replace($c,$c1,$s);

Работа функции аналогична ereg_replace, за тем исключением, что в параметре $c нельзя использовать регулярные выражения. Эту функцию можно использовать, когда у вас нет сложного шаблона для замены, а нужно произвести простой поиск и замену нескольких символов. Например, функция $s = str_replace("*", "+", "Str1*Str2*Str3") заменит в заданной строке все символы "*" на символы "+".

Написание своих функций в PHP

Иногда возникает необходимость в написании собственных функций. Такой случай возникает когда встречаются часто повторяющиеся части программы. Очень удобно оформить эти части как отдельную функцию и просто вызывать ее при необходимости. Сегодня я расскажу вам о том, как создаются свои функции в PHP.

Итак, давайте посмотрим, как выглядит функция в основной программе:

<?

Function show_file($f) {

echo implode(file($f),"");

}

show_file("file.txt");

?>

В примере мы описали функцию show_file($f), которая выводит на экран содержимое файла Здесь служебное слово Function указывает, что мы описываем функцию. Далее указывается имя функции и в скобках параметры, которые функция получает (в нашем случае это переменная $f). Параметры могут отсутствовать, в этом случае нужно указывать просто пустые скобки: Function show_file(). Далее начинается тело функции. По сути - это отдельная маленькая программа, которая оформляется с помощью скобок {} (так же как и тело циклов). Далее в программе Вы можете использовать функцию просто вызвав ее имя.

Функции не имеют доступа к переменным основной программы. Здесь действует так называемая "область видимости переменных". Все необходимые переменные обычно передаются функции как параметры. Если же функция должна манипулировать с переменными основной программы, то для этого их необходимо описать в специальном блоке, который озаглавливается global. В нашем простом примере это выглядело бы так (переменная $f не передается как параметр, а используется из основной программы):

<?

Function show_file() {

global $f;

echo implode(file($f),"");

}

$f = "file.txt";

show_file();

?>

Как видите, мы не передаем переменную $f как параметр, а описываем ее как глобальную переменную с помощью global. Если у вас описывается несколько переменных, их нужно просто перечислить через запятую: global $a,$b,$c.

Кроме того, параметры, передаваемые функции, могут быть опущены при ее вызове. Для этого вам в описании функции нужно задать параметру начальные значения. Например: Function show_file($s=""). При этом функция может вызываться из основной программы и без указания параметра. Если он отсутствует, то ему будет присваиваться значение, указанное в описании функции. В приведенном примере функции будет передаваться пустая строка $s.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]