PHP. Рецепты программирования

Дэвид Скляр Адам Трахтенберг

Оглавление



ОБ АВТОРАХ 1
ПРЕДИСЛОВИЕ 3
Для кого эта книга 3
Что вы найдете в этой книге 3
Web-сайты 5
Соглашения, принятые в этой книге 6
Благодарности 6

ГЛАВА 1. СТРОКИ 9
1.1. Обзор 9
1.2. Доступ к подстрокам 12
1.3. Извлечение подстрок 13
1.4. Замена подстрок 15
1.5. Побайтная обработка строк 16
1.6. Перестановка слов или байтов в обратном порядке 18
1.7. Расширение и сжатие позиций табуляции 19
1.8. Управление регистром 21
1.9. Функции и выражения внутри строк 23
1.10. Удаление пробелов из строки 24
1.11. Разделение запятыми данных в строке 25
1.12. Синтаксический анализ разделенных запятыми данных 27
1.13. Генерация записей данных, состоящих из полей фиксированной длины 28
1.14. Анализ записей данных фиксированной длины 29
1.15. Разбиение строк на подстроки 32
1.16. Перенос текста в строке заданной длины 35
1.17. Хранение двоичных данных в строках 36
1.18. Пример программы: загружаемый CSV-файл 39

ГЛАВА 2. ЧИСЛА 43
2.1. Обзор 43
2.2. Проверка, содержит ли переменная допустимое число 44
2.3. Сравнение чисел с плавающей точкой 45
2.4. Округление чисел с плавающей точкой 45
2.5. Работа с последовательностями целых чисел 47
2.6. Генерация случайных чисел в пределах заданного диапазона 48
2.7. Генерация смещенных случайных чисел 50
2.8. Вычисление логарифмов 51
2.9. Вычисление степеней 51
2.10. Форматирование чисел 52
2.11. Форматирование значений денежных единиц 53
2.12. Единственное и множественное число 55
2.13. Вычисление тригонометрических функций в радианах 56
2.14. Вычисление тригонометрических функций в градусах 57
2.15. Обработка очень больших или очень маленьких чисел 57
2.16. Преобразования чисел с разными основаниями 59
2.17. Выполнение вычислений над недесятичными числами 60
2.18. Вычисление расстояния между двумя географическими точками 61

ГЛАВА 3. ДАТА И ВРЕМЯ 63
3.1. Обзор 63
3.2. Обнаружение текущей даты и времени 64
3.3. Преобразование времени и даты к форме timestamp 67
3.4. Преобразование времени к покомпонентному представлению времени и даты 69
3.5. Вывод даты или времени в заданном формате 69
3.6. Временной интервал между двумя датами 74
3.7. Обнаружение разницы двух дат по Юлианскому календарю 76
3.8. Поиск дня недели, месяца или года 78
3.9. Проверка даты 80
3.10. Синтаксический разбор строк даты и времени 81
3.11. Сложение и вычитание дат 84
3.12. Вычисления времени при работе с часовыми поясами 85
3.13. Учет светлого времени дня 91
3.14. Генерация времени высокой точности 92
3.15. Создание диапазонов времени 93
3.16. Использование негригорианского календаря 95
3.17. Использование даты за пределами диапазона эпохи timestamp 99
3.18. Пример программы: Календарь 101

ГЛАВА 4. МАССИВЫ 105
4.1. Обзор 105
4.2. Задание массива, не начинающегося элементом 0 107
4.3. Хранение в массиве нескольких элементов под одним ключом 109
4.4. Инициализация массива для диапазона целых чисел 110
4.5. Выполнение итераций по элементам массива 110
4.6. Удаление элементов из массива 113
4.7. Изменение размера массива 114
4.8. Добавление одного массива к другому 117
4.9. Преобразование массива в строку 118
4.10. Печать массива с запятыми 120
4.11. Проверка присутствия ключа в массиве 121
4.12. Проверка наличия элемента в массиве 121
4.13. Обнаружение позиции значения в массиве 123
4.14. Поиск элементов, удовлетворяющих заданному требованию 124
4.15. Поиск в массиве элемента с наибольшим или наименьшим значением 125
4.16. Изменение порядка следования элементов в массиве на обратный 125
4.17. Сортировка массива 126
4.18. Сортировка массива по вычисляемому полю 127
4.19. Сортировка нескольких массивов 129
4.20. Сортировка массива с применением метода вместо функции 131
4.21. Хеширование массива 131
4.22. Удаление дублирующего элемента из массива 132
4.23. Применение функции к каждому элементу массива 133
4.24. Объединение, пересечение, исключение двух массивов 135
4.25. Обработка объекта как массива 137
4.26. Программа: печать HTML-таблицы с горизонтальными колонками 139

ГЛАВА 5. ПЕРЕМЕННЫЕ 141
5.1. Обзор 141
5.2. Возможные проблемы применения = = или = 142
5.3. Установка значения по умолчанию 142
5.4. Обмен значениями без использования временных переменных 144
5.5. Создание динамического имени переменной 144
5.6. Использование статических переменных 145
5.7. Совместное использование переменных процессами 147
5.8. Инкапсуляция сложных типов данных в строку 151
5.9. Формирование строки как части значения переменной 152

ГЛАВА 6. ФУНКЦИИ 157
6.1. Обзор 157
6.2. Доступ к параметрам функции 158
6.3. Установка значений параметров функции по умолчанию 159
6.4. Передача значений по ссылке 160
6.5. Использование именованных параметров 161
6.6. Функции с переменным числом аргументов 162
6.7. Возвращение значений по ссылке 164
6.8. Возвращение более одного значения 166
6.9. Пропуск выбранных возвращаемых значений 167
6.10. Неудачная попытка выполнения функции 168
6.11. Вызов функций в зависимости от переменной 169
6.12. Доступ к глобальной переменной внутри функции 171
6.13. Создание динамических функций 172

ГЛАВА 7. КЛАССЫ И ОБЪЕКТЫ 173
7.1. Обзор 173
7.2. Создание экземпляров объектов 177
7.3. Определение конструкторов объекта 177
7.4. Определение деструкторов объекта 179
7.5. Выполнение контроля доступа 180
7.6. Предотвращение изменений для классов и методов 182
7.7. Преобразование объекта в строку 183
7.8. Определение интерфейсов 185
7.9. Создание абстрактных классов 187
7.10. Копирование объекта по ссылке 189
7.11. Клонирование объектов 190
7.12. Изменение доступа к свойству в процессе исполнения 193
7.13. Вызов методов по объекту, возвращенному другим методом 196
7.14. Объединение объектов 197
7.15. Доступ к переопределенным методам 200
7.16. Использование полиморфизма 201
7.17. Определение констант класса 203
7.18. Определение статических свойств и методов 205
7.19. Управление сериализацией объекта 207
7.20. Исследование объектов 208
7.21. Проверка, является ли объект экземпляром конкретного класса 212
7.22. Автозагрузка файлов класса при объявлении объекта 214
7.23. Динамическое объявление объекта 216
7.24. Пример программы: whereis 217

ГЛАВА 8. ОСНОВНЫЕ WEB-ПОНЯТИЯ 219
8.1. Обзор 219
8.2. Установка сookies 220
8.3. Чтение значений cookies 221
8.4. Удаление сookies 222
8.5. Переадресация к другому местоположению 223
8.6. Определение браузера 224
8.7. Формирование строки запроса 225
8.8. Чтение тела запроса POST 226
8.9. Создание HTML-таблиц с чередующимися стилями строк 227
8.10. Механизмы авторизации пользователя — базовая аутентификация HTTP
и вставочная аутентификация 228
8.11. Использование cookies-аутентификации 232
8.12. Сбрасывание накопленного вывода браузеру 235
8.13. Буферизация вывода браузером 236
8.14. Сжатие результата вывода для Web 237
8.15. Чтение переменных среды 238
8.16. Установка переменных среды 239
8.17. Работа в качестве модуля сервера Apache 240
8.18. Пример программы: активатор/деактиватор учетной записи Web-сайта 241
8.19. Пример программы: Tiny Wiki 243

ГЛАВА 9. ФОРМА 247
9.1. Обзор 247
9.2. Обработка формы ввода 249
9.3. Проверка корректности ввода в форме: обязательное к заполнению поле 250
9.4. Проверка корректности ввода в форме: числа 251
9.5. Проверка корректности ввода в форме: адреса электронной почты 254
9.6. Проверка корректности ввода в форме: выпадающее меню 255
9.7. Проверка корректности ввода в форме: переключатели 257
9.8. Проверка корректности ввода в форме: флажки 258
9.9. Проверка корректности ввода в форме: даты и времена 259
9.10. Проверка корректности ввода в форме: кредитные карточки 260
9.11. Защита сценария 261
9.12. Работа с многостраничными формами 262
9.13. Повторный показ форм со вставленными сообщениями об ошибках 264
9.14. Принятие мер против многократного представления данных одной и той же формы 266
9.15. Обработка выгруженных файлов 268
9.16. Предотвращение внешнего изменения значений глобальной переменной 270
9.17. Обработка удаленных переменных с точкой в их именах 271
9.18. Использование элементов формы с несколькими опциями 272
9.19. Создание выпадающих меню, основанных на текущей дате 273

ГЛАВА 10. РАБОТА С БАЗАМИ ДАННЫХ 275
10.1. Обзор 275
10.2. Применение баз данных DBM 277
10.3. Применение базы данных SQLite 280
10.4. Соединение с базой данных SQL 282
10.5. Запрос к базе данных SQL 284
10.6. Получение строк без цикла 286
10.7. Модификация данных в базе данных SQL 287
10.8. Эффективное повторение запросов 288
10.9. Определение количества строк, возвращенных запросом 291
10.10. Экранирование кавычек 292
10.11. Ведение журнала ошибок и отладочной информации 294
10.12. Создание уникальных идентификаторов 295
10.13. Программное формирование запросов 297
10.14. Постраничные ссылки на последовательность записей 302
10.15. Кэширование запросов и результатов 305
10.16. Обращение к соединению с базой данных из любого места программы 307
10.17. Пример программы: хранение форума 309

ГЛАВА 11. СЕАНСЫ И ПОСТОЯНСТВО ДАННЫХ 317
11.1. Обзор 317
11.2. Отслеживание сеанса 317
11.3. Защита от похищения сеанса 319
11.4. Защита от фиксирования идентификатора сеанса 321
11.5. Хранение сеансов в базе данных 322
11.6. Хранение сеансов в совместно используемой памяти 323
11.7. Хранение произвольных данных в совместно используемой памяти 328
11.8. Кэширование результатов в сводных таблицах 329

ГЛАВА 12. XML 333
12.1. Обзор 333
12.2. Генерирование XML-документа в виде строки 335
12.3. Генерирование XML-документа с помощью DOM 337
12.4. Анализ простейших XML-документов 339
12.5. Анализ сложных XML-документов 342
12.6. Анализ больших XML-документов 344
12.7. Извлечение информации с помощью XPath 350
12.8. Преобразование XML с помощью XSLT 353
12.9. Установка параметров XSLT из PHP 355
12.10. Вызов PHP-функций из таблицы стилей XSLT 357
12.11. Проверка корректности XML-документов 360
12.12. Преобразование кодировки содержимого 362
12.13. Чтение лент новостей RSS и Atom 363
12.14. Создание RSS-лент новостей 365
12.15. Создание Atom-лент новостей 369

ГЛАВА 13. WEB-АВТОМАТИЗАЦИЯ 373
13.1. Обзор 373
13.2. Получение содержимого по URL-адресу с помощью метода GET 374
13.3. Получение содержимого по URL-адресу с помощью метода POST 379
13.4. Получение содержимого по URL-адресу с помощью cookies 381
13.5. Получение содержимого по URL-адресу с помощью произвольных заголовков 383
13.6. Получение содержимого по URL-адресу с применением произвольного метода 384
13.7. Получение содержимого по URL-адресу с использованием тайм-аута 386
13.8. Получение содержимого по URL-адресу через протокол HTTPS 388
13.9. Анализ необработанных данных при обмене по протоколу HTTP 389
13.10. Маркировка элементов Web-страницы 394
13.11. Коррекция ошибочного или нестандартного HTML-кода 397
13.12. Извлечение ссылок из HTML-файла 398
13.13. Преобразование простого текста в HTML-код 400
13.14. Преобразование HTML-кода в простой текст 401
13.15. Удаление тегов HTML и PHP из документа 402
13.16. Ответ на запрос Ajax 403
13.17. Интеграция с JavaScript 405
13.18. Пример программы: поиск устаревших ссылок 409
13.19. Пример программы: поиск обновленных ссылок 411

ГЛАВА 14. ОБРАЩЕНИЕ К WEB-СЛУЖБАМ 415
14.1. Обзор 415
14.2. Вызов метода REST 416
14.3. Вызов метода SOAP с использованием WSDL 417
14.4. Вызов метода SOAP без использования WSDL 419
14.5. Отладка SOAP-запросов 420
14.6. Применение сложных типов SOAP 421
14.7. Определение типов SOAP 422
14.8. Применение заголовков SOAP 423
14.9. Аутентификация и SOAP 425
14.10. Переопределение конечной точки 426
14.11. Обработка ошибок SOAP 428
14.12. Отображение типов XML Schema в PHP-классы 430
14.13. Вызов метода XML-RPC 431
14.14. Аутентификация и XML-RPC 433

ГЛАВА 15. СОЗДАНИЕ WEB-СЛУЖБ 435
15.1. Обзор 435
15.2. Обслуживание метода REST 435
15.3. Обслуживание метода SOAP 441
15.4. Прием аргументов SOAP-метода 444
15.5. Автоматическое генерирование WSDL-файла 445
15.6. Генерирование SOAP-ошибок 446
15.7. Обработка SOAP-заголовка 448
15.8. Генерирование SOAP-заголовка 451
15.9. Аутентификация в SOAP 452
15.10. Обслуживание метода XML-RPC 457

ГЛАВА 16. ИНТЕРНЕТ-СЛУЖБЫ 463
16.1. Обзор 463
16.2. Отправка электронной почты 464
16.3. Отправка MIME-почты 466
16.4. Чтение почты с помощью протокола IMAP или POP3 468
16.5. Отправка сообщений в группы новостей Usenet 470
16.6. Чтение сообщений Usenet 473
16.7. Прием и отправка файлов по протоколу FTP 477
16.8. Просмотр адресов на сервере LDAP 479
16.9. Аутентификация пользователей с помощью LDAP-сервера 481
16.10. Просмотр DNS 483
16.11. Проверка хоста 484
16.12. Получение информации о доменном имени 486

ГЛАВА 17. ГРАФИКА 489
17.1. Обзор 489
17.2. Рисование линий, прямоугольников и многоугольников 492
17.3. Рисование дуг, эллипсов и окружностей 493
17.4. Другие стили линий 495
17.5. Вывод текста 496
17.6. Вывод отцентрированного текста 498
17.7. Построение динамических изображений 502
17.8. Установка и чтение прозрачного цвета 504
17.9. Чтение данных в формате EXIF 505
17.10. Безопасная отправка изображений 507
17.11. Пример программы: генерирование гистограмм по результатам опроса 509

ГЛАВА 18. БЕЗОПАСНОСТЬ И ШИФРОВАНИЕ 513
18.1. Обзор 513
18.2. Предотвращение фиксирования идентификатора сеанса 514
18.3. Защита от подделки формы 515
18.4. Фильтрование входных данных 516
18.5. Защита от межсайтового скриптинга 516
18.6. Защита от SQL-инъекции 517
18.7. Хранение паролей вне каталогов сайта 518
18.8. Хранение паролей 519
18.9. Что делать при утере пароля 520
18.10. Проверка подлинности данных с помощью хешей 522
18.11. Шифрование и дешифрование данных 524
18.12. Хранение зашифрованной информации в файле или базе данных 529
18.13. Обмен зашифрованными данными с другим Web-сайтом 532
18.14. Распознавание SSL 534
18.15. Шифрование электронной почты с помощью GPG 535

ГЛАВА 19. ИНТЕРНАЦИОНАЛИЗАЦИЯ И ЛОКАЛИЗАЦИЯ 537
19.1. Обзор 537
19.2. Получение списка доступных локалей 538
19.3. Использование конкретной локали 539
19.4. Установка локали по умолчанию 540
19.5. Локализация текстовых сообщений 541
19.6. Локализация даты и времени 545
19.7. Локализация обозначений валюты 546
19.8. Локализация изображений 550
19.9. Локализация подключаемых файлов 551
19.10. Управление локализационными ресурсами 552
19.11. Расширение gettext 554
19.12. Установка кодировки символов в выводимых данных 555
19.13. Установка кодировки символов для входных данных 556
19.14. Манипулирование текстом в кодировке UTF-8 556

ГЛАВА 20. ОБРАБОТКА ОШИБОК, ОТЛАДКА И ТЕСТИРОВАНИЕ 561
20.1. Обзор 561
20.2. Поиск и направление синтаксических ошибок 562
20.3. Создание собственных классов исключений 563
20.4. Вывод содержимого стека 566
20.5. Чтение переменных конфигурации 567
20.6. Установка настроек конфигурации 569
20.7. Сокрытие сообщений об ошибках от пользователей 570
20.8. Настройка обработки ошибок 571
20.9. Использование собственного обработчика ошибок 573
20.10. Запись ошибок в журнал 574
20.11. Как избавиться от сообщений "headers already sent" 575
20.12. Запись отладочной информации в журнал 576
20.13. Работа с отладочным расширением 578
20.14. Создание автономного теста 584
20.15. Создание комплекта автономных тестов 586
20.16. Применение автономного теста к Web-странице 588
20.17. Настройка среди тестирования 589
ГЛАВА 21. ПОВЫШЕНИЕ ПРОИЗВОДИТЕЛЬНОСТИ
И ТЕСТИРОВАНИЕ НАГРУЗКИ 591
21.1. Обзор 591
21.2. Хронометраж выполнения функции 592
21.3. Хронометраж выполнения программы 593
21.4. Профилирование с помощью расширения Debugger 596
21.5. Тестирование сайта в условиях повышенной нагрузки 599
21.6. Как обойтись без регулярных выражений 600
21.7. Работа с акселератором 601

ГЛАВА 22. РЕГУЛЯРНЫЕ ВЫРАЖЕНИЯ 603
22.1. Введение 603
22.2. Переход с ereg на preg 606
22.3. Поиск соответствия словам 607
22.4. Поиск n-го вхождения слова 608
22.5. Выбор между "жадными" и "нежадными" шаблонами 610
22.6. Поиск в файле всех строчек, соответствующих шаблону 612
22.7. Выделение текста внутри HTML-тегов 612
22.8. Как исключить текст, соответствующий подшаблону 614
22.9. Экранирование специальных символов в регулярном выражении 616
22.10. Чтение записей с учетом разделителей 617
22.11. Использование PHP-функции в регулярном выражении 618

ГЛАВА 23. ФАЙЛЫ 623
23.1. Обзор 623
23.2. Создание или открытие локального файла 627
23.3. Создание временного файла 628
23.4. Открытие удаленного файла 629
23.5. Чтение из стандартного потока ввода 630
23.6. Чтение файла в строку 631
23.7. Подсчет строчек, абзацев или записей в файле 632
23.8. Обработка каждого слова в файле 636
23.9. Чтение произвольной строчки файла 637
23.10. "Перетасовка" строчек в файле 638
23.11. Обработка текстовых полей переменной длины 638
23.12. Чтение файлов конфигурации 639
23.13. Редактирование файла без создания временного файла 642
23.14. Сброс содержимого буфера вывода 643
23.15. Запись в стандартный поток вывода 644
23.16. Запись с применением нескольких дескрипторов файлов 645
23.17. Экранирование метасимволов оболочки 646
23.18. Передача входных аргументов программе 647
23.19. Чтение вывода программы через стандартный поток 648
23.20. Чтение вывода программы в стандартный поток сообщений об ошибках 650
23.21. Блокировка файла 651
23.22. Чтение и запись файлов нестандартных типов 654
23.23. Чтение и запись сжатых файлов 658
ГЛАВА 24. КАТАЛОГИ 661
24.1. Обзор 661
24.2. Получение и постановка отметок времени 664
24.3. Получение информации о файле 665
24.4. Изменение прав доступа к файлу и смена владельца 666
24.5. Разбивка имени файла на составляющие элементы 667
24.6. Удаление файла 669
24.7. Копирование или перемещение файла 669
24.8. Обработка всех файлов в каталоге 670
24.9. Получение списка имен файлов по шаблону 672
24.10. Рекурсивная обработка всех элементов каталога 673
24.11. Создание новых каталогов 674
24.12. Удаление каталога и его содержимого 675
24.13. Пример программы: список файлов и каталогов Web-сервера 676
24.14. Пример программы: поиск по сайту 680

ГЛАВА 25. КОМАНДНАЯ СТРОКА PHP 685
25.1. Обзор 685
25.2. Анализ аргументов программы 686
25.3. Анализ аргументов программы методом getopt() 688
25.4. Чтение ввода с клавиатуры 691
25.5. Выполнение PHP-кода для каждой строки входного файла 692
25.6. Чтение паролей 694
25.7. Пример программы: командная оболочка 696

ГЛАВА 26. PEAR И PECL 701
26.1. Обзор 701
26.2. Установщик PEAR 703
26.3. Поиск пакетов PEAR 706
26.4. Поиск информации о пакете 708
26.5. Установка пакетов PEAR 709
26.6. Обновление версий PEAR-пакетов 711
26.7. Удаление PEAR-пакетов из системы 712
26.8. Установка PECL-пакетов 713

Предметный указатель 715

XIV
Оглавление
XIII
Оглавление