Обо что это?
В чем же прелесть PHP? Можно конечно долго спорить о том, какой язык программирования выбрать. Тут и ASP, и Perl, Java… но мы остановил свой выбор на PHP. Сделали это не случайно, а в силу некоторых очень полезных свойств этого языка. Во-первых, это то, что все скрипты можно "вклеивать" прямо в HTML код (что, на наш взгляд, очень помогает начинающим). Во-вторых, это работа с формами (обработать на PHP данные, введенные с формы, намного проще чем, скажем на Perl'е). В-третьих, работа с базами данных - на наш субъективный взгляд в PHP она организована намного понятнее (как мы постараемся показать это в дальнейшем). Вот вкратце критерии выбора. А тем, кто будет кричать, что на, к примеру, Perl'е скриптов больше написано, то могу на спор отыскать аналог любого Perl скрипта на PHP.
Но давайте ближе к телу. В цикле статей под девизом "от азов до создания своих проектов" мы постараемся рассказать (и подкрепить примерами) о том, что написание программ для Интернета вполне посильная задача даже для начинающих.
Наши статьи будут писаться по принципу "Задача - теория - практика". Это значит что: во-первых, перед тем как изучать немного занудную теорию мы ставим вполне конкретные цели. Во-вторых, теория будет даваться в сокращенном виде (подразумевается, что читатель сам заинтересован в дальнейшем саморазвитии, мы лишь даем импульс к началу). В-третьих, цель данных статей исключительно образовательная (подразумевается, что скрипты написанные нами не претендуют на абсолютную защищенность и надежность). Ну, и в-последних, это то, что содержание материала не привязано к строгому плану. Последовательность и тема вариативны, зависят от ваших пожеланий и предложений. Ждем-с!
Итак, для начала вспомним (ознакомимся) с азами.
Для самых маленьких.
Эта глава предназначена в первую очередь для тех, у кого при слове PHP возникает только один вопрос: "Это что?". Дабы не забивать полезное место в статье материалом, который при желании можно преспокойно найти в Интернете, осмелюсь послать всех на… www.php.org за необходимой информацией о версии языка, его истории и прочей интересующей информацией.
(Tip: я бы не советовал скачивать самые свежие версии т.к. они могут быть нестабильны. Лучше немного подождать и качать нормальный STABLE RELEASE). А мы с вами проведем ликбез (можно сказать, курс молодого бойца).
Что бы все ваши скрипты работали необходимо либо иметь доступ к уже настроенному серверу, либо (самый простой вариант) поставить себе пакет "Denver". Там все операции по настройке уже выполнены за вас. Хотелось бы отметить, что такой вариант вполне пойдет для домашней отладки скриптов. В составе компонентов Denver'а находятся:
- Web-сервер "Apache" (в урезанном варианте).
- Интерпретаторы Perl и PHP.
- Сервер баз данных MySQL.
Дистрибутив доступен здесь: http://dklab.ru/chicken/web/dis/Base/ (качайте самую новую версию).
Как и для всякого дела, неплохо бы иметь при себе удобный инструмент для работы. Та же история и с PHP. Часто новички в PHP-программировании задаются вопросами: "В чем, собственно, программировать? Существует ли специальная программа, или можно обойтись каким-нибудь универсальным редактором?" - это естественно, ведь, например, в программах Visual Basic, Delphi существует визуальное отображение действия сценария, т.е. берешь кнопочку обычную, или поле ввода, и "рисуешь" на форме. Это некое подобие WYSIWYG-редакторов (What You See Is What You Get - что видишь, то и получаешь), коим и является печально известный Microsoft Frontpage. Пожалуйста, запомните, в PHP такого нет!
Использовать можно любой текстовый редактор (Notepad, Cromson Editor, Aditor), но лучше (а главное удобнее), конечно, воспользоваться специальным инструментарием.
(Tip: Помните, использовать лучше текстовые редакторы, а не текстовые процессоры (вроде Word), иначе скрипт может и не запустится!)
Я рекомендую PHP Expert Editor - оптимальный выбор для начинающих, а также программистов-любителей. Данная программа является сама по себе чисто PHP-редактором. Имеет массу полезных функций, на которых мы сейчас не будем подробно останавливаться. Программа занимает всего 2 Мб, и сразу заменяет FTP-клиент, проводник, браузер и т.д. Предпосылкой для использования PHP Expert Editor будет являться также тот факт, что регистрация для жителей СНГ и бывших стран СССР (Эстония, Латвия и Литва) совершенно бесплатна. Скачать чудо-программу можно здесь: http://www.ankord.com/ru/download.html
Немаловажным фактором для новичков является понятие "права на файл" (актуально только для *nix хостингов). Если вкратце, то можно определить это так: есть 3 группы пользователей. 1 группа - это владелец файла и рут (супер пользователь). 2 группа - это группа, где состоит владелец файла (например, users). И в третью группу пользователей входит весь остальной народ использующий систему. Между этими группами распределяются права на чтение, запись, и выполнение файла. Так вот для того, чтоб все скрипты работали нужно выставить права на эти самые скрипты. Это выполняется либо через ваш ftp-клиент, либо через шелл.
(Tip: Shell (оболочка) - это интерфейс между пользователем и машиной. Всем нам шелл знаком как командная строка в ОС DOS и Windows. Шелл - это та же командная строка в системе Unix, но только со своими, конечно, командами).
Опять же по этому вопросу есть куча материалов в сети. Скорее всего, вы сможете найти их на сайте своего хостера. Подробнее о правах: http://webstudent.net.ru/modules/wfsection/article.php?articleid=2.
Итак, переходим наконец непосредственно к синтаксису языка. Чаще всего php-скриптом называют файл с расширением php или phtml. Содержимое файла может представлять из себя либо программный код в чистом виде, либо то же код, но смешанный с html.
Любой php-скрипт начинается с "" соответственно.
(Tip: Строго говоря, существует 4 способа вставки кода. Один из них, краткий, приведенный выше, работает лишь когда на сервере включена директива short_open_tag; другой способ - PHP-программа находится между двумя тегами - и ?> - способ самый универсальный и рекомендуемый, т.к позволяет работать также с XML/XHTML документами. Есть еще способы вставки через ASP стиль и конструкцию script, но мы не будем сейчас это рассматривать)
Вот простой пример php-скрипта:
Вкратце поясню код приведенный выше. Итак, как видно все начинается и заканчивается стандартными тегами "". Далее следует функция echo (эхо, если по-нашему). Её смысл сводится к тому, что б вывести информацию в выходной поток (в нашем случае это код страницы). Функция имеет одни параметр (это то, что в скобках), которым может являться либо переменная, либо собственно текст (как у нас). Замечу одну маленькую деталь - если выводится просто текст, то он должен быть в кавычках (разрешены как ординарные, так и двойные). И в конце обязательно ставим ";" иначе ничего работать не будет т.к. эти самые ";" являются как бы логическим завершением ЛЮБОЙ функции. Это необходимо хорошо запомнить, т.к такая мелочь очень часто становится причиной ошибок.
Теперь тот же пример, но с переменной в качестве параметра:
<php
$text='Fuck you world!!!';
echo ($text);
?>
Все переменные в PHP начинаются со знака "$" (интересно, почему именно "$", может, за это деньги платят :) и бывают разных типов (текст (char), целое(int) и т.д.), но для PHP это не актуально, потому что интерпретатор сам определяет тип переменной. А потом все стандартно (эх, рутина). "Эхо" выводит заданный ей параметр. В данном случае это переменная с текстом. Кавычки не ставим.
Tip: переменная также будет выводиться если ее поставить в двойные кавычки.
Важно! Имена переменных произвольны, но чувствительны к регистру! Т.е $Var и $var - это совершенно разные вещи. И еще имя переменной не может начинаться с цифры. Допускается использование русских букв и знаков подчеркивания. Пример: $_переменная1 - верное название, а $25var - неверное, т.к начинается с цифр.
Tip: Не рекомендуется использовать кириллицу для названий переменных - это правила хорошего тона.
А теперь выведем все текст еще одним способом, с помощью константы:
<?php
define("MY_CONST","Hello, Russia!");
echo MY_CONST; # выведет на экран: Hello, Russia!
?>
Как видите, для ввода констант используется функция define("имя", "значение"); Как вы уже заметили, в отличие от переменных, здесь не используется знак доллара ($). Имя константы тоже чувствительно к регистру.
В вышеприведенном коде вы могли заметить знак "#". Так в языке PHP обозначаются однострочные комментарии: все что стоит после этого знака до конца строки не будет проанализировано и отображено. Допустимо также использовать другие способы:
// Это однострочный комментарий в стиле языка С
/* А вот и многострочный комментарий в стиле C! */
Пользоваться комментариями мы будем часто и много, так что привыкайте =)
Рассмотрим еще один пример:
<?php
echo "Hello world!<br>";
echo "My name is Vasya!";
?>
Будет выведено с переносом на другую строку:
Hello world! My name is Vasya!
Так же существуют команды, иначе именуемые ESC-кодами (Можно использовать только обратную косую черту.):
\n - команда, полностью эквивалентная тегу <br> в HTML - перенос строки \$ - выведет символ доллара \\ - выведет обратную косую черту (простое \ не пройдет) \" - выведет кавычки. Кстати, это очень часто встречающаяся ошибка.
Итак, в этой главе мы разобрали, что такое язык php, что нужно для его успешного изучения, а также разобрались с основами всех основ - общим синтаксисом языка, заданием переменных и констант. Самые-самые простые скрипты вы уже сможете понять. Вдобавок мы будем дополнять их подробнейшими комментариями.
Итак, мы продолжаем мучить компилятор php. Сегодня мы узнаем: -что такое функция и чем ее есть -как писать в файлы -разберем пару рабочих скриптов
Go, Go, Go...
Итак, функции. Если объяснять совсем на двух пальцах, то это некое подобие функций в твоем организме (особенно выделительных). Как я думаю, вышеупомянутые функции у тебя регулярны и своевременны, а главное не вызывают ошибок приводящих к нерабочему состоянию всего организма. Так и в PHP. Функции - это часто посторяющиеся действия, которые для удобства отделили от общей кучи другий действий и в нужное время используют не переписывая код по новой.
Задать функцию в PHP просто, как два байта отслать:
function NAME (PARAMETR)
{
CODE;
}
Теперь поясним вышенаписаное. Ключевое слово function говорит о том что, нужно создать функцию с именем NAME (может быть любым) и параметром PARAMETR (параметров может быть много, а может и вообще не быть). В сам код функции можно написать все что угодно. Это у кого как с фантазией дело обстоит.
Первая функция.
Попробуем написать первую функцию. В ее задачу будет входить вывод фразы "Hello world".
function HW()
{
echo "Hello world!";
}
Как видно из строк выше, мы создали (написали) функцию с именем HW (от hello world) и между фигурными скобками написали код, который будет выполняться всякий раз, когда функция будет вызываться из общего кода. Заметь, наша функция пока не имеет... параметов, поэтому ничего нет между круглыми скобками после имени функции. Теперь попробуем вызвать новорожденную из того самого общего кода.
<?
#c '#' начинаются коментарии, не забывай. Кометарии не выполняются!
function HW()
{
echo "Hello world!";
}
# вызываем функцию
HW();
?>
Как видишь, все просто! Помни только, что сами по себе функции не работают их нужно вызывать. Когда я только изучал программирование вцелом, у меня возник вопрос: "А не проще ли тупо написать echo "Hello world!"; в скрипте и жить спокойно?". Далее мы разбереммся когда целесообразно использовать функции.
А оно мне надо?
Конечно надо! Это в данном примере все слегка нерационально. Вот, например, возмем пример из жизни: я хочу чтоб моя страница показывала пользователям моего прова одно, а всем остальным... все остальное :). Для этого я написал такой код:
<?
if ( getenv ( REMOTE_ADDR ) == '192.168.0.14') echo "Нифига не покажу! Сперва пиво, потом инфа!";
else include ('page_for_all.html');
?>
Вот и все. Пока меня не задобрят алкоголем с ip-адреса 192.168.0.14 никто ничего не увидит (вот так вымагают пиво у невинных ламеров - прим. потерянной совести), как говорится: "Дикриминация рулит"!
Немного поясню синтаксис новых функций и циклов. У каждого конечно сове мнение, но, имхо, IF правит миром. Мне этот ветвитель нравится больше всего, т.к. с его помошью можно делать _САМЫЕ_ непристойные вещи! Вот какова его логическая структура: if ( параметр условие значение ) делает то-то else то-то. В нашем случае параметр - это ip-адрес ущемляемого ламера, условие == (равно, бывает еще != - не равно, < > - меньше больше, <= меньше либо равно, >= больше либо равно) значение - 192.168.0.14. В итоге получаем: если (ip-жертвы равно 192.168.0.14), то пишем.... если нет - "вклеиваем" страницу. Идем далее. Функция getenv (переменная окружения) - читает переменную окружения.
Немного остановимся на этих самых переменных. Их очень много, каждая несет в себе какую-либо информацию о параметрах веб-сервера, системы и т.д. Напрмер переменная REMOTE_ADDR содержит в себе ip-адресс посетителя страницы. Эту переменную передает браузер или прокси-сервер, через который ты сидишь (если ты вообще пользуешься прокси). Все доступные переменные окружения можно посмотреть на своем сервере используя простой скрипт, который я выложил на своем сайте (http://iprit.h10.ru/index.php?part=sources. Скрипт называется getenv.pl).
Далее у нас идет функция include ('что вставляем'). Ее назначение просто, как назначение кнопки "пуск" в твоих виндах - она вставляет содержание файла, который передается ей как параметр. Например, я хочу не переписывать на каждой странице html-код с логотипом сайта, рубрикатором и проч., тогда просто один раз пишем этот код в файл (например top.html) и просто в каждом файле, где необходимо, вставляем стороку include('top.html') ?> и все(!) - никаких запаров с SSI (вставки на стороне сервера)! Кстати сказать, php имеет массу преимуществ перед использованием SSI, т.к. можно варьировать то, что вставляем (как, например, в нашем случае).
Но опять возникает тот самый вопрос "а не проще ли тупо переписать код, вместо функции"? А нет! Мне вот, например, не хочется показывать только отдельные части страницы (напр.: рубрикатор и колонку новостей). И что? Каждый раз вставлять этот код. О...чень больших размеров тогда получится скрипт, дорогой товарищ! Проще, рациональнее и удобнее для понимания написать функцию (lamer_check) и вызывать ее где надо.
lamer_check
Итак, практическое применение функций. Задача: не допустить, что б ламер Федор не смог почитать новости на нашей странице. Напишем функцию, параметром которой служила бы страница, которую необходимо было бы вставить, если зашел не наш мученник Федор
function lamer_check ( $page )
{
if ( getenv ( REMOTE_ADDR ) == '192.168.0.14') echo "Нифига не покажу! Сперва пиво, потом инфа!";
else include ($page);
}
Поговорим немного о параметрах функций. В их роли может выступать строка, число, переменная и вывод другой функции. В нашем случае это переменная $page. Вот и все, если не вдаваться в подробности, что можно сказать о параметрах. Теперь разберем наш код.
function lamer_check ( $page ) - создает функцию lamer_check с параметром, который задан переменной $page.
if ( getenv ( REMOTE_ADDR ) == '192.168.0.14') echo "Нифига не покажу! Сперва пиво, потом инфа!"; - эту сроку можно перевести как "если адрес пользователя" равен 192.168.0.14, то написать "Нифига не покажу! Сперва пиво, потом инфа!"....
else include ($page) - ..., если нет, то выставить текст из фйла, путь к которому задан переменной $page.
На практике
Как видишь, с помощью функций очень удобно структурировать задачи, разбивая их на более мелкие шаги и реализуя их в виде функций.
Пишите... логи мелким подчерком
Теперь попробуем сотворить что-то еще более асоциальное. Ну, напрмер, логгер посещений. Для тех кто в танке: логгер - программа для записи логов, лог - файл с информацией о каких-либо событиях в хронологической последовательности. Мы в лог будем писать ip-адрес посетителя, его браузер и время, когда он зашел на нашу страницу. Все функции нам уже более менее знакомы, если что, то я буду рассказывать на новинках подробней. Для начала код логгера:
<?
#Logger v0.01
#путь к файлу с будушими логами
$log_path='./log.txt';
#берем из переменной окружения ip-адрес посетителя...
$user_ip=getenv(REMOTE_ADDR );
#... и его тип браузера
$user_brouser=getenv(HTTP_USER_AGENT);
#узнаем сегодняшнее число и время
$curent_time=date("d-m-y-H-i-s");
#Компануем все данные в одну строку (для удобства)
$log_string="$user_ip $user_brouser $curent_time\n";
#открываем файл для добавления в него (все добавляется в конец старого файла)
$file=fopen($log_path,"a");
#пишем в файл приготовленную строку
fwrite($file, $log_string, strlen($log_string));
закрываем файл
fclose($file);
#все :)
?>
Вот такой вот небольшой скрипт (особенно если убрать коментарии). Итак? разберем по-немногу работу с файлами. Для этого используется несколько основных функций: fopen, fwrite, fread (о ней мы поговорим в следующих частях) и fclose. Рассмотрим их по порядку появления в скрипте.
Посмотрим, что говорит на тему fopen мануал по php:
fopen
fopen -- открыть файл или URL
Описание int fopen(string filename, string mode);
Если filename начинается с "http://" (без учета регистра), открывается соединение HTTP 1.0 с указанным сервером и возвращается указатель файла, нга начало текста ответа. Поскольку редиректы HTTP не обрабатываются, вы должны включать в указание директории завершающие слеши.
Если filename начинается с "ftp://" (без учета регистра), открывается ftp соединение с указанным сервером и возвращается указатель на искомый файл. Если сервер не поддерживает режим пассивного ftp, данная операция завершится ошибкой. Вы можете открывать файлы как для чтения, так и для записи через ftp (но не обе операции одновременно).
Если filename начинается как-нибудь иначе, откравается файл вашей файловой системы, и возвращается указатель на открытый файл.
Если при открытии файла происходит ошибка, функция возвращает false.
mode выбирается из следующего списка:
- 'r' - Открыть только для чтения, помещает указатель на начало файла.
- 'r+' - Открыть для чтения и для записи, помещает указатель на начало файла.
- 'w' - Открыть только для записи, помещает указатель на начало файла и очищает все содержимое файла. Если файл не сществует, создается новый файл
- 'w+' - Открыть для чтения и для записи, помещает указатель на начало файла и очищает все содержимое файла. Если файл не сществует, создается новый файл.
- 'a' - Открыть только для записи, помещает указатель на конец файла. Если файл не сществует, создается новый файл.
- 'a+' - Открыть для чтения и для записи, помещает указатель на конец файла. Если файл не сществует, создается новый файл.
mode также может содержать символ 'b'. Используется в системах, различающих бинарные и текстовые файлы (не используется в Unix). Если данное значение не имеет смысла, оно игногрируется.
Вроде все понятно. У нас используется тип a - "Открыть только для записи, помещает указатель на конец файла. Если файл не существует, создается новый файл". Файл для открытия log.txt, который находится в одном каталоге со скриптом.
fwrite
fwrite -- бинарная запись в файл
Описание
int fwrite(int fp, string string, int [length]);
fwrite() записывает содержимое string в файловый поток, указанный fp. Если аргумент length присутствует, запись останавливается после записи length-го байта, или после записи всей строки string.
У нас используется строка с подготовленными данными о пользователе, а файловый поток - открытый лог-файл.
fclose
fclose -- close an open file pointer
Описание
int fclose(int fp);
Указатель на файл fp закрывается. Возвращает true при удачной операции и false при ошибке.
Указатель должен быть действующим и указывать на файл, успешно открытый fopen()
Ну тут думаю без коментариев. Просто закрывает открытый файл.
Пожалуй, на этом мы сегодня остановимся. Прощаюсь с Вами до следующего раза, поговорим опять о чем-нибудь полезном и интересном. Учите php. Пока!
|