- •Оглавление
- •Что такое интернет
- •Готовимся к созданию Web-страниц
- •Железо, железо и еще раз железо...
- •Домашняя эргономика — безопасность прежде всего!
- •Программное обеспечение для Web-мастера
- •Выбор хостинга
- •Знакомьтесь — РНР
- •История создания РНР
- •Установка РНР
- •Настройка РНР для Apache
- •Виртуальные хосты в Apache
- •Тестирование РНР
- •Установка и настройка дополнительных модулей
- •Переносимость и совместимость
- •Синтаксис РНР
- •Возможности РНР
- •Работа с базами данных
- •HTTP-аутентификация средствами РНР
- •Работа с изображениями
- •Поддержка закачки файлов
- •Поддержка HTTP-cookie
- •Использование регулярных выражений
- •Обработка ошибок
- •Управление электронными письмами
- •Вывод на экран и переменные в РНР
- •Простейшие арифметические операции
- •Простейшие логические операции
- •Циклы
- •Массивы
- •Работа со строками
- •Сессии
- •Программирование на РНР
- •Сравнение чисел
- •Вложение файлов в документ
- •Простейший счетчик посещений
- •Обработка форм
- •Отправление почты
- •Отправление письма в HTML-формате
- •Дата по-русски
- •Счетчик посещений с использованием базы данных
- •Счетчик персональной посещаемости
- •Сохраняем информацию о посещениях
- •Ах, баннеры, баннеры...
- •Счетчик посещений с выводом информации на экран
- •Счетчик сессий
- •Создание динамического меню
- •«Грабим» странички
- •Голосование на сайте
- •Гостевая книга
- •Технология создания
- •Свой чат — это просто
- •Использование специального привата
- •Интернет-магазин
- •Технология создания
- •Сервисы интернет-магазина
- •Архив рассылок
- •Совет первый: а нужно ли вам это?
- •Совет второй: забудьте все советы
- •Пример системы безопасности
- •HTTP-аутентификация в РНР
- •Защита программы
- •РНР в вопросах и ответах
- •Приложения
- •Приложение 3. Некоторые функции РНР
- •Приложение 4. Cookie
- •Приложение 5. Методы передачи данных POST и GET
- •Приложение 6. Время Unix
Массивы |
|
71 |
Массивы
Массивы представляют собой ряд чисел или знаков, и имеют, как и все переменные, имя и значение. Но кроме этого они обладают индексом. Попробую пояснить. Допустим, вы стоите перед одноэтажным домом, в котором есть десять квартир. Дом — это определение, или имя, массива, а квартиры — это ячейки, которые в массиве доступны, как и любая переменная в РНР. Все массивы начинаются, как правило, с нуля, но это не принципиально, как нам удобно, так можем и начинать, хоть с 3423. Но правильнее, конечно, начать отсчет с нуля. Итак, первая квартира имеет имя $дом[квартира номер 0], вторая квартира — $дом[квартира номер 1], третья— $дом[квартира номер 2] и т.д. до девятой квартиры — $дом [квартира номер 8].
Обратите внимание: элементов массива 9, а последний индекс — 8. Здесь скрыта опасность запутаться, но если все четко себе представлять, такого не произойдет.
Таким образом, массивы в РНР выглядят так: $имя массива [индекс]. Имя может быть каким угодно, как и имя любой другой переменной. Индекс может быть либо числом, переменной, либо его может вообще не быть. В этом, нежелательном случае будет выбрана или записана ячейка массива, следующая за той, к которой было произведено последнее обращение в массиве. Например:
<?php
а [] = 1;
а[] = 67456;
а[] =0 "пример";
?>
В этом случае будет создан массив с именем $а и в его ячейки 0, 1 и 2 введены значения 1, 67456 и пример соответственно. Теперь достаточно дать команду echo $а [ 2 ] ; и на экран будет выведено слово «пример».
72 |
Знакомьтесь — РНР |
|
|
|
|
При таком задании массива может возникнуть проблема. Если массив с таким именем уже был определен раньше и в него были введены данные, то ввод данных продолжится с того индекса (точнее, именно с внутреннего указателя, а он может быть установлен и не на самый конец массива, хотя, как правило, это именно так), на котором ввод данных был прерван. Избежать этого можно, если явно указывать значение индекса ячеек — не $а[], а $а[0], $а[1], $а [2] и т.д. Или не путаться с именами массивов.
Рассмотренные нами массивы — одномерные. Бывают еще многомерные. Например, двумерные массивы можно тоже сравнить
сдомом, но не с одноэтажным, а, например, с пятиэтажным.
Вэтом случае добавляется еще один индекс для учета смещения по этажам. Например:
$ д о м [ п е р в ы й |
э т а ж ] |
[ к в а р т и р а |
номер |
0 ] ; |
$ д о м [ в т о р о й |
э т а ж ] |
[ к в а р т и р а |
номер |
0 ] ; |
$ дом[пятый |
этаж] |
[ к в а р т и р а |
номер |
0 ] ; |
С ячейками массива можно делать все то же, что и с любыми переменными РНР: применять арифметические, логические, операции сравнения, увеличения, уменьшения и т.д. А еще есть очень хорошая возможность, о которой нельзя не упомянуть.
РНР позволяет считать в любой массив целый файл, что дает большие перспективы и интересные возможности. Без такой функции не обходится ни один серьезный скрипт. Вот ее формат:
<php
$а = file ("имя файла");
?>
После выполнения этой команды в массиве $а будет находиться содержимое файла, имя или путь, к которому были указаны. Разделителем для разных элементов массива будет являться перевод
Массивы |
73 |
строки. Кстати, путь типа " h t t p : //...", как правило, не поддерживается. Он может быть только относительным. Это связано с безопасностью. Если на сервере (точнее, в настройках РНР) включен режим SafeMode, такие пути просто исключаются из запросов, и вы получите на экране сообщение об ошибке доступа. Хотя можете попробовать, вдруг у вас работает? А уж дальше что вы будете делать с полученной информацией — дело ваше.
Каждый массив имеет внутренний указатель, который определяет текущий элемент массива. В самом начале работы с массивом внутренний указатель находится на первом элементе. Функции end (), next (), prev () и reset () перемещают внутренний указатель массива. .
Функция end () устанавливает внутренний указатель массива на последнем элементе, next () передвигает внутренний указатель массива в сторону увеличения (т.е. вперед) и возвращает следующий элемент массива от текущей позиции внутреннего указателя массива или false, если элементов больше нет. Если массив содержит пустые элементы, то эта функция возвратит false и для этих элементов.
Функция prev () перемещает внутренний указатель массива в сторону уменьшения индекса (т.е. назад) и возвращает предыдущий элемент массива или false, если перед текущим нет элементов. Если массив содержит пустые элементы, то функция также возвратит false.
Функция reset <) устанавливает внутренний указатель массива на первом элементе.
Функция current {) возвращает элемент массива, на который в данный момент указывает внутренний указатель. Она не перемещает сам указатель. Если внутренний указатель находится в конце списка элементов, current () возвращает false. Если массив содержит пустые элементы (0 или пустую строку), то функция возвратит false для каждого из них.
Функция sort () сортирует массив по возрастанию, в том числе по латинскому и русскому алфавиту, так как русские буквы тоже имеют индекс, только несколько больший в отличие от латинских.
74 |
Знакомьтесь — РНР |
Функция r s o r t ( ) |
сортирует массив в обратном порядке (по |
убыванию). |
|
Конечно, это далеко не все функции, которые есть в РНР для работы с массивами. Но остальные —- достаточно специфичные. Рассмотренных нам вполне хватит для полноценной работы и для написания своих собственных программ.
Работа со строками
Строка — тип данных, значениями которого являются последовательности знаков (причем цифры могут выступать в роли строки наравне с другими символами). Строка также может состоять из одного символа или вообще быть пустой. Работа со строкой всегда начинается с ее ввода. Самое простое — присвоить переменной нужную строку. Вариантов как всегда много — или прочитать из файла, или выбрать из массива, или из формы, в которую пользователь введет информацию. Нужно четко представлять, что нам необходимо сделать дальше со строкой или набором строк. Несколько строк можно, например, объединить (еще говорят «склеить»). Для этого между строками достаточно поставить точку. Например:
<?php
$str = "Привет,";
$sto = "мир";
$qwe = " ! " ;
$mir = $str. " ".$sto; echo $mir.$qwe;
?>
В результате работы этого скрипта на экране появится надпись «Привет, мир», «собранная» из нескольких частей.
Если переменная не определена, она по умолчанию приравнивается к пустой строке. Однако это не число ноль, так как непосредст-
Работа со строками |
75 |
венно со строкой нельзя выполнить арифметическую операцию. Впрочем, если переменная все же действительно не определена заранее, выполнить операцию сложения, например, получится, так как переменные автоматически стремятся принять более правильный тип и станут целочисленными.
Если вы присваиваете переменной нужное значение, то оно, как правило, не нуждается в обработке, так как программист делает присвоение в коде программы, и конечно, в нужном виде. Но если строка считывается из файла или получается посредством формы, она (символьная строка) нуждается в обработке.
Самое первое, что стоит сделать, — удалить повторяющиеся пробелы. Для этого в РНР есть специальная функция: chop (str) ; Например:
$ st r = cho p ( $ str) ;
В результате обработанное значение строки $str не будет содержать повторяющихся пробелов.
Если нужно убедиться в том, что строка не содержит пробелов в начале и в конце, применяется функция trim (str) ; Например:
$ s t r = trim ( $ s t r ) ;
Когда требуется удалить пробелы только в начале строки, нужно использовать функцию ltrim ().
Иногда бывает полезно проверить регистр символов. Функция u c f i r s t () делает первый символ в строке заглавным, независимо от того, каким он был до этого.
Есть и функция для перевода во всех словах в строке их первых букв в заглавные — ucwords (str); Кроме того, очень часто бывает необходимо сравнить строку с некоторым шаблоном. Частный случай — поиск в строке. Но нет никакой гарантии, что полученная строка введена пользователем или получена из файла в правильном виде. Другими словами, строка может содержать в середине слова или предложения чередующиеся строчные и прописные символы. Решение данной проблемы — в применении функций strtolower (str) ; (переводит строку в нижний
76 |
Знакомьтесь — РНР |
регистр) и strtoupper (str) ; (переводит строку в верхний регистр). Комбинирование всех этих функций приводит к корректному построению строки независимо от того, как она была введена или получена в начальном виде.
СОВЕТ
Функции обработки строк можно применять при проверке на соответствие логинов и паролей. Это не даст посетителям возможности использовать хитрые комбинации из маленьких и больших букв для создания похожих логинов.
Еще одна необходимая вещь при работе со строками — их обрезка. Она часто применяется при обработке форм для ввода данных. Представьте, что кто-нибудь из ваших «доброжелателей» введет в
форму вашей гостевой книги текст этой книги. Как думаете, что получится? Чтобы избежать подобной ситуации, и нужно ограничить количество вводимых символов в любом поле формы. Сначала, конечно, нужно задать ограничение в HTML-коде самой формы:
<input maxlength="100" name="form">
Теперь форма с именем «form» ограничена в количестве вводимых символов числом 100. Но это еще далеко не все. Дело в том, что обойти такое ограничение очень просто, и нужно оно скорее для того, чтобы показать посетителю предел ограничения. Такие ограничения обходят следующим образом. Делают точно такую же страничку (пользователь может просмотреть ее код в любом браузере), изменяют число 100 на нужное, сохраняют ее у себя на диске с расширением HTML и запускают со своего компьютера. Серверу ведь все равно, откуда получать информацию (если не задать проверку в коде), он нормально воспримет такую подмену и обработает полученные данные. Чтобы запретить обрабатывать такие данные, нужно в обработчике проверять, откуда именно происходит ввод и каков размер полученных данных.
Для этого нужно воспользоваться РНР-функцией substring (string, s t a r t , length). Для нашего примера это будет выглядеть так:
Работа со строками |
77 |
$form = substr($form,0,99);
Этим вы просто отрезаете часть полученной строки, превышающую 100 символов (указывается цифра 99, так как счет символов начинается с нуля). Теперь все попытки ваших посетителей завалить вас информацией будут тщетны, так как ваш умный скрипт не пропустит больше определенного вами количества символов.
Собственно говоря, у функции substr совсем другое предназначение. Она возвращает часть строки string, определяемую параметрами start (начало) и length (длина). Если параметр start положительный, то возвращаемая строка будет начинаться с символа, который стоит на позиции start строки string. Например:
$form = substr("abcdef", 1); // вернет "bcdef"
$form = substr("abcdef", 1, 3); // вернет "bed"
Если параметр start отрицательный, то возвращаемая строка будет начинаться с символа, который стоит на позиции s t a r t от конца строки string. Например:
$rest |
= |
substr ("abcdef", |
-1); |
// |
вернет |
"f" |
$rest |
= |
substr ("abcdef", |
-2); |
// |
вернет |
"ef" |
$rest = substr("abcdef", |
-3, 1); |
// вернет "d" |
||||
Если параметр length указан и он положительный, то возвращаемая строка закончится через length символов от начала start. Это приведет к строке с отрицательной длиной (потому что начало будет за концом строки), поэтому возвращаемая строка будет содержать один символ от начала строки start . Если length указан и он отрицательный, то возвращаемая строка закончится за length от конца строки string. Это опять приведет к строке с отрицательной длиной, поэтому возвращаемая строка будет содержать один символ от начала строки start. Например:
$rest = substr("abcdef", - 1, -1) ; // вернет "bede" Вот такая полезная функция.
