11 December 2019
Автор: Колисниченко Денис Николаевич
Даны начала программирования на PHP: установка и настройка PHP и MySQL, выбор редактора PHP-кода, основы синтаксиса и самые полезные функции PHP. Рассмотрено создание дополнительных модулей - фотогалереи, RSS-граббера, гостевой книги, собственного шаблонизатора, применение шаблонизатора Smarty, работа с SMTP, POP, MP3 и сервисом reCAPTCHA. В качестве хранилища данных использованы два сервера - самая современная версия MySQL 6 и "суперлегкий" сервер баз данных SQLite. Показано, как с помощью технологии Ajax добиться обновления данных на странице без ее перезагрузки. Представлены два реальных проекта: универсальная CMS и система продажи недвижимости. В третьем издании подробно рассмотрена программа phpMyAdmin, интеграция PHP-сценариев и Flash-приложений, оптимизация PHP-кода, добавлен новый материал в 12 глав. Прилагаемый компакт-диск содержит дополнительные главы, все листинги из книги, а также необходимое программное обеспечение
Введение | 1 |
Что нового в 3-м издании | 1 |
Немного истории | 2 |
PHP 6 | 3 |
MySQL | 4 |
Поддержка читателей | 4 |
ЧАСТЬ I. ТЕОРИЯ | 5 |
РАЗДЕЛ 1. БЫСТРЫЙ СТАРТ | 7 |
Глава 1. Установка необходимого программного обеспечения | 9 |
1.1. Нужно ли устанавливать программное обеспечение | 9 |
1.2. Выбор PHP-редактора и FTP-клиента | 10 |
1.3. Установка Apache + PHP + MySQL в Windows | 13 |
1.4. Установка Apache + PHP + MySQL в Linux | 20 |
1.5. Несколько советов | 21 |
Глава 2. Первая PHP-программа | 22 |
2.1. Ваша первая программа | 22 |
2.2. Запуск PHP-программы | 23 |
2.3. Вывод текста без echo | 24 |
2.4. Совместимость с PHP 4 | 25 |
Глава 3. Основы синтаксиса PHP | 27 |
3.1. Переменные | 27 |
3.1.1. Правила объявления переменных. Имена переменных | 27 |
3.1.2. Типы данных переменных | 28 |
3.1.3. Булевы переменные | 29 |
3.1.4. Операции над переменными | 30 |
3.1.5. Ссылки | 31 |
3.2. Константы | 32 |
3.3. Выражения и операции | 33 |
3.3.1. Что такое выражение | 33 |
3.3.2. Арифметические операции | 33 |
3.3.3. Логические выражения | 34 |
3.3.4. Приоритеты операций | 34 |
3.3.5. Операторы эквивалентности == и === | 35 |
3.3.6. Операции со строками | 36 |
3.4. Условный оператор | 37 |
3.5. Циклы | 38 |
3.5.1. Цикл со счетчиком | 38 |
3.5.2. Цикл while | 38 |
3.5.3. Цикл do-while | 39 |
3.5.4. Принудительное завершение цикла и пропуск итерации | 39 |
3.6. Оператор выбора switch-case | 40 |
РАЗДЕЛ 2. ПЕРЕДАЧА ПАРАМЕТРОВ PHP-ПРОГРАММАМ | 43 |
Глава 4. Методы GET и POST | 45 |
4.1. Интерфейс CGI | 45 |
4.2. Метод GET | 47 |
4.3. Метод POST | 47 |
Глава 5. Протокол HTTP и интерфейс CGI | 49 |
5.1. Специальные переменные окружения CGI | 49 |
5.2. Заголовки протокола HTTP | 50 |
5.3. Коды ответов протокола HTTP | 51 |
Глава 6. Передача параметров посредством HTML-формы | 53 |
6.1. Создание простейшей формы и ее обработка в сценарии | 53 |
6.2. Создание пользовательского интерфейса с помощью формы | 56 |
6.2.1. Ввод текста. Теги INPUT и TEXTAREA | 57 |
6.2.2. Зависимые и независимые переключатели | 58 |
6.2.3. Списки выбора | 59 |
6.2.4. Форма для передачи файлов | 61 |
6.2.5. Кнопки | 61 |
6.3. Проверка параметров формы | 62 |
6.3.1. Проверка корректности e-mail | 63 |
6.3.2. Проверка правильности номера кредитной карты | 64 |
6.3.3. Удаление лишних пробелов | 65 |
6.4. Защита от спама с помощью CAPTCHA | 65 |
6.5. Форма поиска в Яндексе | 68 |
Глава 7. Запоминание параметров с помощью Cookies и сессий | 69 |
7.1. Что такое Cookies и как с ними работать | 69 |
7.2. Механизм сессий | 71 |
7.2.1. Сессии и Cookies: преимущества и недостатки | 71 |
7.2.2. Для чего нужны сессии | 71 |
7.2.3. Как работает механизм сессий | 73 |
7.2.4. Обход Cookies | 74 |
7.3. Массивы и Cookies | 75 |
Глава 8. Отдельное слово о директиве register_globals | 76 |
8.1. Почему опасно использовать register_globals | 76 |
8.2. Если register_globals отключена | 80 |
8.3. PHP 6 и register_globals | 82 |
РАЗДЕЛ 3. МАССИВЫ И СПИСКИ | 83 |
Глава 9. Основные операции над массивами и списками | 85 |
9.1. Массив и список. Цикл foreach | 85 |
9.2. Функции list() и array() | 87 |
9.3. Удаление массива | 88 |
9.4. Слияние массивов | 88 |
9.5. Функция print_r() | 90 |
Глава 10. Функции сортировки массивов | 92 |
10.1. Функции для сортировки массивов | 92 |
10.2. Функция sort() — сортировка списка | 92 |
10.3. Функция asort() — сортировка массива по значениям | 93 |
10.4. Функция ksort() — сортировка по ключам | 94 |
10.5. Функции array_reverse() и shuffle() | 95 |
10.6. Собственная функция сортировки | 95 |
10.7. Натуральная сортировка | 96 |
Глава 11. Особые операции над массивами | 98 |
11.1. Добавление и удаление элементов массива | 98 |
11.2. Упаковка переменных в массив и их извлечение | 99 |
11.3. Получение части массива | 101 |
11.4. Функции автоматического заполнения массива | 101 |
11.5. Сравнение массивов | 102 |
11.6. Полезные операции над массивом | 103 |
11.6.1. Вычисление суммы и произведения всех элементов массива | 103 |
11.6.2. Проверка существования элемента в массиве | 103 |
11.6.3. Получение случайного элемента из массива | 104 |
11.6.4. Удаление дубликатов из массива | 104 |
11.6.5. Получение значений и ключей массива | 105 |
11.6.6. Замена местами значений и ключей | 105 |
11.6.7. Подсчет значений в массиве | 105 |
11.6.8. Замена в массиве | 106 |
11.6.9. Поиск в массиве | 106 |
11.6.10. Прогулка по массиву | 107 |
РАЗДЕЛ 4. ФУНКЦИИ В PHP | 109 |
Глава 12. Полезные стандартные функции | 111 |
12.1. Генератор случайных чисел | 111 |
12.2. Дата и время | 112 |
12.2.1. Кратко о timestamp | 112 |
12.2.2. Функции strtotime() и checkdate() | 112 |
12.2.3. Вывод даты | 113 |
12.3. Математические функции | 115 |
Глава 13. Функции для работы со строками | 116 |
13.1. Основные строковые функции | 116 |
13.2. Специальные функции замены | 119 |
13.3. Преобразование строки | 120 |
13.4. Функции преобразования кодировок | 122 |
13.5. Функции для работы с отдельными символами строки | 122 |
13.6. Функция md5() и другие функции шифрования/хэширования | 123 |
13.7. Функция explode(): выделение подстрок | 124 |
13.8. Статистические функции | 124 |
13.9. Функции вывода текста | 125 |
13.10. Установка локали | 127 |
13.11. Форматирование чисел и денежных величин | 128 |
Глава 14. Работаем с файлами и каталогами | 129 |
14.1. Права доступа в UNIX | 129 |
14.2. Чтение файла | 131 |
14.2.1. Использование функций fopen() и fread() | 132 |
14.2.2. Использование функции file(): построчное чтение файла | 134 |
14.2.3. Чтение всего файла: функция file_get_contents() | 135 |
14.3. Запись файла | 135 |
14.4. Создание временных файлов | 136 |
14.5. Работа с CSV-файлами | 136 |
14.6. Специальные функции для работы с файлами | 139 |
14.6.1. Функции для работы с именами файлов | 139 |
14.6.2. Работа с правами доступа | 139 |
14.6.3. Копирование, переименование и удаление файлов | 140 |
14.6.4. Время доступа к файлу | 141 |
14.6.5. Другие полезные функции | 142 |
14.7. Совместный доступ к файлу | 142 |
14.8. Функции для работы с каталогами | 143 |
Глава 15. Вывод графических изображений средствами PHP | 145 |
15.1. Библиотека GD | 145 |
15.1.1. Получение информации об изображении | 145 |
15.1.2. Конвертирование графических форматов | 148 |
15.1.3. Вывод текста поверх картинки | 150 |
15.1.4. Прозрачность | 153 |
15.2. Изменение размера изображения | 153 |
15.3. Создание водяных знаков | 155 |
Глава 16. Работа с сетевыми сокетами в PHP. Сетевые функции | 157 |
16.1. Еще раз о том, что такое сокет | 157 |
16.2. Использование сокетов | 157 |
16.3. Пример использования сокетов | 158 |
16.4. Блокирующий и неблокирующий режимы сокета | 161 |
16.5. DNS-функции | 162 |
Глава 17. Собственные функции | 163 |
17.1. Зачем нужны собственные функции | 163 |
17.2. Особенности функций в PHP | 163 |
17.3. Объявление функции | 164 |
17.4. Области видимости функции | 165 |
17.5. Вложенность функций | 165 |
17.6. Переменное число аргументов | 167 |
17.7. Передача массивов в качестве параметров | 168 |
РАЗДЕЛ 5. СЕРВЕРЫ БАЗ ДАННЫХ MYSQL 6 И SQLITE | 169 |
Глава 18. Основы SQL | 171 |
18.1. Немного истории | 171 |
18.2. Преимущества SQL | 171 |
18.3. Как выглядят запросы | 172 |
18.4. Что такое база данных | 173 |
18.5. Создание таблиц | 174 |
18.6. Добавление записей в таблицу | 177 |
18.7. Обновление записей | 178 |
18.8. Выборка записей | 179 |
18.9. Удаление записей | 180 |
18.10. Встроенные функции | 181 |
18.11. Группировка записей. Сложные запросы | 181 |
Глава 19. Функции для работы с MySQL | 185 |
19.1. Подключение к серверу MySQL | 185 |
19.2. Несколько MySQL-соединений | 187 |
19.3. Передача запросов серверу | 188 |
19.4. Работа с базой данных. Создание базы данных | 191 |
19.5. Функция mysql_real_escape_string($content) | 192 |
Глава 20. Альтернативная база данных SQLite | 193 |
20.1. MySQL vs SQLite: что лучше | 193 |
20.2. Открытие базы данных | 195 |
20.3. Передача запросов | 195 |
20.4. Работа с результатом запроса | 196 |
20.5. Список PHP-функций для работы с SQLite | 197 |
Глава 21. Полезные приемы при работе с MySQL 6 | 199 |
21.1. Выбор кодировки | 199 |
21.2. Сортировка: вывод новинок. Вывод случайных записей | 200 |
21.3. Постраничный вывод таблицы | 201 |
РАЗДЕЛ 6. ИНСТРУМЕНТЫ ДЛЯ СОЗДАНИЯ СЛОЖНЫХ ПРОЕКТОВ | 207 |
Глава 22. Разработка собственного шаблонизатора | 209 |
22.1. Организация файлов и каталогов проекта | 209 |
22.2. Выносим параметры в отдельный файл | 212 |
22.3. Подключение дополнительных файлов | 213 |
22.3.1. Инструкции include и require | 213 |
22.3.2. Альтернативный способ подключения сценариев | 213 |
22.3.3. Инструкции include_once и require_once | 215 |
22.4. Шаблоны | 215 |
Глава 23. Шаблонизатор Smarty | 219 |
23.1. Что такое Smarty | 219 |
23.2. Установка Smarty | 219 |
23.3. Создание setup.php | 222 |
23.4. Разработка шаблонов Smarty | 223 |
23.4.1. Комментарии в шаблонах | 223 |
23.4.2. Переменные в Smarty | 224 |
23.4.3. Файлы конфигурации шаблонов | 225 |
23.4.4. Служебная переменная {$smarty} | 226 |
23.4.5. Модификаторы переменных | 227 |
23.4.6. Стандартные (встроенные) функции Smarty | 230 |
Функции {include} и {insert} | 230 |
Функция {foreach} | 230 |
Функции {if}, {elseif}, {else} | 232 |
Функция {capture} | 233 |
Функция {php} | 233 |
Функция {strip} | 233 |
23.4.7. Пользовательские функции Smarty | 234 |
Функция {assign} | 234 |
Функция {cycle} | 234 |
Функция {fetch} | 235 |
Функции {html_checkboxes} и {html_radios} | 235 |
Функция {html_image} | 236 |
Функция {html_select_date} | 236 |
Функция {html_select_time} | 237 |
Функция {html_table} | 238 |
23.5. Smarty для программиста | 239 |
23.5.1. Специальные переменные | 239 |
23.5.2. Полезные методы класса Smarty | 241 |
Глава 24. Объектно-ориентированное программирование | 242 |
24.1. Основы ООП | 242 |
24.2. Классы и объекты | 243 |
24.3. Конструкторы и деструкторы класса | 245 |
24.4. Наследование классов. Полиморфизм | 246 |
24.5. Новые возможности PHP 5/6 | 247 |
24.5.1. Область видимости членов класса | 247 |
24.5.2. Абстрактные классы и методы | 248 |
24.5.3. Служебное слово final | 248 |
24.5.4. Клонирование объектов | 249 |
24.5.5. Обработка исключительных ситуаций | 250 |
24.5.6. Константы-члены класса | 251 |
24.5.7. Статические члены класса | 251 |
24.5.8. Оператор instanceof | 252 |
24.5.9. Итераторы | 252 |
24.5.10. Пространства имен | 252 |
Глава 25. Механизм сессий | 254 |
25.1. Для чего нужны сессии | 254 |
25.2. Как работает механизм сессий | 255 |
25.3. Обход Cookies | 257 |
25.4. Сценарий аутентификации | 257 |
Глава 26. Введение в PEAR | 262 |
26.1. Серьезные проекты и PEAR | 262 |
26.2. Пример использования класса DB | 263 |
Глава 27. Контроль версий | 267 |
27.1. Выбор системы контроля версий | 267 |
27.2. Практическое использование TortoiseHG (Mercurial) | 268 |
27.3. Просмотр внесенных изменений | 269 |
Глава 28. Тестирование PHP-сценариев | 273 |
28.1. Программа работает, но не так, как нам нужно | 273 |
28.2. "Самодельные" точки останова | 274 |
28.3. Система автоматического тестирования | 275 |
28.4. Директива error_reporting | 279 |
ЧАСТЬ II. ПРАКТИКА | 281 |
РАЗДЕЛ 7. РАЗРАБОТКА ОСНОВНЫХ ЭЛЕМЕНТОВ САЙТА | 283 |
Глава 29. Загрузка файлов на сервер | 285 |
29.1. Что нужно знать о загрузке файлов на сервер | 285 |
29.2. Реализация загрузки файла | 288 |
29.3. Загрузка нескольких файлов | 290 |
29.4. Проблемы при загрузке файлов | 292 |
Глава 30. Использование FTP-функций | 293 |
30.1. Функции для работы с FTP | 293 |
30.2. Примеры использования FTP-функций | 296 |
Глава 31. Отправка и прием почты | 299 |
31.1. Отправка почты средствами PHP — функция mail() | 299 |
31.2. Отправка писем с вложениями — класс HtmlMimeMail | 300 |
31.2.1. Отправка сообщения | 300 |
31.2.2. Проблемы при отправке сообщения | 304 |
31.2.3. MIME-типы | 305 |
31.3. Класс PHPMailer. Разработка сценария автоматической рассылки прайс-листа | 306 |
31.4. Получение писем по протоколу POP3 | 310 |
Глава 32. Работа с RSS: получаем новости на сайт | 314 |
32.1. Краткие сведения о RSS | 314 |
32.2. Формат RSS-файла | 314 |
32.3. Написание сценария импорта новостей | 317 |
32.4. Подключение файла import.php к сайту | 319 |
32.5. Создание граббера новостей | 320 |
Глава 33. Поиск с использованием регулярных выражений | 324 |
33.1. Нужно что-то найти... | 324 |
33.2. Язык регулярных выражений RegEx | 325 |
33.3. Управляющие конструкции | 327 |
33.3.1. Квантификаторы | 327 |
33.3.2. Альтернативный оператор | | 327 |
33.3.3. Скобки | 327 |
33.4. Псевдосимволы | 328 |
33.5. Практическое использование RegEx-функций | 328 |
33.6. Фильтры, или Конец эры регулярных выражений | 332 |
Глава 34. Работаем с MP3 | 334 |
34.1. Формат MP3 | 334 |
34.2. Библиотека PEAR | 335 |
34.3. Вывод ID3-тегов | 336 |
34.4. Редактирование ID3-тегов | 337 |
34.5. Удаление тега | 338 |
Глава 35. Технология Ajax | 339 |
35.1. Что такое Ajax | 339 |
35.2. Ваше первое Ajax-приложение | 340 |
РАЗДЕЛ 8. РАЗРАБОТКА ТИПИЧНОГО САЙТА | 345 |
Глава 36. Создание простейшего движка сайта | 347 |
36.1. Планирование движка | 347 |
36.1.1. Зачем нужно разрабатывать собственный движок | 347 |
36.1.2. Необходимые нам функции движка | 348 |
36.1.3. "Принципиальная схема" движка | 350 |
36.2. Основные функции движка | 351 |
36.2.1. Разработка TPL-шаблона | 351 |
36.2.2. Файл настроек | 352 |
36.2.3. Основной файл CMS — index.php | 353 |
36.2.4. Проектирование базы данных | 355 |
Таблица static | 355 |
Таблица cats | 356 |
Таблица pages | 357 |
36.2.5. Иерархическая структура сайта | 358 |
Алгоритм работы меню | 358 |
Сценарий menu.php | 360 |
Вывод содержимого раздела и страницы | 365 |
36.3. Дополнительные функции движка | 369 |
36.3.1. Вывод информации из таблицы static | 369 |
36.3.2. Функция вывода содержимого HTML-файла | 370 |
36.3.3. Версия для печати | 371 |
36.4. Где взять листинги этой главы | 372 |
Глава 37. Создание фотогалереи | 373 |
37.1. Постановка задачи | 373 |
37.2. Загрузка изображений на сервер | 373 |
37.3. Вывод галереи | 377 |
Глава 38. Гостевая книга | 380 |
38.1. Пережиток прошлого? | 380 |
38.2. Разработка базы данных и структура гостевой книги | 381 |
38.3. Вывод гостевой книги | 381 |
38.4. Добавление записей в гостевую книгу | 384 |
38.5. Сервисный сценарий gb_service.php | 387 |
Глава 39. Интеграция галереи LiveJournal и вашего сайта | 389 |
39.1. Что такое Живой журнал | 389 |
39.2. Интеграция фотогалереи LiveJournal и сайта | 390 |
39.3. Настройка внешнего вида галереи | 394 |
Глава 40. Создание счетчика сайта | 396 |
40.1. Постановка задачи | 396 |
40.2. Файл конфигурации | 396 |
40.3. Разработка таблиц counter и ipaddr | 397 |
40.4. Сценарий counter.php | 398 |
40.5. Сценарий reset_counter.php | 402 |
Глава 41. Статистика сайта | 404 |
41.1. Методы сбора статистики | 404 |
41.2. Программы-анализаторы журналов Web-сервера | 405 |
41.3. Системы статистики | 407 |
Глава 42. Голосования (опросы) | 410 |
42.1. Разработка собственной системы голосования | 410 |
42.2. Разработка сценария poll_form.php | 412 |
42.3. Сценарий poll_process.php | 413 |
42.4. Сценарий poll_results.php | 414 |
РАЗДЕЛ 9. СЛОЖНЫЙ ПРОЕКТ: САЙТ ПО ПРОДАЖЕ НЕДВИЖИМОСТИ |
419 |
Глава 43. Постановка задачи | 421 |
43.1. Функции будущего проекта | 421 |
43.2. Разработка базы данных | 422 |
Глава 44. Разработка основной части сайта | 431 |
44.1. С чего начать | 431 |
44.2. Реализация основных функций системы | 432 |
44.2.1. Аутентификация пользователей | 432 |
44.2.2. Вывод VIP-объявлений | 435 |
44.2.3. Вывод объявлений об услугах | 437 |
44.2.4. Вывод рекламных баннеров | 438 |
44.2.5. Постраничный вывод объявлений | 438 |
44.3. На что обратить внимание | 441 |
Глава 45. Разработка панели администрирования | 447 |
45.1. Функции панели управления | 447 |
45.2. Управление VIP-объявлениями | 448 |
45.3. Массовая отправка электронного сообщения | 449 |
45.4. Общие операции с базой данных | 450 |
45.5. Редактирование статей, новостей и контактов | 450 |
РАЗДЕЛ 10. ОБЕСПЕЧЕНИЕ БЕЗОПАСНОСТИ САЙТА | 451 |
Глава 46. SSL-соединения | 453 |
46.1. Защищаем передаваемые данные | 453 |
46.2. Настройка SSL в DirectAdmin | 454 |
46.3. SSL-переменные | 456 |
Глава 47. Защита PHP с помощью конфигурационного файла | 458 |
47.1. Конфигурационный файл php.ini | 458 |
47.2. Отключение потенциально опасных функций | 460 |
47.3. Рекомендованные значения некоторых конфигурационных директив | 460 |
Глава 48. Защита сайта от атак | 461 |
48.1. Сайт в опасности | 461 |
48.2. Два самых распространенных метода взлома | 462 |
48.3. Межсайтовый скриптинг | 462 |
48.4. SQL-инъекции | 464 |
48.5. Флуд | 468 |
48.6. Защита форума PHPBB2 от спаммеров | 469 |
ПРИЛОЖЕНИЯ | 471 |
Приложение 1. Программа phpMyAdmin | 473 |
Действия над таблицами | 474 |
Создание новой таблицы. Изменение структуры таблицы | 476 |
Вставка записей | 477 |
Обзор таблицы | 477 |
Выполнение произвольного SQL-кода | 477 |
Резервное копирование БД | 479 |
Приложение 2. Flash и PHP | 480 |
Приложение 3. Оптимизация PHP-кода | 484 |
П3.1. Правильное использование echo | 484 |
П3.2. Длина переменных | 485 |
П3.3. Правильное обращение к элементам массива | 485 |
П3.4. Циклы | 486 |
П3.5. Чтение файлов | 487 |
П3.6. Вывод текста: echo против printf | 489 |
П3.7. "Лишние" вызовы функций | 491 |
П3.8. Контрольные замеры | 492 |
П3.8.1. Чтение файла | 492 |
П3.8.2. Вывод содержимого файла | 493 |
П3.9. Выводы | 495 |
Приложение 4. Описание компакт-диска | 496 |
Предметный указатель | 499 |
VI Оглавление Оглавление V |