- •Оглавление
- •Что такое интернет
- •Готовимся к созданию Web-страниц
- •Железо, железо и еще раз железо...
- •Домашняя эргономика — безопасность прежде всего!
- •Программное обеспечение для Web-мастера
- •Выбор хостинга
- •Знакомьтесь — РНР
- •История создания РНР
- •Установка РНР
- •Настройка РНР для Apache
- •Виртуальные хосты в Apache
- •Тестирование РНР
- •Установка и настройка дополнительных модулей
- •Переносимость и совместимость
- •Синтаксис РНР
- •Возможности РНР
- •Работа с базами данных
- •HTTP-аутентификация средствами РНР
- •Работа с изображениями
- •Поддержка закачки файлов
- •Поддержка HTTP-cookie
- •Использование регулярных выражений
- •Обработка ошибок
- •Управление электронными письмами
- •Вывод на экран и переменные в РНР
- •Простейшие арифметические операции
- •Простейшие логические операции
- •Циклы
- •Массивы
- •Работа со строками
- •Сессии
- •Программирование на РНР
- •Сравнение чисел
- •Вложение файлов в документ
- •Простейший счетчик посещений
- •Обработка форм
- •Отправление почты
- •Отправление письма в HTML-формате
- •Дата по-русски
- •Счетчик посещений с использованием базы данных
- •Счетчик персональной посещаемости
- •Сохраняем информацию о посещениях
- •Ах, баннеры, баннеры...
- •Счетчик посещений с выводом информации на экран
- •Счетчик сессий
- •Создание динамического меню
- •«Грабим» странички
- •Голосование на сайте
- •Гостевая книга
- •Технология создания
- •Свой чат — это просто
- •Использование специального привата
- •Интернет-магазин
- •Технология создания
- •Сервисы интернет-магазина
- •Архив рассылок
- •Совет первый: а нужно ли вам это?
- •Совет второй: забудьте все советы
- •Пример системы безопасности
- •HTTP-аутентификация в РНР
- •Защита программы
- •РНР в вопросах и ответах
- •Приложения
- •Приложение 3. Некоторые функции РНР
- •Приложение 4. Cookie
- •Приложение 5. Методы передачи данных POST и GET
- •Приложение 6. Время Unix
Часть IV
Программирование на РНР
Сравнение чисел
Задача: если числа равны — вывести сумму чисел, если числа не равны — выбрать большее и вывести его на экран. Решение:
1<?php
2$w = "4"; // первое число
3$е = "6"; // второе число
4if ( $w == $е )
5{
6echo $w + $e; // если первое и второе равны, выводим их сумму
7exit;
8}
9if ( $w > $е ) { echo $w; } else { echo $e; }
10// если нет — и одно больше другого — выводим числа
11exit;
12?>
Опишем скрипт. Заданы два числа (строки 2—3). Сначала пытаемся проверить, равны числа или нет (строка 4). Обратите внимание на двойной знак равенства в операторе if. Дело в том, что если оставить тут один знак равенства, то переменной $w будет присвоено значение переменной $е. А в нашем случае надо проверить, равны ли переменные. Это и достигается двумя знаками
равенства. Другими словами, если вам надо провести сравнение, равны ли две переменные, не забудьте поставить два знака равенства. Поставите один — будете очень долго искать правды от вашего скрипта, а он упорно не будет работать.
Если числа равны, выводим их сумму, используя знак сложения между переменными и функцией echo (строка 6), а потом завершаем скрипт, если это надо командой e x i t . Команду завершения в этом месте можно было бы не ставить, в этом случае интерпретатор стал бы дальше обрабатывать код, и в конце его нашел бы ту же команду в строке 11, но это заняло бы определенное время. Старайтесь не заставлять интерпретатор производить ненужные действия, и он отплатит вам приличной скоростью работы.
Если же числа не равны, код вывода на экран суммы (обратите внимание, что он заключен в фигурные скобки) будет проигнорирован, и интерпретатор продолжит свою работу и станет проверять, какая из переменных больше (строка 9). Очевидно ведь, что если значения переменных не равны, то одно из них больше, а другое меньше.
Итак, если $w > $е, выводим на экран $w, так как она больше. А если условие не удовлетворяется, интерпретатор считает, что $w <= $е, и выполняется конструкция в скобках после else — { echo $e; }. Но так как на равенство мы уже проверяли переменные в начале скрипта (в строке 4), то эта конструкция выполнится, только если $w < $е. Вот тут нам и пригодился оператор e x i t в строке 7, так как если бы его не было, то при равенстве переменных на экран, кроме суммы переменных, была бы выдана переменная $е.
После обработки всех строк интерпретатор завершает свою работу, а браузеру передается результат в виде одного числа.
Еще один оператор, при помощи которого можно сравнить переменную или выражение с различными значениями и выполнить разные фрагменты кода в зависимости от того, чему будет равно значение выражения, -- это switch. Как всегда, лучше понять смысл на примере:
82 |
|
Программирование н |
<?
function date_format($date)
// функция получает значение переменной $date
{
$year = substr($date, 0, 4);
//переменной $уеаr присваиваем первые четыре символа //от $date
$month = substr($date, 4, 2};
//переменной $month — символы с пятого по шестой $day = substr ($date, 6, 2};
switch ($month)
//конструкция switch($month) делает следующее:
//берется значение $month и проверяется на равенство
//условию case хх:
{
case 01: $month = "Января"; break; case 02: $month = "Февраля"; break; case 03: $month - "Марта"; break; case 04: $month = "Апреля"; break; case 05: $month = "Мая"; break; case 06: $month = "Июня"; break; case 07: $month = "Июля"; break; case 08: $month = "Августа"; break;
case 09: $month = "Сентября"; break; case 10: $month = "Октября"; break; case 11: $month = "Ноября"; break; .
Вложение файлов в документ |
83 |
case 12: $month = "Декабря"; break;
}
$date = "$day $month $year г."; echo $date;
}
$date = date("Ymd");
//вызываем функцию date() с необходимыми нам параметрами date_format ($date) ;
//передаем полученное значение в функцию date_format ()
?> Вот как можно применить на практике сравнение чисел.
Вложениефайловвдокумент
Каждый, сделавший хоть одну страничку в Сети, сталкивался с проблемой изменения тех или иных данных на ней. Конечно, это не сложно, когда страница одна или их несколько. Но если вы сделали большой сайт, маленькое дополнение (например, строка в меню) в сотни файлов может превратиться в настоящий кошмар.
РНР быстро решает эту проблему, позволяя вкладывать одну страницу в другую. Достигается это с помощью операторов require () и include (). После этих операторов в круглых скобках должен стоять путь к вкладываемому файлу. Например: include ("text.phtml"). Различие между указанными операторами заключается в том, что require () подменяется содержимым указанного (файла и может быть использован только один раз, a include () вставляет и выполняет содержимое указанного
84 |
Программирование на РНР |
файла, что позволяет применить его несколько раз, например в цикле. В любом случае добавляемый код надо заключить в конструкцию <?php ... ?>.
Рассмотрим подробнее различия этих двух операторов. Я уже упоминал, что РНР частично является компилятором, так как при обработке преобразовывает код в свое внутреннее представление. Когда интерпретатор доходит до оператора include (), он останавливается и запускает работу программы с начала или
смомента прежней остановки. И только после выполнения этого участка кода вызывает файл, указанный в include (). В случае
сrequire () действия интерпретатора совсем иные. Он сразу обрабатывает указанный файл, не делая никаких остановок на выполнение предыдущего уже обработанного кода. Таким образом, скорость обработки require () значительно выше за счет отсутствия остановки на дополнительное вложение и обработку. Однако использовать в цикле или в условии require () уже не получится, в таких случаях нужен именно include ().
Вложения файлов могут происходить только внутри серверного пространства, доступного РНР. Другими словами, вы не можете использовать в имени файла h t t p : //, если только это не разрешено в настройках сервера.
Достаточно часто встречаются сайты, ссылки на которые включают в себя специальные символы — &, ?, %. Все это может быть признаком выполнения РНР-скрипта. Дело в том, что если ссылку написать так: адрес?имя=значение, то переменная с этим именем будет доступна под этим же именем в файле, на который указывает ссылка.
Например, ссылка http://name.com/index.phtml?lex=7 указывает на файл index.phtml. Но если на нее щелкнуть, файл будет запущен на сервере с инициализированной переменной РНР $1ех со значением 7. Этот прием позволяет легко передать программе нужные данные. Метод такой передачи называется GET. Еще есть, например, метод POST (СМ. приложение 5).
Если необходимо добавить несколько переменных, то они могут быть разделены знаком &. Теперь мы можем сделать сайт, кото-
Вложениефайловвдокумент |
85 |
рый будет доступен с помощью только одной страницы. А всю остальную информацию эта страница будет выводить на основании полученных по ссылке данных.
Выглядеть ссылка может следующим образом: h t t p : / / и м я / index.phtml?link=l Единица в конце ссылки и есть наш параметр, который будет подставляться в файле index.phtml. Например:
<html>
... начало файла ...
<?php $url = "";
if (Slink == 1) { $url = "name1.phtml"; } if ($link == 2} { $url = "name2.phtml"; } if ($link == 3) { $url = "nameЗ.phtml"; } if ($link == 4) { $url = "name4.phtml"; } if ($url == "") { $url = "error.phtml"; } include ($url);
... конец файла ...
</html>
Обратите внимание, написанный нами код в строке if ($url == "") { $url = " e r r o r . p h t m l " ; } учитывает ситуацию, когда посетитель по разным причинам указал неправильный параметр. В этом случае выводится заранее заготовленная страница с сообщением об ошибке — error.phtml. Если же параметр соответствует какому-либо файлу сайта, он вкладывается в код файла index.phtml и исполняется.
Таким образом, начало и конец кода всегда остаются одинаковыми, а изменяется только середина. И какие-либо глобальные изменения уже не кажутся такими страшными, как раньше. Ведь
86 |
Программирование на РНР |
сделать их надо только в одном файле, а отразится это на всем сайте.
А вот то же самое, только более хитрым способом:
<html>
... начало файла ...
<?php
include ("name".$link. ".phtml");
?>
... конец файла ...
</html>
Результат работы абсолютно идентичен первому скрипту, за исключением того, что страница с сообщением об ошибке теперь стала называться просто name.phtml.
Есть и другой случай использования в адресе специальных символов. Его суть заключается в том, что у РНР есть доступ к так называемым переменным окружения сервера. Одна из этих переменных — запрашиваемый посетителем относительный путь к странице на сайте. И этот путь становится нам доступен для использования.
В этом случае ссылки будут следующего вида: http://имя/ index.phtml?patch/name.phtml. Вторая часть ссылки — patch/ name .phtml — будет доступна, если мы считаем параметр
Например:
$add = $QUERY_STRING
Изменим наш основной файл index.phtml так, чтобы все работало автоматически. А если запрашиваемый параметр не будет указан (правильно говоря — будет равен пустой строке), присвоим переменной $add имя файла, который должен быть открыт как
Абсолютный путь — это полный адрес страницы в интернете, например http://www.my_site.com/page_l/info.html. Относительный путь учитывает только дополнения к основному адресу, в нашем случае — это page_l/info.html.
{Примеч.ред.)
Вложение файлов в документ |
87 |
|
|
|
|
главная страница. Пусть это будет main.phtml. Тогда код будет выглядеть следующим образом:
<html>
... начало файла ...
<?php
$add = $QUERY_STRING;
if ($add == "") { $add = "main.phtml"; } include ($url);
?>
... конец файла ...
</html>
СОВЕТ
Вот вам и пример оптимизации. Строку кода if ($add == "") { $add = "main.phtml"; } можно (и нужно) писать так: if (!$add) { $add = "main.phtml"; } Восклицательный знак перед именем переменной указывает на ее ложность. Другими словами, переменная равна пустой строке. Таким образом, смысл кода остается прежним, а написание и удобочитаемость значительно улучшаются.
Обратите внимание, что этот метод хоть и проще первого, но он открывает путь к получению информации о сервере, на котором расположен сайт с такой организацией структуры. Злоумышленник или просто любопытный человек при наличии знаний и стечении определенных обстоятельств сможет много узнать о вашем сервере, а это открывает прямой путь к «взлому». Еще один отрицательный момент такого метода заключается в потере гибкости управления и организации сайта. Вы сразу лишаете себя многих полезных возможностей, например, очень сложно становится передать в исполняемый файл какую-либо переменную из адресной строки, а иногда это нужно.
По этим причинам отнеситесь к этому методу, как к примеру, и старайтесь не использовать его в жизни.
