Php руководство по рнр 3 0 dbase функции


Содержание

операторы присваивания, вызовы методов объектов, операторы инкремента и декремента и т.д. Как и других языках программирования, в PHP можно объединять последовательности инструкций в блоки, получая составную инструкцию. Для этого последовательность инструкций заключается в фигурные скобки. В дальнейшем под инструкцией понимается простая либо составная инструкция.

Условная инструкция IF

Цикл WHILE с предусловием

Цикл WHILE с постусловием

Цикл FOR

Пример цикла for :

Результат:
1 + 0 = 1
2 + 1 = 3
3 + 2 = 5
4 + 3 = 7

Инструкция SWITCH

Если вариантов значения условия много, и последовательность вложенных инструкций IF получается слишком громоздкой, удобна инструкция SWITCH :

Оператор break прекращает выполнение оператора switch в случае найденного соответствия; если его не поставить, будут выполняться все последующие проверки case .

Например, следующий цикл прервется на второй проверке и установит значение monthName = ‘февраль’

Инструкции BREAK и CONTINUE

Применяются в циклах всех типов. Инструкция break завершает выполнение всего цикла, а continue — очередной итерации.

Работа с dbf-файлами

Впервые работаю в php с DBF-файлами.
И сразу же не идет.
Подскажите,в чем может причина.
Нужно ли прописивать для работы odbc?
Посмотрела-прописан пользовательский.Каталог указывать тот,где находятся dbf-файлы или ?
Мой файл находится в каталоге,где все остальные файлы.

Добавлено через 9 часов 22 минуты
При открытии dbf- файла сообщение—
Call to undefined function dbase_open() in .

Но у меня прописан ODBC
Имя источника Файлы dBASE
Версия dBase III
Испльзую текущий каталог (c:\Windows\system32\)

Больше ничего не прописано

Сами dbf-ы лежат в другой папке.

Подскажите,а какие библиотеки для работы с dbf должны лежать в system32?
Или еще что мне проверить?

24.07.2012, 11:20

Работа с файлами
Ребят, как я могу через php добавлять файл в БД, но сам файл будет храниться в папке. Как его потом.

Работа с файлами
Имеется скрипт загрузки файлов на сервер. Вопрос такой, как записать на сервер уже переименнованый.

Работа с файлами
Вопрос больше общей философии, чем конкретный. Допустим есть сценарий который создает файлы и.

Работа с бинарными файлами
Доброго времени суток всем! Есть задача с помощью скрипта взять другой скрипт и сохранить его в.

Работа с файлами YAML
Добрый день! Можете помочь? Нужен парсер для yml файл. Читал про symfony, но без поняти, как его.

24.07.2012, 11:36 2

а причем тут вообще системная виндовская папка? вам нужно проверить настройки самого апача и пыха, подключен ли там модуль для работы с DBF

Добавлено через 1 минуту
библиотеку скачивали? в папку ext кинули? в php.ini раскомментировали строчку с

Добавлено через 1 минуту
скачиваете http://www.dll.ru/dll/13378.html, кидаете в папку ext/ и выполняете действия, описанные выше

24.07.2012, 11:43 [ТС] 3

Строчку раскомментировала.Не помогло.А в папке ext есть только такие библиотеки
php_gd2
php_mbstring
php_mysql
php_mysqli
php_pdo
php_pdo_mysql

А как название библиотеки для работі с dbf?
CПАСИБО

24.07.2012, 11:45 4 24.07.2012, 11:51 [ТС] 5

я ВСЕ СДЕЛАЛА
1) сбросила эту библиотеку (скачала по Вашей ссылке) php_dbase.dll в папке ext
2) раскоментировала строчку

но ошибка все та же.

24.07.2012, 12:15 6 24.07.2012, 12:20 [ТС] 7

Добавлено через 1 минуту
При перезапуске дэнвера ругалось на php4ts.dll,что отсутствует,я скачала и положила эту библиотеку тоже в папку ext,но при перезагрузке ругается,что нет ее,хотя она лежит там же.

24.07.2012, 12:20
24.07.2012, 12:20

Работа с CSV файлами
Есть такая CSV таблица: Нужно с помощью неё получить ссылки такого вида: CSV файлы формата.

Работа с файлами в php
Опять продолжаю изучать работу с файлами на php но решился на этот раз написать скрип через функции.

Работа с csv файлами
Всем добрый вечер, друзья. Пытаюсь сделать загрузку из csv файла в базу, но не могу пройти циклом.

Первое знакомство с функциями php для начинающих

Значение функций для программирования неоценимо. Благодаря им появилась возможность повторного использования кода. Нужно лишь разместить вызов функции в конкретном месте программы, и передать ей новые значения аргументов. Не являются исключением из правил и функции php .

Синтаксис функций в php

В каждом языке программирования работа с функциями имеет свои « тонкости ». Рассмотрим их особенности в php :

  • Определение функции выглядит следующим образом:

Параметры могут быть пустыми. Имя указывается после обязательного слова function . При этом имена функций являются независимыми от регистра.

Это значит, что при объявлении function Main() и function main() подразумевается одна и та же функция. А при вызове одной из них интерпретатор выдаст сообщение об ошибке:

  • В теле функции может находиться любой код. В том числе и определение другой функции. При этом определение может быть расположено в любом месте кода. То есть, в php имеет значение лишь расположение вызова функции;
  • Функция может возвращать лишь одно значение, или ничего. Возврат более одного значения не возможен. При этом тип возвращаемого значения может быть любым.

В результате будет возвращена 1.

Множественную передачу значений можно осуществить при использовании в php массива в функции.
Пример:

В теле функции задаются значения переменным x и y . Затем с помощью встроенной функции array() они записываются в массив.

Значение элементам массива задается при вызове функции с помощь list() .

  • Вызов функции php имеет синтаксис:

Функция вернет 3.

Анонимные функции в php

Анонимные функции в php появились недавно, начиная с версии 5.3 . В более ранних версиях языка их поддержка не была реализована.

Анонимной называется функция, определение которой происходит без указания имени. То есть ее определение происходит в месте вызова. При создании анонимной функции к ней обращаются напрямую, или переменной присваивается ссылка на нее.

Рассмотрим на примерах:

Здесь ссылка на анонимную функцию присваивается переменной func1 . Затем переменная x инициализируется значением func1 и выводится с помощью echo() :

В примере автономная функция function ($v) < return $v >2; > вызывается напрямую в месте определения. Она передается в качестве второго аргумента стандартной функции array_filter() .

Функция mail()

Набор стандартных ( встроенных ) функций в php довольно широк. Многие из них реализуют основные возможности веб-сферы.

Одной из таких является функция mail() . Она отправляет сообщение на указанный почтовый ящик. Ее синтаксис:

Описание принимаемых параметров:

  • to –адрес получателя письма. Должен соответствовать стандарту user@example.com ;
  • subject – тема письма;
  • message – отправляемое сообщение. При этом каждая строка сообщения должна вмещать в себя не более 70 символов. Строки разделяются символом перевода строки ( n ).

Если отправка письма происходит непосредственно на SMTP -сервер с машины на основе Windows , то все точки в конце каждой строки будут удалены. Во избежание этого следует заменить все одиночные точки на двойные с помощью кода:

Необязательные параметры функции mail() :

  • additional_headers – вставляется в конце заголовков отправляемого письма. Используется для добавления заголовков.

Пример отправки простого письма:

А вот пример полностью рабочей формы для отправки сообщений:

Несколько основных причин, почему письмо не отправляется:

  • Письмо не содержит дополнительного заголовка From . Он устанавливается с помощью необязательного параметра additional_headers . Также он может быть выключен по умолчанию в конфигурационном файле php.ini . Если заголовок отсутствует в коде, то интерпретатор выдаст следующее сообщение:
  • Используйте только LF (n) . Некоторые агенты на основе Unix автоматические заменяют LF на CRLF (rn) ;
  • При реализации функции mail() на Windows адрес получателя не должен быть такого вида: Something someone@example.com.

Может произойти неправильная интерпретация параметра при передаче его почтовому агенту для отправки.

  • Сбои в отправке писем могут возникнуть при размещении вызова mail() в теле цикла. Функция открывает и закрывает соединение с SMTP -сервером после отправки каждого письма.

Обзор стандартных функций php

В стандартный набор php входит большой комплект функций для работы со строками. Подробно рассмотрим несколько из них:

  • 1) substr() – возвращает часть строки. Синтаксис: string substr(string string, int start[, int length]) , где:
  • string string – заданная строка.
  • int start – задает начало подстроки.
  • int length – количество символов в возвращаемой подстроке.
  • 2) strpos() – возвращает позицию подстроки в заданной строке. С помощью необязательного параметра можно задать точку отсчета для поиска. Синтаксис: string strpos(string haystack, string needle[, int offset])

3) strstr() – возвращает подстроку из строки, начиная с указанного символа. Синтаксис: string
strstr(string haystack, string needle)

Функции работы с массивами:

1. count() – возвращает количество элементов в массиве. Синтаксис: int count(mixed var)

2. reset() – устанавливает указатель массива на первый элемент, возвращает его значение.
Синтаксис: reset(array array)
Пример:

3. sort() – сортирует массив по возрастанию. Функция воспринимает любой массив как список. Синтаксис: void sort(array array [, int sort_flags])

В языке PHP существует много функций для работы с датой и временем. Но функция date () в php является основной. Она возвращает строку, отформатированную согласно установленному шаблону format . Временная метка устанавливается аргументом timestamp . Ее синтаксис: string date ( string $format [, int $timestamp = time() ] )

Более подробно обо всех принимаемых значениях аргументов функции можно узнать из документации к php.

Несколько стандартных математических функций:

1. bindec() – преобразует число двоичной системы исчисления в десятичное. Синтаксис: bindec ( string $binary_string )

2. floor() – округляет число до меньшего. Синтаксис: float floor (float $value )

3. rand() –генерирует случайное число из указанного диапазона. Синтаксис: int rand ( int $min , int $max )

Одна ложка меда из бочки

Описанные функции php всего лишь ложка меда из огромной бочки волшебства этого языка. Самые вкусные функции распробуйте самостоятельно.

Работа с базами данных SQL в PHP для новичков

Учебник PHP

Практика

Важное

Регулярки

Работа с htaccess

Файлы, папки

Сессии и куки

Работа с БД

Практика по работе с БД в PHP

Перед чтением см. новые уроки раздела «Важное», которые появились выше.

Практика

Движок PHP

Продвинутые БД

Аутентификация

Практика

ООП и MVC

Абстрактные классы и интерфейсы

Трейты

ООП Магия

Практика

Практика: классы как набор методов

  • Урок №
    новая вкладка с new.code.mu
    . текст, код Практика: класс ArrayConvertor
  • Урок №
    новая вкладка с new.code.mu
    . текст, код Практика: класс TagHelper
  • Урок №
    новая вкладка с new.code.mu
    . текст, код Практика: класс FormHelper
  • Урок №
    новая вкладка с new.code.mu
    . текст, код Практика: класс TableHelper
  • Урок №
    новая вкладка с new.code.mu
    . текст, код Практика: класс SessionShell
  • Урок №
    новая вкладка с new.code.mu
    . текст, код Практика: класс CookieShell
  • Урок №
    новая вкладка с new.code.mu
    . текст, код Практика: класс FileManipulator
  • Урок №
    новая вкладка с new.code.mu
    . текст, код Практика: класс databaseShell TODO cart корзина flash шаблонизатор роутер контроллер кеш логи фалидатор

Что такое база данных

База данных (сокращенно БД) — это место, в котором хранятся данные сайта.

Это могут быть тексты страниц, списки пользователей с их логинами и паролями, каталоги продукции и другое.

База данных состоит из таблиц. Что такое таблица вы знаете из жизни: это строки и столбцы. А на пересечении строк и столбцов располагаются ячейки.

В базах данных столбцы часто называют полями.

Это легко можно вообразить себе, представив документ Excel. Базой данных будет являться сам документ (книга), а таблицами — каждый лист этой книги.

PhpMyAdmin

Для редактирования баз данных часто пользуются программой PhpMyAdmin.

PhpMyAdmin (читается PHPмайадмин, часто пишут аббревиатуру PMA или ПМА) — это оболочка для работы с базами данных прямо у вас в браузере.

Вы можете править содержимое таблиц, создавать новые базы данных и таблицы — и все это через веб-интерфейс, не зная SQL.

Видео на PhpMyAdmin

Задачи на PhpMyAdmin

Давайте откроем PhpMyAdmin и приступим к изучению его интерфейса.

Чтобы вам было проще с ним освоится, сделайте следующие практические задачи:

  1. Создайте базу данных test.
  2. В ней создайте таблицу users.
  3. В этой таблице сделайте 4 поля (столбца):
    • id (для него нужно поставить галочку AUTO_INCREMENT или A.I.), тип integer,
    • name, тип varchar, 32 символа,
    • age, тип integer,
    • birthday (англ. день рождения), тип date.
  4. Найдите вкладку ‘вставить’ и с ее помощью вставьте несколько строк в эту таблицу При этом поле id заполнять не нужно! Оно заполнится автоматически!
  5. Поредактируйте какую-нибудь запись.
  6. Удалите какую-нибудь запись.
  7. Поменяйте кодировку для таблицы и для всей базы данных (на utf8_general_ci).
  8. Переименуйте таблицу.
  9. Переименуйте базу данных.

AUTO_INCREMENT

Обратите внимание на то, что мы создали поле id и поставили ему галочку AUTO_INCREMENT. Это очень важный шаг!

Теперь при вставке новой записи (строки) в таблицу это поле будет заполняться автоматически уникальным номером.

При этом если мы удалим строку с каким-то id (например 1), то такого id больше никогда не будет.

Зачем нужно поле id?

Затем, чтобы мы всегда могли обратиться к конкретной строке по ее id, например с целью удаления или редактирования.

Типы переменных

В SQL довольно много типов переменных, но чаще всего приходится пользоваться следующими:

  • integer – целочисленный.
  • text – большое текстовое поле.
  • varchar – не очень большое текстовое поле, при этом мы должны задать его размер (он должен быть степенью двойки: 8, 16, 32, 64, 128, 256 и т.д.).
  • date — поле для хранения даты (дата хранится в SQL-формате: год-месяц-день, пример: 2013-06-24).

Как работать с mySQL через PHP

Работа с БД из PHP осуществляется всего лишь с помощью трех функций:

  • mysqli_connect – соединение с сервером и базой данных.
  • mysqli_query — универсальная функция отправки запросов к БД, с помощью нее можно сделать все.
  • mysqli_error — вывод ошибок.

Далее подробнее про каждую из функций.

Устанавливаем соединение с БД

Данный материал есть также в виде видео: https://youtu.be/J8GFuyA_k_8

Прежде, чем начать работать с базой данных из PHP, нужно установить соединение с сервером, на котором эта база находится.

Делается это с помощью функции PHP mysql_connect, которая принимает 3 параметра: имя хоста (сервера), имя пользователя, под которым мы работаем с базой и пароль для этого пользователя.

Если вы работаете на своем компьютере то это будут ‘localhost’, ‘root’ и пароль в виде пустой строки (на некоторых серверах он тоже может быть root). Если ваша база данных в интернете — то эти данные дает вам хостер.

Давайте установим соединение с базой данных:

Посылаем запросы к базе данных

Запросы к базе данных представляют собой обычные строки, которые мы вставляем в функцию PHP mysqli_query (первым параметром это функция принимает переменную, в которую мы записали результат mysqli_connect, в нашем случае это переменная $link):

Принято правило, по которому команды SQL следует писать в верхнем регистре (то есть большими буквами), а все остальное — в нижнем.

Это относиться к командам SELECT, UPDATE, FROM, DELETE, WHERE и другим такого рода.

Конечно, синтаксической ошибки не будет, если вы напишите их маленькими буквами, но принято большими.

Отлавливаем ошибки базы данных

Многие начинающие зачастую не умеют отлавливать ошибки, которые вернула база данных.

Поэтому при работе с БД у них постоянно возникают сложности. Что-то не работает, а что — не понятно, так как ошибок они не видят, так как PHP не выводит ошибки mySQL, если ему об этом не сказать

Чтобы вывести ошибки, следует пользоваться конструкцией or die ( mysqli_error($link) ), которую необходимо добавлять к каждому запросу к БД.

Смотрите пример: mysqli_query($link, $query) or die( mysqli_error($link) );

Таким образом вы сразу будете получать сообщения об ошибках синтаксиса SQL. Обратите внимание на то, что на рабочем сайте эти конструкции следует удалять, чтобы пользователи и тем более хакеры не видели ошибок БД.

Проблемы с кодировками

Зачастую у новичков возникает проблема с кодировками — казалось бы нормальный русский текст в базу данных записывается абракадаброй или вопросиками.

Чтобы не было проблем с кодировками следует придерживаться простых правил:

  • Базу данных следует создавать в кодировке utf8_general_ci.
  • Документ PHP должен быть в кодировке utf8.
  • Таблицы в БД должны быть в utf8_general_ci.
  • На всякий случай сразу после команды mysqli_connect добавьте такое запрос: mysqli_query($link, «SET NAMES ‘utf8′»);

Начнем практиковаться

Сейчас мы с вами начнем изучить SQL запросы на практике. Для этого нам понадобится тестовая таблица в базе данных, заполненная некоторыми данными. Сейчас мы с вами ее сделаем и заполним.

Итак, создайте свою первую базу данных с помощью PhpMyAdmin.

Назовите ее «test».

Создайте в этой базе новую таблицу.

Назовите ее «workers» (англ. работники).

В ней создайте 4 столбца (столбцы по другому называются поля):

  • id – тип integer, не забудьте поставить ему галочку AUTO_INCREMENT (чтобы в этом столбце номера проставлялись автоматически).
  • name (англ. имя) – тип varchar, размером в 256 знаков.
  • age (англ. возраст) — тип integer.
  • salary (англ. зарплата) — тип integer.

Ее заполните тестовыми данными, как показано в таблице ниже (этот шаг обязателен, так как дальше все задачи будут по этой таблице):

id name age salary
1 Дима 23 400
2 Петя 25 500
3 Вася 23 500
4 Коля 30 1000
5 Иван 27 500
6 Кирилл 28 1000

Итак, у нас есть таблица с работниками фирмы, в которой указаны их имена, возрасты и зарплаты (в $). Далее мы будем работать с этой таблицей.

Тестируем работоспособность

Прежде чем начать работу, следует протестировать работоспособность — попробуем сделать какой-нибудь запрос к нашей базе.

Просто скопируйте этот код и запустите его у себя:

Если var_dump($result) вернет resource, то все работает, если же null – то возникли какие-то проблемы. в новых версиях PHP в $result будет лежать объект с данными (всегда будет непустой). Если обработать его через mysqli_fetch_assoc будет или результат или null (про mysqli_fetch_assoc см ниже или видео https://youtu.be/J8GFuyA_k_8 , которое уже было выше в пункте «Устанавливаем соединение»)

В таком случае проверьте все еще раз, уберите последовательно все ошибки PHP, если таковые есть.

Как достать результат

После того, как мы сделали запрос к базе, в переменной $result будет лежать результат этого действия.

Однако лежит он не в той форме, которая нам нужна в PHP, а в той форме, в которой его прислала нам база.

Достать результат в нормальном виде (в массиве) можно с помощью следующего кода:

Как работает последняя строка?

Функция mysqli_fetch_assoc считывает последовательно каждую строку результата, который прислала нам база.

В цикле for мы считываем построчно результат из базы.

Когда цикл дойдет до последней строки — mysqli_fetch_assoc вернет false и цикл for закончит свою работу.


А результат из БД будет лежать в нормальном виде в массиве $data.

Основы работы с PHP MySqli

В связи с прекращением поддержки PHP MySQL в 2011 году для работы с базами данных все более широкое применение находят PDO или MySqli. Они обладают лучшей функциональностью (чем MySQL) и предлагают ООП (объектно-ориентированный интерфейс) API. Какой из них лучше, это тема для другой статьи, в этой статье мы попытаемся разобраться с основами работы с MySqli. Поэтому, без дальнейших предисловий, перейдем к рассмотрению соединения ( connect ), выбора ( select ), вставки ( insert ), обновления ( update ) и удаления ( delete ) записей (данных/документов/информации) посредством PHP MySqli. Надеюсь, что данная статья будет полезна при решении проблем, которые могут возникнуть при работе с PHP MySqli.

Установка MySqli

При использовании PHP версии 5.3.0 +, MySqli доступен по умолчанию; для более старых версий, чтобы сделать его доступным, надо включить php_mysqli.dll DLL внутри файла php.ini и отредактировать php.ini, раскоментировав строчку extension=php_mysqli.dll . В линуксе MySQLIi будет установлен автоматически при установке пакета PHP5 mysql. Более подробную информацию об установке в системах windows и linux можно найти здесь.

Соединение с базой данных

MySqli предлагает два способа соединения с базой данных: процедурный и объектно-ориентированный. Рекомендуется использовать объектно-ориентированный. Процедурный похож на (старый) MySql, поэтому для новичков его использование, возможно, будет предпочтительней, стоит помнить, что им пользоваться не рекомендуется.

Ниже показано открытие соединения с базой данных объектно-ориентированным способом. Этот способ будет использоваться и во всех приведенных ниже примерах.

Выбор (SELECT) результирующего ряда в виде ассоциативного массива

mysqli_fetch_assoc() : в приведенном ниже коде происходит извлечение результирующего ряда в виде ассоциативного массива. Возвращаемый массив содержит строки, полученные из базы данных, где имена столбцов будут являться ключом, используемым для доступа к внутренним данным. Как показана ниже, данные отображаются в виде HTML таблицы.

Выбор (SELECT) результирующего ряда в виде массива (ассоциативный, обычный, или в оба)

Фукнция fetch_array() : возвращает массив с объединенным функционалом mysqli_fetch_row и mysqli_fetch assoc . Эта функция является расширенной версией функции mysqli_fetch_row() ; для доступа к данным можно использовать как строку, так и числа.

Выбор (SELECT) результирующего ряда в виде объекта

fetch_object() : чтобы получить результирующий набор в виде объекта, нужно воспользоваться MySqli fetch_object() . Атрибуты объекта будут отображать имена полей, найденных внутри результирующего набора.

Выбор (SELECT) одиночного значение

Одиночное значение получить из базы данных можно посредством fetch_object (метод Cameron Spear).

Извлекаем (SELECT COUNT) количество строк в таблице

Иногда нужно узнать количество строк в таблице, особенно при нумерации страниц.

Выбор (SELECT) с помощью шаблонов (prepared statements)

prepared statements — специальный инструмент СУБД, позволяющий ускорить последовательное выполнение повторяющихся запросов, построенных по одному и тому же шаблону.

Одной из особенностей MySqli является возможность использования уже написанных шаблонов: то есть запрос достаточно написать один раз, после чего его можно многократно исполнять с различными параметрами. Использование уже написанных шаблонов улучшает производительность для больших таблицах и сложных запросов. Для предотвращения попадания вредоносного кода анализ каждого запроса производится сервером отдельно.

Код ниже использует шаблон (Prepared statement), чтобы получать данные из базы данных. Заполнитель ? в запросе SQL играет роль маркера и будет замещен параметром, который, в свою очередь, может быть строкой, целым числом, double или blob. В нашем случае это строка $search_product .

Тот же запрос с несколькими параметрами:

Вставка (INSERT) записи

Запись ниже вставляет в таблицу новый ряд.

Отрывок ниже вставляет те же значения посредством шаблонов (Prepared Statement). Как мы уже говорили, шаблоны чрезвычайно эффективны против SQL инъекция. Для приведенного примера их использование является оптимальным вариантом.

Вставка (INSERT) нескольких записей

Вставка нескольких рядов одновременно осуществляется путем включения ряда значений столбцов, где каждый ряд значений должен быть обнесен скобками и отделен от других запятой. Иногда нужно узнать, сколько записей было вставлено, обновлено или удалено, для этого можно воспользоваться mysqli_affected_rows .

Обновление (Update)/удаление (Delete) записей

Принцип обновление и удаление записей тот же. Достаточно заменить строку запроса на MySql update или delete (не понял, сам смотри).

Обновление с помощью шаблонов (prepared statements)

Пример обновления записи с помощью шаблонов (prepared statements) приведен ниже.

Удаление старых записей

Удалению подвергаются все записи, находящиеся на сервере больше 1 дня; количество дней можно задать самому.

Заключение

Вне сомнения, MySqli существенно лучше стандартного MySql расширения PHP, хотя принципы их работы довольно схожи. Надеюсь, приведенная выше информация окажется полезной при создании и переносе проектов в будущем. Для удобства ниже была реализована возможность скачать файлы примеров. Это можно сделать, нажав на кнопку download.

PHP — Функции

Дата публикации: 2020-10-20

От автора: функции PHP похожи на функции других языков программирования. Функция представляет собой фрагмент кода, который принимает другой код в качестве параметра, выполняет определенную обработку и возвращает значение.

Мы уже рассмотрели много таких функций, например fopen() и fread() и т.д. Это встроенные функции, но PHP предоставляет нам возможность создавать собственные функции. Вы должны четко понимать, что существуют два отдельных аспекта:

Создание функции PHP

Вызов функции PHP

На самом деле вам вряд понадобиться создавать свою собственную функцию, потому что в PHP уже доступны тысячи функций из библиотек, созданных для разных сфер применения, и вам просто нужно вызвать нужную функцию. Полный перечень функций вы можете найти в Справочнике по функциям PHP.

Как создать сайт самому?

Какие технологии и знания необходимы сегодня, чтобы создавать сайты самостоятельно? Узнайте на интенсиве!

Создание функции PHP

Собственную PHP-функцию создать очень просто. Предположим, вы хотите создать функцию PHP, которая просто выводит в браузере короткое сообщение, когда вы ее вызываете. В следующем примере мы создаем функцию writeMessage(), а затем вызывает ее сразу после создания.

Обратите внимание, что при создании функции ее имя должно начинаться с ключевого слова function, и весь код PHP должен быть помещен внутри скобок < >, как в приведенном ниже примере:

Добро пожаловать

В интернете очень много устаревшей информации, которая приводит к заблуждению, распространению неверных решений и написанию плохого кода у начинающих PHP-разработчиков. Это нужно остановить. PHP: Правильный Путь — легкочитаемое руководство для быстрого ознакомления с правилами эффективного использования PHP, принятыми стандартами написания кода и ссылками на признанные руководства по всему интернету.

Переводы

Руководство PHP: Правильный путь уже (или вскоре будет) переведено на множество различных языков:

Дисклеймер

В интернете не существует описания каноничного способа использования PHP. Как бы то ни было, этот скромный сайт содержит лучшие решения, доступные варианты и другую полезную информацию. Он направлен на ознакомление начинающих разработчиков с PHP и переосмысление опытными профессионалами свежих идей.

Это живой документ и он продолжит обновляться более полезной информацией и примерами по мере их появления.

Как внести вклад

Помогите сделать этот сайт лучшим ресурсом для начинающих PHP программистов! Помочь используя GitHub

Расскажите о нас

Руководство PHP: Правильный путь содержит веб-баннеры, которые вы можете использовать на своём сайте. Окажите поддержку, показав начинающим PHP-разработчикам где они могут найти полезную информацию!

Начало

Использование стабильной версии (7.2)

Если вы только начинаете работу с PHP, убедитесь в том, что вы используете текущую стабильную версию PHP 7.2. За последние несколько лет PHP добился больших успехов, добавив новые возможности.

Наиболее часто в ближайшем будущем вы будете видеть, что используются версии PHP 5.x, с последней 5.6. Но вы должны попробовать использовать последнюю стабильную версию, если это возможно. Не дайте скромной разнице между числами 5.2 и 5.6 ввести вас в заблуждение, эта разница представляет важные изменения. Если вам нужна функция или пример её использования, вы всегда можете найти документацию на php.net.

Встроенный веб-сервер

Вы можете начать изучение PHP без необходимости в установке и конфигурировании полноценного веб-сервера (необходим PHP 5.4 или новее). Для запуска сервера вам необходимо выполнить следующую команду из терминала в корневой папке веб-проекта:

Установка на Mac

OSX поставляется с предзапакованным PHP, но, в лучшем случае, он немного отстает от стабильной версии. Lion поставляется с PHP 5.3.6 и Mountain Lion имеет 5.3.10.

Для обновления PHP в OSX вы можете установить его с помощью нескольких пакетных менеджеров, наиболее рекомендуемый из которых php-osx by Liip.

Другой вариант, скомпилировать самостоятельно, в этом случае убедитесь, что у вас установлен либо Xcode, либо его аналог от Apple “CLI для Xcode”, который можно загрузить с Apple Mac Developer Center.

В качестве полного набора «всё-в-одном», который включает PHP, веб-сервер Apache и СУБД MySQL, и всё это с хорошим управлением через GUI, попробуйте MAMP.

Установка в Windows

PHP для Windows можно получить несколькими путями. Вы можете загрузить установочные файлы и, до недавнего времени, вы могли использовать ‘.msi’ установщик. Начиная с PHP версии 5.3.0 установщик не поддерживается.

Для изучения и локальной разработки вы можете использовать встроенный в PHP 5.4+ веб-сервер, о конфигурации которого можно не беспокоиться. Если вы предпочитаете сервера «всё-в-одном», которые включают в себя полноценный веб-сервер и MySQL, тогда можете воспользоваться такими инструментами, как Web Platform Installer, Zend Server CE, XAMPP или WAMP, которые помогут быстро развернуть окружение для разработки в Windows. Но, стоит сказать, что эти инструменты будут отличаться от продакшна, так что будьте осторожны и учитывайте эти различия, если вы работаете на Windows и деплоите на Linux.

Если вам нужно запустить конечную систему на Windows, то IIS7 даст вам лучшую стабильность и производительность. Вы можете использовать phpmanager (плагин для IIS7) для легкого конфигурирования и управления PHP. IIS7 поставляется с встроенным FastCGI, вам нужно просто настроить PHP в качестве обработчика. Для получения помощи и дополнительной информации посетите iis.net.

Vagrant

Запуск вашего приложения в разных окружениях на этапе разработки и продакшна может привести к различным багам, которые дадут о себе знать уже непосредственно при работе приложения. Также сложно поддерживать в разных окружениях стабильные версии для всех библиотек, которые используются при работе в команде разработчиков.

Если вы разрабатываете на Windows и деплоите на Linux (или что-либо отличающееся от Windows) или разрабатываете в команде, вы должны рассмотреть возможность использования виртуальной машины. Это звучит сложно, но, используя Vagrant, вы можете установить простую виртуальную машину всего лишь в несколько шагов. Они могут быть как выполнены вручную, так и с помощью специализированного софта, например, Puppet или Chef, который автоматизирует эту задачу. Использование этого софта гарантирует использование одинаковой конфигурации для нескольких машин, что избавляет вас от необходимости поддержки сложных списков установки. Вы также можете удалить вашу машину, и пересоздать её без большого количества ручных шагов, что делает создание «свежей» виртуалки очень простым.

Vagrant создает общие папки, которые используются для совместного использования кода между вашим хостом и виртуальной машиной, а это означает, что вы можете создавать и редактировать файлы на хосте и позже запускать код в вашей виртуальной машине.

Стандарты написания кода

Сообщество PHP является очень большим и разнообразным, сочетая в себе бесчисленное количество библиотек, фреймворков, и различных компонентов. Для PHP разработчика это обычная практика — выбрать несколько из них и соединить в одном проекте. Очень важно придерживаться общих стандартов написания кода (так точно, насколько это возможно) в своём PHP коде, чтобы позволить разработчикам сочетать и использовать различные библиотеки для своих проектов.

Группа Совместимости Фреймворков предложила и одобрила ряд стилевых рекомендаций, известных как PSR-0, PSR-1 и PSR-2. Не дайте веселым именам смутить вас, эти рекомендации представляют собой набор правил, которых начинают придерживаться такие проекты, как Drupal, Zend, Symfony, CakePHP, phpBB, AWS SDK, FuelPHP, Lithium и другие. Вы можете использовать их при работе над собственным проектом, или в дальнейшем использовать ваш собственный стиль.

В идеале, вы должны писать PHP код, придерживаясь известных стандартов. Это может быть любая комбинация PSR-ов, или один из стандартов кода, сделанных PEAR или Zend. Это позволит другим разработчикам легко читать и работать с вашим кодом, и приложения, которые используют компоненты, смогут сохранить структуру приложения, даже работая с огромным количеством стороннего кода.

Вы можете использовать PHP_CodeSniffer чтобы проверить код на соответствие одной из этих рекомендаций, а также плагин для текстовых редакторов, таких как, к примеру, Sublime Text 2 чтобы получить отчёт в реальном времени.

Используйте PHP Coding Standards Fixer, созданный Фабиеном Потенсьером, для автоматического исправления синтаксиса вашего кода так, чтобы он соответствовал этим стандартам, что спасет вас от исправления каждой проблемы вручную.

Английский язык является наиболее предпочтительным для всех символических имен и инфраструктуры кода. Комментарии могут быть написаны на любом языке, который будет легко читаем текущими и будущими разработчиками, которым предстоит работать над кодом.

Основные моменты языка

Парадигмы программирования

PHP представляет собой гибкий, динамичный язык, который поддерживает несколько техник программирования. Он значительно развился в течение последних нескольких лет: добавлена мощная объектно-ориентированная модель в PHP 5.0 (2004), анонимные функции (замыкания) и пространства имен в PHP 5.3 (2009), а также трейты в PHP 5.4 (2012).

Объектно-ориентированное программирование

PHP реализует очень большой набор особенностей объектно-ориентированного программирования, включая поддержку классов, абстрактных классов, интерфейсов, наследования, конструкторов, клонирования, исключений и т.д.

Функциональное программирование

PHP поддерживает первоклассные функции, т.е. функция может быть применена к переменной. И определенные пользователем, и встроенные функции могут быть применены к переменной и вызываться динамически. Функции могут быть переданы, как аргумент к другой функции (эта особенность называется функцией высшего порядка), а также функция может возвращать другую функцию.

Рекурсия — это особенность, которая позволяет функции вызывать саму себя, это поддерживается языком, но бо́льшая часть кода PHP фокусируется на итерации.

Анонимные функции (замыкания) поддерживаются PHP начиная с версии 5.3 (2009).

В PHP 5.4 добавлена возможность связывать замыкание с областью видимости объекта, а также улучшена поддержка callables (всё, что может быть вызвано), так что они могут быть использованы наравне с анонимными функциями практически во всех случаях.

Meta Programming

PHP поддерживает несколько форм метапрограммирования, что реализуется с помощью таких механизмов, как Reflection API и Магические Методы. Доступно много Магических Методов, например: __get() , __set() , __clone() , __toString() , __invoke() , и т.д., которые позволяют отслеживать поведение внутри класса. Разработчики Ruby часто говорят, что PHP не хватает method_missing , но он доступен, как __call() и __callStatic() .

Пространства имен

Как было сказано выше, сообщество PHP состоит из множества разработчиков, создающих очень много кода. Это значит, что одна библиотека PHP может иметь такое же название класса, как и другая. Когда обе библиотеки используются в одном пространстве имен, они конфликтуют и возникают проблемы.

Пространства имен решают эту проблему. Как описано в руководстве PHP, пространства имен можно сравнить с папками операционной системы, которые являются пространствами имен файлов; два файла с одинаковым именем могут сосуществовать в разных директориях. Подобно этому, два PHP класса с одинаковым названием могут существовать в разных пространствах имен PHP.

Использование пространств имен необходимо для того, чтобы избежать конфликтов при использовании вашего кода с библиотеками других разработчиков.

Один из рекомендуемых способов использования пространств имен описан в PSR-4, который призван обеспечить стандарты для описания файлов, классов и пространств имен, что позволяет создавать подключаемый (plug-and-play) код.

Стандартная Библиотека PHP (SPL)

Стандартная библиотека PHP (SPL) поставляется вместе с PHP и предоставляет набор классов и интерфейсов. Она состоит в основном из часто используемых классов структур данных (стек, очередь, куча, и т.д.), а также итераторов, которые предназначены для прохождения через эти структуры данных или ваши собственные классы, которые реализуют интерфейсы SPL.

Интерфейс командной строки

Главная цель, с которой был создан PHP — это разработка веб-приложений, но он также полезен при написания кода для интерфейса командной строки (CLI). PHP программы командной строки могут помочь вам автоматизировать такие общие задачи, как тестирование, развертывание и администрирование приложения.

CLI PHP программы очень мощные, потому что вы можете использовать код вашего приложения напрямую, без нужды в создании и обеспечении безопасности веб-интерфейса (GUI) для него. Только убедитесь, что вы не используете для ваших скриптов (CLI) корень вашего веб-сервера.

Попробуйте запустить PHP из консоли:

Опция -i выдаст вам конфигурацию вашего PHP, подобно функции phpinfo .

Опция -a предоставляет доступ к интерактивной оболочке, подобно ruby IRB или интерактивной оболочки python. Также существует целый ряд других полезных опций командной строки.

Давайте напишем простую «Привет, $name» программу CLI. Чтобы это сделать, создайте файл с именем hello.php , как показано ниже.

PHP устанавливает две специальные переменные, основанных на аргументах, с которыми запущен ваш скрипт. $argc — это переменная с числовым значением, которая содержит количество переданных аргументов, $argv — это массив, содержащий значение каждого аргумента. Первый аргумент — всегда название вашего PHP скрипта, в этом случае hello.php .

Выражение exit() используется с ненулевым числом, чтобы дать оболочке понять, что команда не удалась. Часто используемые коды завершения можно найти здесь

Для запуска сценария, указанного выше, наберите в командной строке:

XDebug

Один из самых полезных инструментов в разработке программного обеспечения — хороший отладчик. Он позволяет вам отследить исполнение вашего кода и контролировать содержимое вашего стека. XDebug — это PHP отладчик, который может использоваться различными IDE, чтобы дать вам возможность устанавливать Брейкпоинты (точки отладки кода) и контролировать стек. Он также позволяет использовать такие инструменты, как PHPUnit и KCacheGrind, для покрытия кода тестами и его профилирования.

Если вы оказываетесь в безвыходном положении при использовании var_dump/print_r, и у вас не получается найти решение, то возможно вам поможет использование отладчика.

Установка XDebug может оказаться сложной, но одна из самых полезных его функций это «Удаленная отладка» — если вы разрабатываете код локально и затем тестируете его в локальной машине или на другом сервере, Удаленная Отладка — это возможность, которую вы захотите сразу же включить.

Стандартно, вы отредактируете ваш Apache VHost или .htaccess файл со следующими значениями:

“remote_host” и “remote_port” будут указывать на ваш локальный компьютер и порт, который вы указали в вашей IDE для прослушивания. Дальше достаточно включить режим «ожидания соединений» в вашей IDE, и загрузить URL:

Ваша IDE теперь будет перехватывать текущее состояние, позволяя вам устанавливать брейкпоинты и исследовать значения в памяти по мере выполнения скрипта.

Менеджер зависимостей

Существует много библиотек, фреймворков и компонентов PHP на выбор. Ваш проект, скорее всего, будет использовать некоторые из них — это и есть зависимости проекта. До недавнего времени в PHP не существовало удобного способа для управления зависимостями проекта. Даже если вы управляете ими вручную, вам приходилось беспокоиться об автозагрузчиках. Больше это не требуется.

В настоящее время существует две основные системы управления пакетами для PHP — Composer и PEAR. Какая из них подходит именно вам? Ответ — обе.

  • Используйте Composer для управления зависимостями одного проекта.
  • Используйте PEAR для управления зависимостями всех проектов во всей вашей системе.

В общем, пакеты Composer будут доступны только в проектах, для которых вы явно укажете его использование, тогда как пакеты PEAR будут доступны во всех ваших PHP проектах. PEAR, на первый взгляд, может показаться более простым подходом, но есть преимущества в использовании подхода «проект-к-проекту» для зависимостей.

Composer и Packagist

Composer является блестящим менеджером зависимостей для PHP. Укажите список зависимостей вашего проекта в файле composer.json и, с помощью нескольких простых команд, Composer автоматически скачает зависимости вашего проекта и установит для вас автозагрузку.

На данный момент существует много PHP библиотек, которые совместимы с Composer, готовых для использования в вашем проекте. Список этих «пакетов» есть на Packagist, официальном репозитории для Composer-совместимых PHP библиотек.

Как установить Composer

Вы можете установить Composer локально (в вашей текущей рабочей директории; хотя это не рекомендуется) или глобально (например /usr/local/bin). Предположим, вы хотите установить Composer локально. Из корневой директории вашего проекта выполните:

Это позволит загрузить файл composer.phar (бинарный PHP-архив). Вы можете запустить его, используя php для управления зависимостями вашего проекта. Обратите внимание: Если вы скачаете код напрямую в ваш интерпретатор, пожалуйста, сперва прочитайте код онлайн, для подтверждения его безопасности.

Как установить Composer (вручную)

Ручная установка Composer — это продвинутая техника; однако, существуют причины, по которым разработчик может предпочесть именно этот метод использованию интерактивной установки. Интерактивная установка проверяет настройки PHP, чтобы подтвердить, что:

  • Используется необходимая версия PHP
  • Файлы .phar могут быть верно выполнены
  • Определенные права на каталог достаточны
  • Не установлены конфликтные расширения
  • Установлены необходимые настройки php.ini

В случае, если ни одно из этих условий не соблюдено, вы должны принять решение стоит ли идти на такой компромисс. Ниже описано, как установить Composer вручную:

Путь $HOME/local/bin (или другой каталог, выбранный вами) должен находиться в вашей переменной окружения $PATH . Это позволит быть доступной команде composer .

Если вы прочтете документацию Composer, которая гласит, что нужно запускать Composer с помощью команды php composer.phar install , вы можете заменить эту команду на:

Как объявить и установить зависимости

Composer продолжает следить за зависимостями вашего проекта в файле composer.json . Вы можете управлять им вручную, если вам нравится, или же использовать сам Composer. Команда php composer.phar require добавляет зависимость в проект и, если в каталоге нет файла composer.json , он будет создан. Далее мы рассмотрим пример, который добавляет Twig, как зависимость вашего проекта. Запустите это в корневой директории вашего проекта, куда вы загружали composer.phar :

Аналогично команда php composer.phar init проведет вас через создание полного файла composer.json для вашего проекта. Есть и другой путь, когда вы создадите файл composer.json вы можете сказать Composer, чтобы он скачал все ваши зависимости в папку vendors/ . Это также применимо для проектов, которые вы загрузили и которые предоставляют файл composer.json :

Затем добавьте этот код в основной PHP-файл вашего приложения; это укажет PHP использовать автозагрузчик Composer для зависимостей вашего проекта.

Теперь вы можете использовать зависимости вашего проекта и они будут автоматически загружаться (по требованию).

Обновление зависимостей

Composer создает файл composer.lock который хранит точную версию каждого пакета, который он загрузил во время первого запуска php composer.phar install . Если вы поделились проектом с другими разработчиками и файл composer.lock является частью него, то при запуске php composer.phar install они получат ту же версию, что и вы. Чтобы обновить ваши зависимости запустите php composer.phar update .

Очень удобно гибко указывать требуемые версии. Если вы нуждаетесь в версии

1.8, что значит “всё что новее 1.8.0, но меньше 2.0.x-dev”. Вы также можете использовать шаблон * , например 1.8.* . Теперь команда Composer php composer.phar update обновит все ваши зависимости до новейших версий, которые соответствуют указанным ограничениям.

Проверка ваших зависимостей на безопасность

Security Advisories Checker является веб-сервисом и инструментом командной строки, оба из которых изучают ваш файл composer.lock и сообщают, если есть необходимость в обновлении какой-либо из ваших зависимостей.

Другим ветераном среди пакетных менеджеров, которым наслаждаются многие PHP-разработчики, является PEAR. Он работает практически так же, как и Composer, но имеет несколько важных отличий.

PEAR требует, чтобы каждый пакет имел определенную структуру, это означает, что автор пакета должен подготовить его для использования с PEAR. Использование проекта, который не был подготовлен для работы с PEAR невозможно.

PEAR устанавливает пакеты глобально, что означает то, что после установки, они доступны всем проектам на этом сервере. Это может быть полезно, если много проектов строятся на тех же пакетах с той же версией, но может привести к проблемам, если проекты разрабатывались для разных версий.

Как установить PEAR

Вы можете установить PEAR, загрузив установщик phar и выполнив его. Документация PEAR содержит подробную инструкцию по установке для каждой операционной системы.

Если вы используете Linux, вы также можете посмотреть наличие PEAR в пакетном менеджере вашего дистрибутива. Debian и Ubuntu, к примеру, содержат информацию о пакете php-pear в пакетном менеджере apt.

Как установить пакет

Если пакет существует в списке пакетов PEAR, вы можете установить его, указав официальное название:

Если пакет выложен на другом канале, вам нужно сначало сделать discover этого канала и затем указать его во время установки. Подробнее об этом в использование каналов.

Обработка зависимостей PEAR с Composer

Если вы уже используете Composer и желаете установить какой-то код из PEAR, вы можете использовать Composer для обработки зависимостей PEAR. Этот пример установит код из pear2.php.net :

Первый раздел «repositories» даст понять Composer, что он должен сделать “initialise” (или “discover” в терминологии PEAR) репозиторий pear. Затем секция require укажет именам пакетов префикс, как ниже:

Префикс “pear” жестко ограничен, чтобы избежать любых конфликтов, так как каналы Pear могут быть схожи с другими поставщиками пакетов например, вместо короткого имени (или полного URL) может быть использовано для объявления в каком канале находится пакет.

Когда код будет установлен он будет доступен в вашей папке vendor и автоматически доступен через автозагрузчик (файл Autoload) Composer.

Чтобы использовать этот пакет PEAR просто объявите как ниже:

Практики написания кода

Основы

PHP — это обширный язык, который позволяет разработчикам всех уровней писать код не только быстро, но и эффективно. В любом случае, изучая язык, мы нередко забываем основы, которые мы изучали изначально (или бегло просмотрели), в пользу коротких путей и/или вредных привычек. Чтобы помочь в борьбе с этой общей проблемой, эта секция предназначена для напоминания разработчикам основ практик написания кода PHP.

Дата и время

PHP содержит встроенный класс DateTime, предназначенный для чтения, записи, сравнения и вычисления даты или времени. Также в PHP много функций, связанных с датой и временем, помимо класса DateTime, но класс предоставляет хороший объектно-ориентированный интерфейс для решения большинства задач. Он способен даже обрабатывать временные зоны, но это уже не рассматривается в данном коротком введении.

Для начала работы с DateTime, сконвертируйте «сырую» строку даты и времени в объект с помощью фабричного метода createFromFormat() или выполните new \DateTime , чтобы получить текущую дату и время. Используйте метод format() для конвертирования DateTime обратно в строку для вывода.

Вычисления с DateTime возможны с использованием класса DateInterval. У класса DateTime есть методы add() и sub() , которые принимают DateInterval, как аргумент. Не пишите код, который ожидает одинаковое число секунд каждый день, перевод часов и смена часовых поясов разрушат это предположение. Вместо этого используйте интервалы дат. Для расчета разницы между датами используйте метод diff() . Он вернет новый объект DateInterval, который очень легко отобразить.

С объектами DateTime, вы можете использовать стандартные методы сравнения:

И последний пример для демонстрации класса DatePeriod. Он используется для перебора повторяющихся событий. Класс может принимать два объекта DateTime, начало и конец, и интервал, для которого он вернет все события между ними.

Design Patterns

При построении приложения полезно использовать в коде шаблоны, а также придерживаться некоторых стандартов для всей структуры проекта. Использование шаблонов полезно, потому что оно упрощает управление кодом, а также позволяет другим разработчикам быстро понять, как всё взаимодействует друг с другом.

Если вы используете фреймворк, то большинство высокоуровневого кода и структура проекта будет основываться на архитектуре фреймворка, поэтому большинство решений относительно шаблона сделано за вас. Но всё же наиболее верным решением будет выбрать наиболее подходящие шаблоны и следовать им в коде, который вы пишете на базе фреймворка. С другой стороны, если вы не используете фреймворк для построения приложения, тогда вы должны найти шаблоны, которые наилучшим образом соответствуют типу и размеру приложения, которое вы создаете.

Исключения

Исключения — это неотъемлемая часть большинства популярных языков программирования, но зачастую PHP разработчики не уделяют им должного внимания. Языки, подобные Ruby, очень подробно обрабатывают исключения, поэтому, если что-то идёт не верно, например: не удался HTTP запрос, запрос к базе данных происходит неправильно или если запрошенное изображение не было найдено, Ruby (или используемые гемы) выбросит исключение на экран, помогающее понять где вы допустили ошибку.

PHP сам по себе довольно слаб в плане этого и вызов file_get_contents() , как правило, даст вам только FALSE и предупреждение. Многие устаревшие PHP-фреймворки, как CodeIgniter, просто вернут false, добавят сообщение в свой собственный журнал и, может быть, дадут вам использовать метод, как $this->upload->get_error() , чтобы посмотреть, что пошло не так. Проблема в том, что вы должны искать ошибку и проверять документацию, чтобы понять, какой ошибочный метод существует в этом классе, вместо того, чтобы сделать это всё более очевидным.

Еще одна проблема в том, что классы автоматически выдают ошибку на экран и закрывают процесс. Когда вы делаете это, вы не даете другому разработчику динамически обработать эту ошибку. Исключения должны быть выброшены, чтобы дать разработчику знать об ошибке и выбрать, как её обработать. Например:

Исключения SPL

Универсальный класс Exception предоставляет очень мало отладочного контекста для разработчика; как бы то ни было, для того чтобы исправить это, можно создать специализированный класс, который будет расширять возможности универсального класса Exception :

Это означает, что вы можете добавить несколько блоков отлова и обрабатывать разные исключения по-разному. Это может привести к созданию множества изменённых Исключений, некоторые из которых можно было бы избежать, используя Исключения SPL, предоставляемые расширением SPL.

Например, если вы используете магический метод __call() и вами был вызван неизвестный метод, то вместо выбрасывания стандартного исключения, которое очень расплывчато, или вместо создания своего исключения, вы можете просто использовать throw new BadFunctionCallException; .

Базы данных

Скорее всего, ваш PHP код будет использовать базу данных для сохранения информации. Существует несколько вариантов для подключения и взаимодействия с базой данных. Рекомендуемым вариантом до PHP 5.1.0 было использование нативных (родных) драйверов, таких как mysql, mysqli, pgsql, etc.

Встроенные драйвера замечательны, если вы используете ОДНУ базу данных в ваших приложениях, но если, например, вы используете MySQL и немного MSSQL, или вам нужно подключиться в базе данных Oracle, тогда вы не сможете использовать те же драйвера. Вам нужно будет изучить новый API для каждой базы данных — и это может оказаться нерациональным.

Обратите внимание, что расширение mysql для PHP больше не поддерживается, и его официальным статусом, начиная с PHP версии 5.4.0, является «Устарело в связи с длительным сроком использования». Это значит, что оно будет удалено в течение нескольких следующих релизов, так что в PHP 5.6 (или в версиях, следующих за 5.5) оно вполне может пропасть. Если вы используете mysql_connect() и mysql_query() в своих приложениях, тогда вам придется столкнуться с переписыванием кода, поэтому лучшим вариантом сейчас является использование в приложениях mysqli или PDO вместо mysql, прежде чем вы в дальнейшем столкнётесь с нерабочими приложениями. Если вы начинаете изучение баз данных с нуля, тогда полностью откажитесь от использования расширения mysql — используйте Расширение MySQLi или PDO.

PDO — это абстрактная библиотека для подключения к базе данных, встроенная в PHP с версии 5.1.0, которая обеспечивает единый интерфейс для взаимодействия с большим количеством различных баз данных. PDO не будет переводить ваши SQL запросы или эмулировать отсутствующие возможности; он чист для подключения к нескольким типам баз данных с тем же API.

Более важно, что PDO позволяет вам безопасно вводить пользовательские данные (например идентификатор) в ваши SQL запросы, без беспокойства о SQL-инъекциях. Это возможно благодаря использованию PDO выражений и связывания (bound) параметров.

Предположим, что PHP скрипт получает числовой идентификатор в качестве параметра из запроса. Этот идентификатор должен быть использован для получения пользовательских записей из базы данных. Ниже приведён неправильный способ реализации этого:

Это ужасный код. Вы вставляете необработанные параметры в SQL запрос. Это приведёт к взлому. Просто представьте, что взломщик сделает запрос http://domain.com/? >, который присвоит переменной $_GET[‘id’] значение 1;DELETE FROM users и приведёт к удалению всех ваших пользователей! Вместо этого, вы должны очистить ввод идентификатора с помощью связывания параметров PDO.

Это правильный код. Он использует связанный параметр в выражении PDO. Это позволяет избежать ввода некоректного ID перед тем, как передать запрос в базу данных, тем самым предотвращая потенциальные SQL-инъекции.

Вы также должны понимать, если подключение не закрыто должным образом, то оно использует много ресурсов, которые тратятся впустую, впрочем это больше относится к другим языкам. Используя PDO, вы можете неявно закрывать подключение уничтожив объект — все ссылки на него будут удалены, т.е. установлены в NULL. Если не сделать этого явно, PHP закроет подключение за вас, когда выполнение скрипта завершится, если только вы не используете постоянные подключения.

Уровни абстракции

Многие фреймворки предоставляют собственный уровень абстракции, который может строиться на основе PDO. Такая фактическая абстракция баз данных позволяет оборачивать запросы на PHP в методы, которые отсутствуют в одной системе баз данных, но работают в другой. Это, конечно, добавит небольшие накладные расходы, но если вы строите портативные приложения, которым необходима работа с MySQL, PostgreSQL и SQLite, тогда, для чистоты кода, минимальными накладными расходами можно пренебречь.

Некоторые уровни абстракции построены с использованием PSR-0 стандарта, поэтому могут быть установлены в любое приложение:

Безопасность

Безопасность веб-приложений

Есть плохие люди, которые могут и хотят взломать ваши веб-приложения. Важно принять необходимые меры предосторожности, чтобы укрепить безопасность вашего приложения. К счастью, прекрасные люди в The Open Web Application Security Project (OWASP) составили полный список известных проблем безопасности и методов защиты от них. Это должно быть прочитано любым разработчиком, заботящимся о безопасности.

Хэширование паролей

Наверное, каждый PHP-разработчик занимается разработкой приложений, которые нуждаются в пользовательской авторизации. Имя пользователя и пароль хранятся в базе данных и позже используются для авторизации пользователя.

Очень важно правильно хэшировать пароль перед его сохранением. Хэширование пароля является необратитым, односторонняя функция применяется на пользовательских паролях. Она возвращает строку определенной длины, которую невозможно расшифровать. Это значит, что вы можете сравнить один хэш с другим, чтобы понять, что они пришли из одной и той же исходной строки, но вы не можете определить оригинальную строку. Если ваши пароли не захэшированы, и доступ к базе данных получен третьй стороной, то ваши пользовательские аккаунты теперь скомпрометированы. Некоторые пользователи (к сожалению) могут использовать один и тот же пароль для разных сервисов. Как бы то ни было, очень важно серьезно относиться к безопасности.

Хэширование паролей с функцией password_hash

В PHP 5.5 была представлена функция password_hash . Сейчас она использует BCrypt, сильнейший алгоритм, поддерживаемый PHP. Она будет обновлена в будущем, для поддержки бОльшего числа алгоритмов, по мере необходимости. Библиотека password_compat была создана для обратной совместимости с PHP >= 5.3.7.

Ниже мы хэшируем строку и далее сверяем её с новой строкой. Поскольку наши две исходные строки отличаются (‘secret-password’ и ‘bad-password’) эта авторизация будет неудачной.

Фильтрация данных

Никогда не доверяйте пользовательскому вводу, который передаётся вашему PHP коду. Всегда проверяйте и очищайте пользовательский ввод перед его использованием в коде. Функции filter_var и filter_input помогут очистить переменные, а также проверить соответствие введённых данных некоторому формату (например, адрес электронной почты).

Пользовательский ввод может быть различным: $_GET и $_POST , данные введённые в форму, некоторые значения в суперглобальной переменной $_SERVER и тело HTTP запроса, открытое с помощью fopen(‘php://input’, ‘r’) . Запомните, что пользовательский ввод не ограничивается данными формы, отправленной пользователем. Отправляемые и загружаемые файлы, значения сессий, данные cookie и данные сторонних веб-сервисов также приравниваются к пользовательскому вводу.

Хотя пользовательские данные могут быть без проблем сохранены, скомбинированы и к ним может быть получен доступ позже, они всё ёще являются пользовательским вводом. Каждый раз, когда вы что-либо обрабатываете, объединяете или подключаете данные в ваш код, спросите себя, отфильтрованы ли эти данные и можно ли им доверять.

Данные могут быть отфильтрованы по-разному, в зависимости от их назначения. Например, когда нефильтрованные данные, введённые пользоватем, передаются в HTML код страницы, он может выполнить HTML и JavaScript на вашем сайте! Этот тип атаки известен, как Cross-Site-Scripting (XSS) и может иметь очень серьёзные последствия. Один из способов избежать XSS заключается в очистке ввода от всех HTML тэгов (их удалением, или заменой на HTML символы) с помощью функции strip_tags или экранирование символов в равносильные им HTML сущности с функцией htmlentities или htmlspecialchars .

Другой пример, передача данных для выполнения командной строкой. Это может быть крайне опасно (и, как правило — это плохая идея), но вы можете использовать встроенную функцию escapeshellarg для очистки аргументов командной строки.

Последний пример, принимает пользовательский ввод, чтобы определить, какой файл загружать из файловой системы. Это может быть использовано для изменения имени файла на путь файла. Вам нужно убрать “/”, “../”, нулевые байты или другие символы из пути файла, так чтобы скрипт не мог загружать скрытые, непубличные или конфиденциальные файлы.

Санитизация

Санитизация удаляет (или экранирует) неправильные или небезопасные символы из пользовательского ввода.

Например, вам необходимо нормализовать пользовательский ввод перед подключением ввода в HTML или его вставкой в сырой SQL запрос. Когда вы используете связанные параметры с PDO, они будут очищать ввод за вас.

Иногда требуется разрешить некоторые безопасные HTML тэги в вводе, когда он подключается в HTML страницу. Это очень трудно сделать и многие избегают этого, используя ограниченное форматирование, как например Markdown или BBCode, либо библиотеки с белым списком, как HTML Purifier, существующие по этой причине.

Валидация

Валидация гарантирует, что пользовательский ввод, является тем, что вы ожидаете. Например, вы можете валидировать адрес электронной почты, номер телефона или возраст при обработке запроса регистрации.

Конфигурационные файлы

Когда вы создаёте файлы конфигурации для ваших приложений, рекомендуется использование одного из следующих способов:

  • Рекомендуется хранить вашу конфигурационную информацию там, где к ней не может быть получен доступ напрямую, а доступ к ней осуществлялся через файловую систему.
  • Если вы вынуждены хранить конфигурационные файлы в корневом каталоге, именуйте файл с расширением .php . Это гарантирует, что, если к скрипту обратятся напрямую, он не будет выведен, как обычный текст.
  • Информация в файлах конфигурации, должна быть защищена соответственно, либо с помощью шифрования или системных прав группы/пользователя файла.


Использование глобальных переменных

Примечание: С появлением PHP 5.4 директива register_globals была удалена и больше не может быть использована. Это касается тех, кому нужно обновить старое приложение.

Включенный параметр конфигурации register_globals делает несколько типов переменных (в том числе из $_POST , $_GET и $_REQUEST ) глобальными, доступными в глобальной области видимости вашего приложение. Это может легко привести к проблемам с безопасностью, поскольку ваше приложение не сможет эффективно определить откуда пришли данные.

Например : $_GET[‘foo’] будет доступна через $foo , которая может заместить переменную, которая не была объявлена. Если вы используете PHP register_globals off (выключена).

Сообщения об ошибках

Логирование ошибок полезно при поиске проблемных мест вашего приложения, также логирование может выдать информацию о структуре вашего приложения. Для эффективной защиты вашего приложения от проблем, которые могут быть вызваны выводом этих сообщений, вам необходимы различные настройки сервера для разработки и продакшна.

Разработка

Для того, чтобы видеть все возможные ошибки во время разработки, настройте следующие параметры в вашем php.ini :

Установка значения в -1 покажет каждую возможную ошибку, даже если новые уровни и константы будут добавлены в новых версиях PHP. Константа E_ALL ведёт себя так-же в PHP 5.4. — php.net

Константа уровня ошибок E_STRICT была введена в 5.3.0 и не является частью E_ALL , как бы то ни было, она стала частью E_ALL в 5.4.0 Что это значит? Для вывода всех возможных ошибок в версии 5.3 вам нужно использовать либо -1 либо E_ALL | E_STRICT .

Вывод всех ошибок разными версиями PHP

  • -1 or E_ALL
  • 5.3 -1 or E_ALL | E_STRICT
  • > 5.3 -1 or E_ALL

Продакшн

Чтобы спрятать все ошибки вашей среды во время продакшна, настройте ваш php.ini следующим образом:

С этими настройками в продакшне, ошибки всё также будут записываться в лог ошибок веб сервера, но не будут показаны пользователю. Для подробной информации об этих настройках, смотрите руководство PHP:

Тестирование

Написание автоматизированных тестов для вашего кода PHP, считается наилучшей практикой. Автоматизированные тесты являются отличным инструментом для подтверждения того, что ваше приложение не сломается, когда вы внесёте изменения или добавите новую функциональность.

Существует несколько различных типов инструментов тестирования (или фреймворков) доступных для PHP, которые используют различные подходы — все, пытаются избежать ручного тестирования и нуждаются в больших командах проверки качества, чтобы убедиться, что изменения не сломают существующую функциональность.

Тесто-ориентированная разработка

Разработка через тестирование (TDD) представляет собой процесс разработки программного обеспечения, который опирается на повторении очень короткого цикла разработки: сперва, разработчик пишет автоматизированные тесты, которые определяют желаемое улучшение или новую функцию, далее производит код, который успешно пройдет этот тест и наконец производит рефактор кода для соответствия стандартам. Kent Beck, человек которому приписывают статус разработчика или “переоткрывателя” техники, TDD предлагает простую конструкцию, а также вселяет уверенность.

Существует несколько различных типов тестирования, которые вы можете сделать для вашего приложения.

Модульное тестирование (Unit Testing)

Модульное тестирование — это подход к программированию, который позволяет удостовериться, что функции, классы и методы работают, как ожидается с момента начала и до конца разработки. Проверяя значения, которые приходят и выходят из различных функций и методов, вы можете быть уверены, что внутренняя логика работает правильно. Используя Внедрение Зависимостей и внедрение классов «макетов» и заглушек, вы можете убедиться, что зависимости используются правильно для большего покрытия тестами.

При создании класса или функции, вы должны создать модульный тест для каждого возможного поведения. На базовом уровне, вы должны убедиться, что ваш код выдаёт ошибку, если вы отсылаете неправильные аргументы и работает, если вы отсылаете правильные аргументы, соответственно. Это поможет убедиться в том, что изменения, которые вы сделаете относительно этого класса или функции позднее не помешают старым работать как ожидалось. Единственная альтернатива этому var_dump() в test.php, который не является способом создания приложений — больших или маленьких.

Ещё одно использование модульных тестов — вклад в open source. Если вы можете писать тесты, которые показывают сломанную функциональность, тогда почините её, и покажите, что тест пройден, патчи имеют больше шансов быть принятыми. Если вы запускаете проект, который допускает Pull Request, тогда вы должны указать это в качестве требования.

PHPUnit является фреймворком тестирования стандарта де-факто для написания модульных тестов в PHP приложениях, но также существует несколько альтернатив.

Интеграционное тестирование

Интеграционное тестирование (иногда называется Интеграция и Тестирование, с аббревиатурой “I&T”) это фаза в тестирование програмнного обеспечения, в котором отдельные модули, комбинируются и тестируются, как группа. Это происходит после модульного тестирования и перед валидационным тестированием. Integration testing takes as its input modules that have been unit tested, groups them in larger aggregates, applies tests defined in an integration test plan to those aggregates, and delivers as its output the integrated system ready for system testing.

Многие инструменты, которые могуть быть использованы для модульного тестирования, также могут быть использованы для интеграционного тестирования, поскольку используются схожие принципы.

Функциональное тестирование

Также известное, как подтверждающее тестирование, функциональное тестирование состоит из использования инструментов для создания автоматизированных тестов, которые по-настоящему используют ваше приложение, а не просто проверяют, что отдельные куски (модули) кода ведут себя и могут взаимодействовать правильно. Эти инструменты обычно работают, используя реальные данные и симулируя реальных пользователей приложения.

Инструменты функционального тестирование

  • Selenium
  • Mink
  • Codeception это фреймворк для тестирования (всё-в-одном), включающий инструменты подтверждающего тестирования

Поведенческо-ориентированная разработка

Существует две разновидности Поведенческо-ориентированной разработки (BDD): SpecBDD и StoryBDD. SpecBDD концентрируется на техническом поведении или коде, в то время как StoryBDD концентрируется на деле, будущем поведении или взаимодействии. PHP имеет фреймворки для обоих типов BDD.

Используя StoryBDD, вы пишите читаемые людьми истории, которые объясняют поведение вашего приложения. Эти истории могут быть запущены, как актуальные тесты для вашего приложения. Фреймворк, используемый в PHP приложениях для StoryBDD — Behat, который вдохновлён проектом для Ruby Cucumber и реализует Gherkin DSL для объяснения особенностей поведения.

Вместе со SpecBDD, вы пишите спецификацию, которая объясняет, как ваш код должен себя вести. Вместо тестирования функции или метода, вы объясняете, как эта функция или метод должен себя вести. PHP предлагает фреймворк PHPSpec для данных целей. Этот фреймворк вдохновлён проектом RSpec для Ruby.

Инструменты

  • Behat, StoryBDD фреймворк для PHP, вдохновлённый проектом для Ruby Cucumber;
  • PHPSpec, SpecBDD фреймворк для PHP, вдохновлённый проектом для Ruby RSpec;
  • Codeception это фреймворк для тестирования (всё-в-одном), использующий принципы BDD;

Дополнительные инструменты тестирования

Помимо индивидуального тестирования и поведенческо-ориентированных фрэймворков, существует ряд общих фреймворков и вспомогательных библиотек, полезных для любого предпочтительного подхода.

Инструменты

  • Selenium автоматизационный инструмент для браузера интегрируемый с PHPUnit
  • Mockery Mock Object Framework интегрируемый с PHPUnit или PHPSpec

Сервера и развертывание

PHP приложения могут быть развернуты и запущены на продакшн веб-сервере рядом способов.

Платформа, как сервис (PaaS)

PaaS предоставляет системную и сетевую архитектуры, необходимые для запуска PHP приложений в веб. Это означает, как минимум, отсутствие настройки для запуска PHP приложений или PHP фреймворков.

В недавнее время PaaS стал очень популярным методом для развертывания, хостирования и расширения PHP приложений всех размеров. Вы можете найти список провайдеров PHP PaaS в нашей ресурсной секции.

Виртуальный или выделенный сервер

Если вы знакомы с администрированием системы, или заинтересованы в его изучении, виртуальный или выделенный сервер даст вам полный контроль над средой продакшна вашего приложения.

nginx и PHP-FPM

PHP, через встроенный в него менеджер процессов FastCGI (FPM), очень хорошо сочетается с nginx, который является легковесным и высокопроизводительным веб-сервером. Он использует меньше памяти, чем Apache и может лучше обрабатывать конкурентные запросы. Это особенно важно на виртуальном сервере, для которого может быть критичен объем используемой памяти.

Apache и PHP

PHP и Apache имеют длинную совместную историю. Apache широконастраиваемый и имеет большое количество доступных модулей для расширения функциональности. Это очень популярный выбор для виртуальных хостингов и лёгкой установки PHP фреймворков и приложений с открытым исходным кодом, как WordPress. К сожалению, Apache использует больше ресурсов, чем nginx, и не может выдержать столько же посетителей одновременно.

Apache имеет несколько возможных конфигураций для запуска PHP. Самая популярная и лёгкая для установки prefork MPM вместе с mod_php5. Хотя это не самое эффективное в отношении памяти решение, оно очень просто для установки и использования. Наверное, это лучшее решение, если вы не хотите углубляться в серверное администратирование. Если вы хотите использовать mod_php5, вы обязаны использовать prefork MPM.

Если вы хотите получить больше производительности и стабильности с Apache, тогда вы можете взглянуть на ту же FPM систему, как в nginx и запустить worker MPM или event MPM, используя mod_fastcgi или mod_fcgid. Эта конфигурация позволит получить существенную экономию в памяти и будет намного быстрее, но потребует больше работы для установки.

Виртуальный хостинг

PHP, благодаря своей популярности, установлен на большом количестве виртуальных хостингов. Очень трудно найти хостинг без установленного PHP, но очень важно убедиться в том, что установлена последняя версия. Виртуальные хостинги позволяют вам и другим разработчикам развертывать веб-сайты на одной машине. Достоинством виртуального хостинга является его низкая цена. Недостатком — то, что вы не знаете, чем будут заниматься ваши соседи; сильно загружая сервер или открывая бреши в безопасности. Если бюджет вашего проекта позволяет избежать использования Виртуальных хостингов, то рассмотрите другие варианты.

Построение и развёртывание вашего приложения

Если вы обновляете структуру базы данных вручную или запускаете вручную тесты перед обновлением ваших файлов, то подумайте дважды! С каждой дополнительной необходимой ручной задачей для развёртывания новой версии вашего приложения, потенциальный шанс возникновения фатальной ошибки возрастает. Делаете ли вы простое обновление, полный процесс сборки или стратегию непрерывной интеграции автоматизация сборки — ваш друг.

Среди задач, которые вы, возможно, захотите автоматизировать:

  • Управление зависимостями
  • Компиляция, минификация файлов (assets)
  • Запуск тестов
  • Создание документации
  • Запаковка
  • Развёртывание

Создание инструментов автоматизации

Инструменты построения — коллекция скриптов, которые обрабатывают общие задачи развёртки приложений. Инструменты постройки не являются частью вашего приложения, они взаимодействуют с вашим приложением «извне».

Существует большое количество инструментов с открытым исходным кодом, которые могут помочь вам автоматизировать процесс постройки, некоторые написаны на PHP, другие на других языках. Это не должно удерживать вас от их использования, если они лучше подходят под задачу. Вот несколько примеров:

Phing самый простой путь, чтобы начать автоматическую развёртку в мире PHP. С Phing вы можете контролировать ваш процесс запаковки, развёртки или тестирования с помощью простого построечного XML файла. Phing (который базируется на Apache Ant) предоставляет богатый набор задач, часто необходимых для установки или обновления веб приложения, и может быть расширен дополнительными нестандартными задачами, написанными на PHP.

Capistrano — система для начинающих-профессиональных разработчиков для исполнения команд в структуризованном, воспроизводимом пути на одной или многих удалённых машинах. Предварительно он настроен для развёртки приложений Ruby on Rails. Как бы то ни было люди успешно развёртывают и PHP приложения с ним. Успех использования Capistrano зависит на умении работы с Ruby и Rake.

Сообщение в блоге Dave Gardner PHP Deployment with Capistrano является хорошей отправной точкой для PHP разработчиков, заинтересованных в Capistrano.

Chef является нечто большим, чем просто фрэймворк развёртки. Это очень мощный интеграционный фрэймворк, основанный на Ruby, который не просто развёртывает ваше приложение, но и может построить всё серверное окружение или виртуальный сервер.

Ресурсы о Chef для PHP разработчиков:

Для дальнейшего изучения:

Непрерывная интеграция

Непрерывная интеграция — это практика разработки программного обеспечения, при которой члены команды объединяют их работу очень часто, обычно каждый член команды объединяет как минимум ежедневно — что приводит к нескольким объединениям в день. Многие команды считают, что данный подход позволяет значительно сократить интеграционные проблемы и позволяет им разрабатывать совместный продукт быстрее.

Существуют разные пути, для осуществления непрерывной интеграции для PHP. Недавно Travis CI закончил великолепную работу по созданию непрерывной интеграции, реально даже для маленьких проектов. Travis CI — сервис непрерывной интеграции для сообщества с открытым исходным кодом. Оно интегрируется с GitHub и предлагает первоклассную поддержку для многих языков, включая PHP.

Для дальнейшего изучения:

Кэширование

PHP очень быстр сам по себе, но такие ресурсоёмкие операции, как установка удалённого подключения и, к примеру, загрузка файлов, могут привести к существенному падению скорости работы приложения. К счастью, есть различные инструменты, позволяющие поднять скорость определённых частей вашего приложения, или уменьшить количество запусков этих «тяжёлых» задач.

Кэширование байткода

Во время исполнения PHP файла, на низком уровне он сперва компилируется в байткод (или опкод) и только потом исполняется байткод. Если PHP файл не изменён, то байткод будет всегда одинаков. Это значит, что шаг компиляции — пустая трата процессорных ресурсов.

И тут настает время кэширования байткода. Оно предотвращает избыточные компиляции, сохраняя в памяти байткод и переиспользуя его в последовательных вызовах. Установка подобного кэширования — вопрос пары минут, а скорость вашего приложения поднимется существенно. Поэтому нет причин не использовать кэширование.

Начиная с PHP 5.5 появилось встроенное расширение для кэширования байткод — OPcache. Оно также доступно в виде отдельного расширения для ранних версий.

Популярные системы подобного кэширования:

  • APC (PHP 5.4 и более ранние)
  • XCache
  • Zend Optimizer+ (часть Zend Server)
  • WinCache (расширение для MS Windows Server)

Кэширование объектов

Бывают моменты, когда вам необходимо кэшировать определённые объекты в вашем коде, такие как данные, которые неразумно получать ещё раз из базы данных, когда результат вряд ли изменится. Вы можете использовать ПО для кэширования чтобы сохранить эти кусочки данных в памяти, что позволит чрезвычайно быстро обратиться к ним позже. Если вы сохраните эти объекты в хранилище данных и после получите их и выдадите напрямую из кэша для некоторых запросов, вы можете получить существенное улучшение производительности и уменьшение нагрузки на сервер базы данных.

Множество популярных решений для кэширования байткода также дают вам кэшировать данные, поэтому нет причин, чтобы не воспользоваться ими. APC, XCache и WinCache предоставляют API для сохранения данных из вашего PHP кода в свой кэш в памяти.

Самыми популярными системами кэширования объектов являются APC и memcached. APC — идеальный выбор для кэширования объектов, он включает простой API для добавления данных в кэш память и при этом очень просто устанавливается и используется. Единственное существующее ограничение APC состоит в том, что он привязан к серверу на котором установлен. Memcached, напротив, устанавливается как отдельный сервис, и к нему можно получить доступ по сети, что позволяет хранить объекты в очень быстром централизованном хранилище данных и множество других систем могут получать эти данные из него.

Учтите, если PHP запущен как (Fast-)CGI приложение внутри вашего веб-сервера, то каждый PHP процесс будет иметь собственный кэш, например, APC данные не будут расшарены между вашими процессами. В этом случае имеет смысл подумать об использовании вместо него memcached, так как он не ограничен процессом PHP.

В сетевой конфигурации APC зачастую выигрывает у memcached в плане скорости доступа, но memcached обладает возможностью масштабироваться быстрее и более широко. Если иметь несколько серверов для обслуживания приложения не входит в ваши планы или вам не нужны дополнительные возможности memcached, тогда APC будет лучшим выбором для кэширования объектов.

Пример использования APC:

Подробнее о популярных системах кэширования объектов:

Руководство по PHP русский перевод

25.02.2008 (последний раз редактировалось 01.02.2012)
сайт: http://ru2.php.net/download-docs.php
условия использования: бесплатно

скачать руководство PHP, русский (html) В формате html. Дата редакции 26-01-2012 (много html файлов)
скачать руководство PHP, русский (html) В формате html. Дата редакции 26-01-2012 (Одним большим файлом)
скачать руководство PHP, русский (chm) В формате chm. Дата редакции 26-01-2012 (с комментариями пользователей на английском)

Официальный мануал по php.
Освещает 4 и 5 версии php.
Это руководство состоит, главным образом, из справочника функций, а также содержит справочник языка, комментарии к наиболее важным из отличительных особенностей PHP, и другие дополнительные сведения.
онлайн версия справочника по функциям php

Содержание руководства:

Авторские права
Руководство по PHP
Предисловие
Приступая к работе
Введение
Простой учебник
Установка и настройка
Общие инструкции по установке
Установка на Unix системы
Installation on Mac OS X
Installation on Windows systems
FastCGI Process Manager (FPM)
Установка расширений PECL
Проблемы?
Runtime Configuration
Справочник языка
Основы синтаксиса
Типы
Переменные
Константы
Выражения
Операторы
Управляющие конструкции
Функции
Классы и объекты
Namespaces
Исключения
Ссылки. Разъяснения
Предопределённые переменные
Предопределённые исключения
Predefined Interfaces
Context options and parameters
Supported Protocols and Wrappers
Безопасность
Вступление
Общие рассуждения
Если PHP установлен как CGI
Если PHP установлен как модуль Apache
Безопасность файловой системы
Безопасность баз данных
Сообщения об ошибках
Использование глобальных переменных (Register_Globals)
Данные, введенные пользователем
Волшебные кавычки
Сокрытие PHP
Необходимость обновлений
Отличительные особенности
HTTP-аутентификация в PHP
Cookies
Sessions
Работа с XForms
Загрузка файлов на сервер
Работа с удаленными файлами
Работа с соединениями
Постоянные соединения с базами данных
Безопасный режим
Использование PHP в командной строке
Garbage Collection
Справочник функций
Изменение поведения PHP
Обработка аудио форматов
Службы аутентификации
Расширения по работе с датой и временем
Расширения для работы с командной строкой
Расширения сжатия и архивации
Обработка кредитных карт
Криптографические расширения
Расширения для работы с базами данных
Расширения для работы с файловой системой
Поддержка человеческих языков и кодировок
Обработка и генерация изображений
Расширения по работе с почтой
Математические расширенияMathematical
Генерация нетекстовых MIME форматов
Расширения для управления процессами программ
Другие базовые расширения
Другие службы
Расширения для работы с поисковыми системами
Расширения для работы с серверами
Расширения для работы с сессиями
Обработка текста
Расширения, относящиеся к переменным и типам
Веб-сервисы
Расширения только для Windows
Обработка XML
Ядро PHP: Руководство хакера по Zend Engine
Preface
The «counter» Extension — A Continuing Example
The PHP 5 build system
Extension structure
Memory management
Working with variables
Writing functions
Working with classes and objects
Working with resources
Working with INI settings
Working with streams
PDO Driver How-To
Extension FAQs
Zend Engine 2 API reference
Zend Engine 2 opcode list
Zend Engine 1
ЧАВО — ЧАВО: ЧАсто задаваемые Вопросы и Ответы на них
Общая информация
Списки рассылки
Получение PHP
Вопросы по Базам данных
Установка
Проблемы Сборки
Использование PHP
PHP и HTML
PHP и COM
PHP и другие языки
Переход из PHP 4 в PHP 5
Разные вопросы
Appendices
История PHP и смежных проектов
Migrating from PHP 5.2.x to PHP 5.3.x
Migrating from PHP 5.1.x to PHP 5.2.x
Migrating from PHP 5.0.x to PHP 5.1.x
Миграция с PHP 4 на PHP 5
Classes and Objects (PHP 4)
Отладка в PHP
Configure options
Директивы php.ini
Список/классификация расширений
Список псевдонимов функций
List of Reserved Words
List of Resource Types
Список доступных фильтров
Список поддерживаемых транспортных протоколов
Таблица сравнения типов в PHP
List of Parser Tokens
Userland Naming Guide
Об этом руководстве
Creative Commons Attribution 3.0
Список функций

Комментарии

05.09.2009 ljubchyk
Документация по РНР, а називается html)

26.01.2010 zohen
Посмотрим что ето замануал)))

31.03.2010 Dikan
Качаю вот, говорят хорошая книга, по изучаю.

01.04.2010 Mistic
вобщем то очень доступно описано.
сам не зная не одного языка программирования в течении двух недель освоил php именно по этой книге(это было пару лет назад).
это классический мануал по php

13.07.2010 LuMeN
Надеюсь поможет поверю на слова

24.12.2010 Nosirjon
Скачаю начал изучачть html а потом php

21.04.2011 babay
Если это «PHP русский», то я — Папа Римский.

25.04.2011 виктор
Для Папы Римского, ты прочитал два слова из всего, что тут написано?
Это руководство по PHP на русском языке.
Никто тут даже не пытался сказать, что PHP русский.

Админ, поставь в названии запятую «Руководство по PHP, русский» или «Руководство по PHP на русском».

18.05.2011 KaReN
Ну попробую, до этого ,было object pascal в среде дельфи, щсейчас решил в инете прробовал html, хочу попробовать нечто большее

01.06.2011 Денис
Да не слушайте вы ни кого, нормальный такое руководство, конечно не, то что нужно было мне, но тем кто хочет его освоить самое оно!
P.S. мне нужно было описание функций и волей судьбы выплыл сюда.

02.06.2011 виктор
Денис, вот как раз в этом мануале и есть описание функций.
Вобщем то самое основное в этом справочнике описание функций

03.12.2011 Александр
Парни, если кто не понимает, что перевод с английского на русский то ему запятая не поможет :-)

08.12.2011 я php
Да да, даже можно точку с запятой поставить, все равно не поможет. ))))

24.01.2012 lili
этому человеку и php не поможет..

30.01.2012 ed-210
Кто-нибудь может сказать, почему переведенный вариант руководства за 18-02-2011 всё-равно содержит английские статьи? Есть где-то полностью русский мануал?
P.S. Ибо так лень напрягать мозг, для того чтобы вникнуть во вражескую терминологию.

01.02.2012 админ
справочники обновлены

11.04.2012 Олег
Спасибо за мануал!

23.04.2012 Станислав
Достаточный материал для полного изучения языка PHP. Ну и конечно же этот язык хоть и интерпретируемый, но все же его семантика как и его конструкции, основана на фундаменте стандарта Cи, что облегчает изучение последнего. Спасибо администратору за компиляцию документа в CHM, очень удобно пользоваться.

16.10.2015 Боря
Прочитал множество книг и документаций по PHP. Ни одна не удобна так как этот справочник от разработчиков и не объясняет этот языка лучше этого справочника, так точно и последовательно. Рекомендую всем! Можно сказать что это полный справочник по языку PHP. Удачи всем !

ГЛАВА 11. PHP и базы данных

Средства эффективного хранения и выборки больших объемов информации внесли огромный вклад в успешное развитие Интернета. Обычно для хранения информации используются базы данных. Работа таких известных сайтов, как Yahoo, Amazon и Ebay, в значительной степени зависит от надежности баз данных, хранящих громадные объемы информации. Конечно, поддержка баз данных ориентирована не только на интересы гигантских корпораций — в распоряжении web-программистов имеется несколько мощных реализаций баз данных, распространяемых по относительно низкой цене (а то и бесплатно).

Правильная организация базы данных обеспечивает более быстрые и гибкие возможности выборки данных. Она существенно упрощает реализацию средств поиска и сортировки, а проблемы прав доступа к информации решаются при помощи средств контроля за привилегиями, присутствующими во многих системах управления базами данных (СУБД). Кроме того, упрощаются процессы репликации и архивации данных.

Глава начинается с подробного описания выборки и обновления данных в MySQL — вероятно, самой популярной СУБД, используемой в PHP ( http://www.mysql.com ). На примере MySQL будет показано, как в PHP происходят загрузка и обновление данных в базе; мы рассмотрим базовые средства поиска и сортировки, используемые во многих web-приложениях. Затем мы перейдем к реализованной в PHP поддержке ODBC (Open Data Base Connectivity) — обобщенного интерфейса, который может использоваться для одновременного соединения с разными СУБД. Поддержка ODBC в PHP будет продемонстрирована на примере соединения и выборки данных из базы данных Microsoft Access. Глава завершается проектом, в котором PHP и СУБД MySQL используются для создания иерархического каталога с информацией об избранных сайтах. При включении в каталог новых сайтов пользователь относит их к одной из стандартных категорий, определяемых администратором сайта.

Прежде чем переходить к обсуждению MySQL, я хочу сказать несколько слов об SQL — самом распространенном языке для работы с базами данных. Язык SQL заложен в основу практически всех существующих СУБД. Чтобы перейти к рассмотрению примеров работы с базами данных, необходимо хотя бы в общих чертах представлять, как работает SQL.

Что такое SQL?

SQL обычно описывается как стандартный язык, используемый для взаимодействия с реляционными базами данных (см. ниже). Однако SQL не является языком программирования, как С, C++ или PHP. Скорее, это интерфейсное средство для выполнения различных операций с базами данных, предоставляющее в распоряжение пользователя стандартный набор команд. Возможности SQL не ограничиваются выборкой данных из базы. В SQL поддерживаются разнообразные возможности для взаимодействия с базой данных, в том числе:

  • определение структуры данных — определение конструкций, используемых при хранении данных;
  • выборка данных — загрузка данных из базы и их представление в формате, удобном для вывода;
  • обработка данных — вставка, обновление и удаление информации;
  • контроль доступа — возможность разрешения/запрета выборки, вставки, обновления и удаления данных на уровне отдельных пользователей;
  • контроль целостности данных — сохранение структуры данных при возникновении таких проблем, как параллельные обновления или системные сбои.

Обратите внимание: в определении SQL было сказано, что этот язык предназначен для работы с реляционными базами данных. В реляционных СУБД данные организуются в виде набора взаимосвязанных таблиц. Связи между таблицами реализуются в виде ссылок на данные других таблиц. Таблицу можно представить себе как двухмерный массив, в котором расположение каждого элемента характеризуется определенными значениями строки и столбца. Пример реляционной базы данных изображен на рис. 11.1.

Рис. 11.1. Пример реляционной базы данных

Как видно из рис. 11.1, каждая таблица состоит из строк (записей) и столбцов (полей). Каждому полю присваивается уникальное (в рамках данной таблицы) имя. Обратите внимание на связь между таблицами customer и orders, обозначенную стрелкой. В информацию о заказе включается короткий идентификатор клиента, что позволяет избежать избыточного хранения имени и прочих реквизитов клиента. В изображенной базе данных существует еще одна связь — между таблицами orders и products. Эта связь устанавливается по полю prod_id, в котором хранится идентификатор товара, заказанного данным клиентом (определяемого полем custjd). Наличие этих связей позволяет легко ссылаться на полные данные клиента и товара по простым идентификаторам. Правильно организованная база данных превращается в мощное средство организации и эффективного хранения данных с минимальной избыточностью. Запомните эту базу данных, я буду часто ссылаться на нее в дальнейших примерах.

Итак, как же выполняются операции с реляционными базами данных? Для этого в SQL существует специальный набор общих команд — таких, как SELECT, INSERT, UPDATE и DELETE. Например, если вам потребуется получить адрес электронной почты клиента с идентификатором 2001cu (см. рис. 11.1), достаточно выполнить следующую команду SQL:

SELECT cust_email FROM customers WHERE custjd = ‘2001cu’

Все вполне логично, не правда ли? В обобщенном виде команда выглядит так:

SELECT имя_поля FROM имя_таблицы [ WHERE условие ]

Квадратные скобки означают, что завершающая часть команды является необязательной. Например, для получения адресов электронной почты всех клиентов из таблицы customers достаточно выполнить следующий запрос:

SELECT cust_email FROM customers

Предположим, вы хотите включить в таблицу products новую запись. Простейшая команда вставки выглядит так:

INSERT into products VALUES (‘1009pr’, ‘Red Tomatoes’, ‘1.43’);

Если позднее эти данные потребуется удалить, воспользуйтесь следующей командой:

DELETE FROM products WHERE prod_ >

Существует много разновидностей команд SQL, и полное их описание выходит за рамки этой книги. На эту тему вполне можно написать отдельную книгу! Я постарался сделать так, чтобы команды SQL, используемые в примерах, были относительно простыми, но достаточно реальными. В Web существует много учебной информации и ресурсов, посвященных SQL. Некоторые ссылки приведены в конце этого раздела.

Записывать команды SQL символами верхнего регистра необязательно. Впрочем, я предпочитаю именно такую запись, поскольку она помогает различать компоненты запроса.

Раз вы читаете эту книгу, вероятно, вас интересует вопрос, как же организуется работа с базами данных в среде Web? Как правило, сначала при помощи какого-

либо интерфейсного языка (PHP, Java или Perl) создается соединение с базой данных, после чего программа обращается к базе с запросами, используя стандартный набор средств. Интерфейсный язык можно рассматривать как своего рода «клей», связывающий базу данных с Web. Я перехожу к своему любимому интерфейсному языку — PHP.

Ниже перечислены некоторые ресурсы Интернета, посвященные SQL. Они пригодятся как новичкам, так и опытным программистам.

Поддержка баз данных в PHP

Если бы мне предложили назвать самый важный аспект PHP, вероятно, я бы остановился на поддержке баз данных. В PHP реализована обширная поддержка практически всех существующих серверов баз данных, в том числе:

PostgreSQL

Oracle (OCI7 и OC18)

Как показывает этот список, поддержка баз данных в PHP простирается от совместимости с базами данных, известных всем (например, Oracle), до тех, о которых многие даже не слышали. Мораль — если вы собираетесь использовать серьезную СУБД для хранения информации, распространяемой через Web, скорее всего, эта база данных поддерживается в PHP. Поддержка базы данных в PHP представлена набором стандартных функций для соединения с базой, обработки запросов и разрыва связи.

Подробное описание всех поддерживаемых баз данных явно выходит за рамки книги. Впрочем, сервер MySQL дает неплохое представление об общих возможностях поддержки баз данных в PHP. По этой причине в примерах оставшейся части этой и всех остальных глав книги будет использоваться синтаксис MySQL. Независимо от того, с каким сервером баз данных вы будете работать, адаптация примеров не вызовет особых сложностей.

MySQL

MySQL ( http://www.mysql.com ) — надежная СУБД на базе SQL, разработанная и сопровождаемая фирмой Т.с.Х DataKonsultAB (Стокгольм, Швеция). Начиная с 1995 года, MySQL стала одной из самых распространенных СУБД в мире, что отчасти обусловлено ее скоростью, надежностью и гибкой лицензионной политикой (см. ниже).

Благодаря хорошим характеристикам и обширному набору стандартных интерфейсных функций, очень простых в использовании, MySQL стала самым популярным средством для работы с базами данных в PHP.

MySQL распространяется на условиях общей лицензии GNU (GPL, GNU Public License). Полное описание текущей лицензионной политики MySQL приведено на сайте MySQL ( http://www.mysql.com ).

Установка

Одна из причин популярности MySQL среди пользователей PHP заключается в том, что поддержка этого сервера автоматически включается в поставку PHP. Таким образом, вам остается лишь проследить за правильной установкой пакета MySQL СУБД MySQL совместима практически с любой серьезной операционной системой, включая FreeBSD, Solaris, UNIX, Linux и различные верии Windows. Хотя лицензионная политика MySQL отличается большей гибкостью в сравнении с другими серверами баз данных, я настоятельно рекомендую ознакомиться с лицензионной информацией, размещенной на сайте MySQL ( http://www.mysql.com ).

Последнюю версию MySQL можно принять с любого зеркального сайта. Полный список зеркальных сайтов приведен по адресу http://www.mysql.com/downloads/ mirrors.html. На момент написания книги последняя стабильная версия MySQL имела номер 3.22.32, а версия 3.32 находилась на стадии бета-тестирования. Конечно, всегда следует устанавливать последнюю стабильную версию, это в ваших интересах. Посетите ближайший «зеркальный» сайт и загрузите версию, соответствующую вашей операционной системе. В верхней части страницы расположены ссылки на новые версии для различных платформ. Обязательно прочитайте всю страницу, поскольку она завершается ссылками для некоторых специфических ОС.

Группа разработчиков MySQL подготовила подробную документацию с описанием процесса установки. Я советую внимательно изучить все общие аспекты установки, не ограничиваясь информацией, относящейся непосредственно к вашей операционной системе.

Настройка MySQL

После успешной установки сервер MySQL необходимо настроить. Процесс настройки в основном состоит из создания новых баз данных и редактирования таблиц привилегий MySQL. Таблицы привилегий управляют доступом к базам данных MySQL. Правильная настройка таблиц играет чрезвычайно важную роль в безопасности ваших баз данных, поэтому перед запуском сайта в рабочем режиме необходимо полностью освоить систему привилегий.

На первый взгляд, таблицы привилегий MySQL выглядят устрашающе, но если в них как следует разобраться, дальнейшее сопровождение становится очень простой задачей. Полное описание таблиц привилегий выходит за рамки этой книги. Впрочем, в Web существует немало ресурсов, предназначенных для помощи начинающим пользователям MySQL. За дополнительной информацией обращайтесь на сайт MySQL ( http://www.mysql.com ).

После успешной установки и настройки пакета MySQL можно начинать эксперименты с базами данных в среде Web! Именно этой теме и посвящен следующий раздел. Начнем с изучения поддержки MySQL в PHP.

Стандартные функции PHP для работы с MySQL

Итак, вы успешно создали и протестировали все необходимые разрешения; все готово для работы с сервером MySQL. В этом разделе я представлю стандартные функции PHP, при помощи которых вы сможете легко организовать взаимодействие сценариев PHP с сервером MySQL. Общая последовательность действий при взаимодействии с сервером MySQL выглядит так:

  1. Установить соединение с сервером MySQL. Если попытка завершается неудачей, вывести соответствующее сообщение и завершить процесс.
  2. Выбрать базу данных сервера MySQL. Если попытка выбора завершается неудачей, вывести соответствующее сообщение и завершить процесс. Допускается одновременное открытие нескольких баз данных для обработки запросов.
  3. Обработать запросы к выбранной базе (или базам).
  4. После завершения обработки запросов закрыть соединение с сервером баз данных.

В примерах этого раздела используются таблицы products, customers и orders (см. рис. 11.1). Если вы захотите самостоятельно проверить все примеры, создайте эти таблицы или скопируйте страницу с описанием структуры, чтобы вам не приходилось постоянно листать книгу.

Итак, начнем с самого начала — то есть с подключения к серверу MySQL.

Функция mysql_connect( ) устанавливает связь с сервером MySQL После успешного подключения к MySQL можно переходить к выбору баз данных, обслуживаемых этим сервером. Синтаксис функции mysql_connect( ):

int mysql_connect ([string хост [:порт] [:/путь//к/сокету] [, string имя пользователя] [, string пароль])

В параметре хост передается имя хостового компьютера, указанное в таблицах привилегий сервера MySQL. Конечно, оно же используется для перенаправления запросов на web-сервер, на котором работает MySQL, поскольку к серверу MySQL можно подключаться в удаленном режиме. Наряду с именем хоста могут указываться необязательные параметры — номер порта, а также путь к сокету (для локального хоста). Параметры имя_пользователя и пароль должны соответствовать имени пользователя и паролю, заданным в таблицах привилегий MySQL. Обратите внимание: все параметры являются необязательными, поскольку таблицы привилегий можно настроить таким образом, чтобы они допускали соединение без проверки. Если параметр хост не задан, mysql_connect( ) пытается установить связь с локальным хостом.

Пример открытия соединения с MySQL:

@mysql_connect(» local host», «web», «4tf9zzzf») or die(«Could not connect to MySQL server!»);

В данном примере localhost — имя компьютера, web— имя пользователя, а 4tf9zzzf — пароль. Знак @ перед вызовом функции mysql_connect( ) подавляет все сообщения об ошибках, выдаваемые при неудачной попытке подключения, — они заменяются сообщением, указанным при вызове die( ). Обратите внимание: значение, возвращаемое при вызове rnysql_connect( ), в данном примере не используется. Если в программе используется всего одно соединение с сервером MySQL, это вполне нормально. Но если программа устанавливает соединения с несколькими серверами MySQL на разных хостах, следует сохранить идентификатор соединения, возвращаемый при вызове mysql_connect( ), чтобы адресовать последующие команды нужному серверу MySQL. Пример:

Идентификаторы $link1 и $link2 передаются при последующих обращениях к базам данных с запросами. Вскоре вы узнаете, как именно адресовать запрос нужному серверу при помощи идентификатора соединения.

Функция mysql_pconnect( ) обеспечивает поддержку восстанавливаемых (persistent) соединений. В многопользовательских средах рекомендуется использовать mysql_pconnect( ) вместо mysql_connect( ) для экономии системных ресурсов. По типам параметров и возвращаемого значения функция mysql_pconnect( ) в точности совпадает c mysql_connect( ).

После успешного соединения с MySQL необходимо выбрать базу данных, находящуюся на сервере. Для этого используется функция mysql_select_db( ). Синтаксис функции mysql_select_db( ):

int mysql_select_db (string имя_базы_данных [, int идентификатор_соединения])

Параметр имя_базы_данных определяет выбираемую базу данных, идентификатор

которой возвращается функцией mysql_select_db( ). Обратите внимание: параметр

идентификатор_соединения необязателен лишь при одном открытом соединении с

сервером MySQL. При наличии нескольких открытых соединений этот параметр

должен указываться. Пример выбора базы данных функцией mysql_select_db( ):

Если в программе выбирается только одна база данных, сохранять ее идентификатор не обязательно. Однако при выборе нескольких баз данных возвращаемые идентификаторы сохраняются, чтобы вы могли сослаться на нужную базу при обработке запроса. Если идентификатор не указан, используется последняявыбранная база данных.

После завершения работы с сервером MySQL соединение необходимо закрыть. Функция mysql_close( ) закрывает соединение, определяемое необязательным параметром. Если параметр не задан, функция mysql_close( ) закрывает последнее открытое соединение. Синтаксис функции mysql_close( ):

int mysql_close ([int идентификатор_соединения])

Пример использования mysql_close( ):

В этом примере указывать идентификатор соединения не нужно, поскольку на момент вызова mysql_close( ) существует лишь одно открытое соединение с сервером.

Соединения, открытые функцией mysql_pconnect( ), закрывать не обязательно.

Функция mysql_query( ) обеспечивает интерфейс для обращения с запросами к базам

данных. Синтаксис функции mysql_query( ):

int mysql_query (string запрос [, int идентификатор_соединения])

Параметр запрос содержит текст запроса на языке SQL. Запрос передается либо соединению, определяемому необязательным параметром идентификатор_соедине-ния, либо, при отсутствии параметра, последнему открытому соединению.

Неопытные программисты часто ошибочно думают, что функция mysql_query( ) возвращает результаты обработки запроса. Это не так — в зависимости от типа запроса вызов mysql_query( ) может приводить к разным последствиям. При успешном выполнении команды SQL SELECT возвращается идентификатор результата, который впоследствии передается функции mysql_result( ) для последующего форматирования и отображения результатов запроса. Если обработка запроса завершилась неудачей, функция возвращает FALSE. Функция mysql_result( ) описана в одном из следующих разделов. Количество записей, участвующих в запросе, определяется при помощи функции mysql_num_rows( ). Эта функция также описана далее.

Учитывая сказанное, я приведу примеры использования mysql_query( ) лишь после описания функций mysql_result( ) и mysql_affected_rows( ).

Если вас беспокоит то, что при обработке запросов расходуется слишком много памя-ти, вызовите стандартную функцию PHP mysql_free_result. При вызове ей передается идентификатор результата, возвращаемый mysql_query( ). Функция mysql_free_result( ) освобождает всю память, связанную с данным запросом.

Во многих ситуациях требуется узнать количество записей, участвующих в запросе SQL с командами INSERT, UPDATE, REPLACE или DELETE. Задача решается функцией mysql_affected_rows( ). Синтаксис функции:

int mysql_affected_rows ([int идентификатор_соединения])

Обратите внимание: параметр идентификатор_соединения не является обязательным. Если он не указывается, mysql_affected_rqws( ) пытается использовать последнее открытое соединение. Пример:

// Выполнить запрос $result = mysql_query($query);

// Определить количество обновленных записей

print «Total row updated; «.mysql_affected_rows( );

При выполнении этого фрагмента будет выведен следующий результат:

Total row updated: 1

Функция mysql_affected_rows( ) не работает с запросами, основанными на команде SELECT. Для определения количества записей, возвращенных при вызове SELECT, используется функция mysql_num_rows( ), описанная в следующем разделе.

В одной специфической ситуации функция mysql_affected_rows( ) работает с ошибкой. При выполнении команды DELETE без секции WHEREmysql_affected_rows( ) всегда возвращает 0.

Функция mysql_num_rows( ) определяет количество записей, возвращаемых командой SELECT. Синтаксис функции mysql_num_rows( ):

int mysql_num_rows(int результат)


Пример использования mysql_num_rows( ):

Поскольку таблица содержит лишь один товар, название которого начинается с буквы р (pears), возвращается только одна запись. Результат:

Total rows selected: 1

Функция mysql_result() используется в сочетании с mysql_query( ) (при выполнении запроса с командой SELECT) для получения набора данных. Синтаксис функции mysql_resu1t():

int mysql_result (int идентификатор_результата, int запись [. mixed поле»]’)

В параметре идентификатор_результата передается значение, возвращенное функцией mysql_query( ). Параметр запись ссылается на определенную запись набора данных, определяемого параметром идентификатор_результата. Наконец, в необязательном параметре поле могут передаваться:

  • смещение поля в таблице;
  • имя поля;
  • имя поля в формате имя_поля_имя_тдблицы.

В листинге 11.1 используется база данных, изображенная на рис. 11.1.

Листинг 11.1. Выборка и форматирование данных в базе данных MySQL

В результате выполнения этого примера с данными, изображенными на рис. 11.1, будет получен следующий результат:

Листинг 11.2. Результат выполнения листинга 11.1

Product ID Product Name Product Price

1000pr

apples

1001pr

oranges

1002pr

bananas

1003pr

pears

Функция mysql_result( ) удобна для работы с относительно небольшими наборами данных, однако существуют и другие функции, работающие намного эффективнее, — а именно, функции mysql_fetch_row( ) и mysql_fetch_array( ). Эти функции описаны в следующих разделах.

Обычно гораздо удобнее сразу присвоить значения всех полей записи элементам индексируемого массива (начиная с индекса 0), нежели многократно вызывать mysql_result( ) для получения отдельных полей. Задача решается функцией mysql_fetch_row( ), имеющей следующий синтаксис:

array mysql_fetch_row (int результат)

Использование функции list( ) в сочетании с mysql_fetch_row( ) позволяет сэкономить несколько команд, необходимых при использовании mysql_result( ). В листинге 11.3 приведен код листинга 11.1, переписанный с использованием list( ) и mysql_fetch_row( ).

Листинг 11.3. Выборка данных функцией mysql_fetch_row( )

Листинг 11.3 выдает тот же результат, что и листинг 11.1, но использует при этом меньшее количество команд.

my sq l_f etch_array ( )

Функция mysql_fetch_array( ) аналогична mysql_fetch_row( ), однако по умолчанию значения полей записи сохраняются в ассоциативном массиве. Впрочем, вы можете выбрать тип индексации (ассоциативная, числовая или комбинированная). Синтаксис функции mysql_fetch_array( ):

array mysql_fetch_array (int идентификатор результата [, тип_индексации])

В параметре идентификатор_результата передается значение, возвращенное функцией mysql_query( ). Необязательный параметр тип_индексации принимает одно из следующих значений:

  • MYSQL_ASSOC — функция mysql_fetch_array( ) возвращает ассоциативный массив. Если параметр не указан, это значение используется по умолчанию;
  • MYSQL_NUM — функция mysql_fetch_array( ) возвращает массив с числовой индексацией;
  • MYSQL_BOTH — к полям возвращаемой записи можно обращаться как по числовым, так и по ассоциативным индексам.

Листинг 11.4 содержит очередной вариант кода листингов 11.1 и 11.3. На этот раз используется функция mysql_fetch_array( ), возвращающая ассоциативный массив полей.

Листинг 11.4. Выборка данных функцией mysql_fetch_array( )

Листинг 11.4 выдает тот же результат, что и листинги 11.1 и 11.3.

Того, что сейчас вы знаете о функциональных возможностях MySQL в PHP, вполне достаточно, чтобы заняться созданием довольно интересных приложений. Первое приложение, которое мы рассмотрим, представляет собой простейшую поисковую систему. Этот пример демонстрирует применение форм HTML (см. предыдущую главу) для получения данных, которые в дальнейшем используются для выборки информации из базы.

Пример простейшей поисковой системы на PHP

Всем нам неоднократно приходилось пользоваться поисковыми системами в Web, но как устроены такие системы? Простейшая поисковая система принимает по крайней мере одно ключевое слово. Это слово включается в запрос SQL, который затем используется для выборки информации из базы данных. Результат поиска форматируется поисковой системой по тому или иному критерию (скажем, по категории или степени соответствия).

Поисковая система, приведенная в листинге 11.5, предназначена для поиска информации о клиентах. В форме пользователь вводит ключевое слово и выбирает категорию (имя, идентификатор или адрес электронной почты клиента), в которой будет производиться поиск. Если введенное пользователем имя, идентификатор или адрес существует, поисковая система извлекает из базы данных остальные атрибуты. Затем по идентификатору покупателя из таблицы orders выбирается

история заказов. Все заказы, оформленные этим клиентом, отображаются по убыванию объема. Если заданное ключевое слово не встречается в категории, указанной пользователем, поиск прекращается, программа выводит соответствующее сообщение и снова отображает форму.

Листинг 11.5. Простейшая поисковая система (searchengine.php)

Customer Information:

print «Identification #: $id
«;

Order History:

// Построить и выполнить запрос к таблице ‘orders’

$query = «SELECT order_id, prod_id, quantity

FROM orders WHERE cust_

ORDER BY quantity DESC»;

print »

0rder ID Product ID Quantity

«;

// Отформатировать и вывести найденные записи.

print »

«;

print »

$order_id $prod_id $quantity

«;

print «

«;

print «

«;

Если ввести ключевое слово Mi 1 апо и выбрать в раскрывающемся списке категорию Customer Name (Имя клиента), программа выводит следующую информацию:

Order Id Product Id Quantity
100003 1000pr 12
100005 1002pr 11

Конечно, мы рассмотрели простейшую реализацию поисковой системы. Существует немало дополнительных возможностей — поиск по нескольким ключевым словам, поиск по неполным ключевым словам или автоматическая выборка записей с похожими ключевыми словами. Попробуйте применить свою творческую фантазию и реализовать их самостоятельно.

Сортировка таблиц

При выводе данных из базы необходимо предусмотреть возможность их сортировки по различным критериям. В качестве примера рассмотрим результаты, выведенные нашей поисковой системой, — обратим особое внимание на следующие после заголовка Order History: (История заказов). Допустим, список получился очень длинным, и вы хотите отсортировать данные по идентификатору товара (или идентификатору заказа). Чтобы вы лучше поняли, о чем идет речь, рекомендую посетить один из моих любимых сайтов, http://download.cnet.com. Если в процессе просмотра программ конкретной категории щелкнуть на заголовке столбца (название, дата размещения, количество загрузок или размер файла), то список автоматически упорядочивается по содержимому указанного столбца. Далее показано, как реализовать подобную возможность.

В листинге 11.6 мы производим выборку данных из таблицы orders. По умолчанию данные сортируются по убыванию объема заказа (поле quantity). Однако щелчок на любом заголовке таблицы приводит к тому, что страница загружается заново с упорядочением таблицы по указанному столбцу.

Листинг 11.6. Сортировка таблиц (tablesorter.php)

// Создать заголовок таблицы

// Отформатировать и вывести каждую строку таблицы

while (list($order_id,$cust_id,$prod_id, $quantity)

print »

«;

print »

$order_id $cust_id $prod_id

$quantity

«;

print «

«;

print «

«;

Для базы данных company, изображенной на рис. 11.1, стандартные выходные данные листинга 11.6 выглядят следующим образом:

Order ID Customer ID Product ID Quantity
2000cu 1000pr 12
2000cu 1002pr 11
2000cu 1000pr 9
2000cu 1001pr 5
2000cu 1002pr 3

Обратите внимание: заголовки таблицы представляют собой гиперссылки. Поскольку по умолчанию сортировка осуществляется по полю quantity, записи отсортированы по убыванию последнего столбца. Если щелкнуть на ссылке Order_ID, страница загружается заново, но на этот раз записи сортируются по убыванию идентификатора заказа. Таблица будет выглядеть так:

Order ID Customer ID Product ID Quantity
2000cu 1002pr 11
2000cu 1000pr 9
2000cu 1000pr 12
2000cu 1001pr 5
2000cu 1002pr 3

Сортировка выходных данных приносит огромную пользу при форматировании баз данных. Простая модификация запроса SELECT позволяет упорядочить данные по любому критерию — по возрастанию, по убыванию или с группировкой записей.

На этом наше знакомство с MySQL подходит к концу. Учтите, что материал этой главы отнюдь не исчерпывает всего, что необходимо знать о MySQL. Полный список команд MySQL в PHP приведен в документации ( http://www.php.net/manuat ).

Специализированные функции хорошо подходят для работы с одним конкретным типом СУБД. Но что делать, если вам приходится подключаться к MySQL, Microsoft SQL Server и IBM DB2, притом в одном приложении? Аналогичная проблема возникает при разработке приложений, которые не должны зависеть от СУБД; такие приложения работают «над» существующей инфраструктурой клиентской базы данных. ODBC (сокращение от «Open Database Connectivity», то есть «открытая архитектура баз данных») представляет собой интерфейс прикладных программ (API), позволяющий использовать общий набор абстрактных функций для работы с разными типами баз данных. Преимущества подобного подхода очевидны — вам не придется многократно переписывать один и тот же фрагмент кода только для того, чтобы выполнять одинаковые операции с разнотипными базами данных.

Работа с сервером баз данных через ODBC возможна лишь в том случае, если этот сервер является ODBC-совместимым. Другими словами, для него должны существовать драйверы ODBC. За дополнительной информацией о драйверах ODBC обращайтесь к документации СУБД. Возможно, вам придется дополнительно загрузить их из Интернета и установить на своем компьютере. Хотя стандарт ODBC, разработанный компанией Microsoft, стал открытым стандартом, он в основном используется для работы с СУБД на платформе Windows; впрочем, драйверы ODBC также существуют и на платформе Linux. Ниже приведены ссылки на драйверы для некоторых популярных СУБД.

Драйверы ODBC различаются по целям, платформе и назначению. За информацией о различных аспектах работы с этими драйверами обращайтесь к документации по конкретным пакетам. Впрочем, невзирая на все различия, использование этих драйверов в PHP обходится без проблем.

Когда вы определите, какой комплект драйверов ODBC лучше подходит для ваших целей, загрузите его и выполните все инструкции по установке и настройке. После этого можно переходить к следующему разделу — «Поддержка ODBC в PHP».

Поддержка ODBC в PHP

Функции ODBC в PHP, обычно называемые общими функциями ODBC, не только обеспечивают типовую поддержку ODBC, но и позволяют работать с некоторыми СУБД, обладающими собственным API, через стандартный ODBC API. К числу последних относятся следующие СУБД:

Обратите внимание: при работе с перечисленными СУБД стандартный механизм ODBC на самом деле не используется. Просто поддерживаемые в PHP общие функции ODBC применяются для взаимодействия с базами данных. Это удобно, поскольку при переходе на другую ODBC-совместимую СУБД (или СУБД из приведенного выше списка) все ваши сценарии будут нормально работать.

Поддержка ODBC встроена в комплект поставки PHP, поэтому вам за редкими исключе-ниями практически не придется заниматься специальной настройкой.

В настоящее время существует около 40 общих функций ODBC. Впрочем, для выборки информации из ODBC-совместимой базы данных вполне достаточно нескольких функций, описанных ниже. Полный список общих функций ODBC в PHP приведен в документации (http://www.php.net/manual).

Перед тем как обращаться к ODBC-совместимой базе данных с запросами, необходимо сначала установить с ней связь. Соединение создается функцией ocbc_connect( ). Синтаксис функции odbc_connect( ):

int odbc_connect (string источник_данных, string имя_пользователя, string пароль [, int тип_курсора])

Параметр источник_данных определяет ODBC-совместимую базу данных, с которой вы пытаетесь установить связь. В параметрах имя_пользователя и пароль, как нетрудно догадаться, передаются имя пользователя и пароль, необходимые для подключения к источнику данных. Необязательный параметр тип_курсора предназначе’н для устранения проблем, возникающих при работе с некоторыми драйверами ODBC. Он может принимать одно из четырех возможных значений:

  • SQL_CUR_USE_IF_NEEDED;
  • SQL_CURSOR_USE_ODBC;
  • SQL_CUR_USE_DRIVER;
  • SQL CUR DEFAULT.

Возможно, вам не придется использовать этот параметр, но все же о нем следует помнить на случай, если ваш пакет ODBC не справится с обработкой того или иного запроса.

Использовать odbc_connect( ) в программе несложно. Пример:

Функция используется для открытия восстанавливаемых (persistent) соединений с базами данных. Она экономит системные ресурсы, поскольку odbc_pconnect( ) проверяет, не было ли данное соединение открыто ранее, и если было, использует предыдущее соединение.

После завершения работы с ODBC-совместимой базой данных соединение необходимо закрыть, чтобы освободить все ресурсы, используемые открытым соединением. Соединение закрывается функцией odbc_close( ):

void odbc_close ([int идентификатор_соединения])

В параметре идентификатор_соединения передается идентификатор открытого соединения. Рассмотрим небольшой пример:

Перед непосредственной обработкой запрос необходимо «подготовить». Задача решается функцией odbc_prepare( ):

int odbc_prepare (int идентификатор_соединения , string запрос)

В параметре идентификатор_соединения передается идентификатор соединения, возвращаемый функцией odbc_connect( ). В параметре запрос передается текст запроса, который должен быть выполнен сервером. Если запрос не может быть выполнен, функция возвращает FALSE; в противном случае возвращается идентификатор результата, в дальнейшем используемый при вызове функции odbc_execute( ) (см. ниже).

Запрос, подготовленный функцией odbc_prepare( ), выполняется функцией odbc_execute( ). Синтаксис функции odbc_execute( ):

int odbc_execute (int идентификатор результата [, array параметры])

В параметре идентификатор_результата передается идентификатор результата, возвращаемый при успешном вызове odbc_prepare( ). Необязательный параметр передается лишь в том случае, если при вызове функции передаются дополнительные данные.

Рассмотрим следующий пример:

В приведенном примере продемонстрирована транзакция ODBC, при которой данные запроса не отображаются в браузере (как это обычно делается при использовании команды SELECT). Транзакция ODBC с использованием запроса QUERY описана ниже, в разделе «odbc_result_all( )».

Функция odbc_exec( ) объединяет odbc_prepare( ) и odbc_execute( ). Синтаксис функции odbc_exec( ):

int odbc_exec (int идентификатор_соединения , string запрос)

В параметре идентификатор_соединения передается идентификатор соединения, возвращаемый функцией odbc_connect( ). В параметре запрос передается текст запроса, который должен быть выполнен сервером. Если запрос не может быть выполнен, функция возвращает FALSE; в противном случае возвращается идентификатор результата, используемый при последующих вызовах функций:

В этом примере функция odbc_exec( ) пытается выполнить запрос, текст которого содержится в переменной $query. При успешном выполнении переменной $result присваивается идентификатор результата; в случае неудачи ей присваивается значение FALSE и выводится сообщение, передаваемое при вызове die( ).

Очень удобная функция odbc_result_all( ) форматирует и отображает все записи для идентификатора результата, полученного при вызове odbc_exec( ) или odbc_execute( ). Синтаксис функции odbc_result_all( ):

int odbc_result_all (int идентификатор_результата [, string формат_таблицы])

В параметре идентификатор_результата передается идентификатор результата, возвращаемый при успешном вызове odbc_exec( ) или odbc_execute( ). В необязательном параметре формат_таблицы передаются характеристики таблицы HTML. Рассмотрим следующий пример:

В результате выполнения этого примера содержимое таблицы customers будет выведено в таблице на светло-сером фоне с рамкой толщиной 1. Внешний вид таблицы для данных, приведенных на рис. 11.1, изображен на рис. 11.2.

Рис. 11.2. Данные ODBC в браузере

Хороший стиль программирования требует освобождения всех ресурсов, связанных с завершенными операциями. При работе с запросами ODBC эта задача решается функцией odbc_free_result( ). Синтаксис функции odbc_free_result( ):

int odbc_free_result (int идентификатор_результата)

В параметре функции передается идентификатор результата, который больше не будет использоваться в программе. Следует помнить, что все ресурсы памяти автоматически освобождаются по завершении сценария; таким образом, вызов функции odbc_free_result( ) необходим лишь для очень больших запросов, расходующих очень большие объемы памяти. Ниже приведен пример, демонстрирующий применение odbc_free_result( ). Помните, что без этой функции обычно можно обойтись, если только вы не собираетесь выполнять несколько запросов в одном сценарии, поскольку с завершением сценария вся память будет автоматически освобождена.

После того как функция odbc_result_all( ) завершила использование идентификатора результата, память возвращается в систему при помощи odbc_free_result( ).

На этом завершается наше знакомство с функциями ODBC в PHP, незаменимыми при создании простых интерфейсов на базе ODBC для доступа через Web. В следующем разделе многие из этих функций будут использованы для демонстрации того, как легко на базе PHP организуется взаимодействие с одной из самых популярных СУБД — Microsoft Access.

Microsoft Access и PHP

Популярность СУБД Microsoft Access ( http://www.microsoft.com/office/access ) отчасти объясняется ее удобным графическим интерфейсом. Помимо использования Access в качестве самостоятельной СУБД, вы можете использовать ее графический интерфейс для организации работы с другими базами данных — например, MySQL или Microsoft SQL Server.

Чтобы продемонстрировать поддержку ODBC в PHP, я опишу процесс подключения к базам данных Microsoft Access на PHP. Делается это на удивление просто, но благодаря популярности Microsoft Access это станет полезным дополнением в вашем творческом арсенале. Я опишу этот процесс шаг за шагом:

  1. Создайте базу данных Access. Предполагается, что вы уже умеете это делать, а если не умеете, но все равно хотите проследить за выполнением этого примера, — воспользуйтесь услугами программы-мастера. Я создал стандартную базу данных для хранения контактных данных при помощи мастера. Обязательно создайте в таблице несколько записей и запомните имя таблицы, оно нам вскоре понадобится!
  2. Сохраните базу данных на своем компьютере.
  3. На следующем шаге мы организуем доступ к базе Access средствами ODBC. Выполните команду Пуск > Настройка > Панельуправления (Start > Settings > Control Panel). Найдите на панели управления значок Источники данных ODBC (32) (ODBC Data Sources (32 bit)). При помощи этого значка запускается Администратор ODBC, предназначенный для настройки различных драйверов и источников данных в вашей системе. Запустите программу, дважды щелкнув на этом значке. Окно Администратора по умолчанию открывается на вкладке Пользовательский DSN (User DSN). На этой вкладке перечисляются источники данных-, которые относятся к конкретному пользователю и могут использоваться только на этом компьютере. В данном примере будет использоваться именно такой источник данных.
  4. Нажмите кнопку Добавить. (Add. ) в правой части окна. Открывается новое окно для выбора драйвера, предназначенного для работы с новым источником. Выберите строку Microsoft Access Driver (*.mdb) и нажмите кнопку Finish (Готово).
  5. На экране появляется новое окно Установка драйвера ODBC для Microsoft Access (ODBC Microsoft Access Setup). Найдите в форме текстовое поле Имя источника данных (Data Source Name) и введите в нем имя созданной вами базы данных Access. При желании можете ввести описание в текстовом поле, расположенном непосредственно под полем Имя источника данных.
  6. Нажмите кнопку Выбрать. (Select. ) — появляется окно в стиле Проводника Windows. В нем вам предлагается найти базу данных, доступ к которой будет осуществляться средствами ODBC.
  7. Найдите в дереве каталогов свою базу данных и дважды щелкните на ней. Вы снова возвращаетесь к окну Установка драйвера ODBC для Microsoft Access. Путь к выбранной базе данных отображается над кнопкой Выбрать. Нажмите кнопку ОК.
  8. Готово! Теперь вы можете работать с базой данных Access средствами ODBC.

Все, что вам остается сделать — создать сценарий, в котором вы будете работать с базой данных через ODBC. В приведенном ниже сценарии общие функции ODBC (см. выше) будут использоваться для вывода всей информации из таблицы контактов, созданной при помощи мастера Access. Однако перед рассмотрением сценария желательно знать, как таблица Contacts выглядит в Access (рис. 11.3).

Рис. 11.3. Таблица Contacts в MS Access

Теперь вы знаете, какая информация будет извлекаться из базы данных, и мы можем перейти к сценарию. Если вы забыли, что делает та или иная функция, обращайтесь к описанию в начале этой главы. Результаты работы листинга 11.7 представлены на рис. 11.4.

Листинг 11.7. Применение функций ODBC для работы с MS Access

Не правда ли, все просто? А самое замечательное — то, что этот сценарий полностью совместим с любой другой СУБД с поддержкой ODBC. Для тренировки попробуйте повторить все описанные действия для другой СУБД, запустите сценарий — и вы получите те же результаты, которые изображены на рис. 11.4.

Рис. 11.4. Содержимое таблицы Contacts в web-браузере

Проект: Каталог ссылок на PHP

Самый простой способ наполнить ваш сайт реальным содержанием — дать пользователю возможность сделать это за вас. Конечно, для ввода данных удобнее всего воспользоваться формой HTML.

Введенную пользователем информацию необходимо обработать и сохранить. В проекте предыдущей главы было показано, как легко эта задача решается при помощи PHP и текстового файла. Бесспорно, текстовые файлы хорошо подходят для хранения относительно маленьких и простых фрагментов данных, но в полноценных web-приложениях информация обычно хранится в базах данных. В настоящем примере база данных MySQL используется для хранения информации о web-сайтах. Для упрощения навигации сайты разделены на несколько категорий. Пользователь может ввести информацию о сайте в форме HTML и отнести его к одной из стандартных категорий, определенных администратором сайта. Кроме того, пользователь может загрузить индексную страницу и просмотреть список всех сайтов той или иной категории, щелкнув на ее названии.

Прежде всего вы должны решить, какие сведения о сайтах будут храниться в базе данных SQL. Для простоты я ограничусь следующим набором атрибутов: название, URL, категория, дата включения и описание. Таким образом, определение таблицы в MySQL выглядит примерно так:

mysql>create table bookmarks ( category INT, site_name char(35), url char(50),

date_added date, description char(254) );

В определении таблицы bookmarks имеется пара моментов, заслуживающих внимания. Во-первых, информация о категории сайта почему-то хранится в виде целого числа но разве не правильнее было бы сделать названия категорий более содержательными и понятными для пользователя? Не беспокойтесь, в ини-циализационном файле будет создан массив, связывающий целочисленные индексы с названиями категорий. В будущем администратор может изменять и даже удалять отдельные категории. Хранение информации о категориях заметно упрощает эту задачу. Кроме того, целочисленное поле обеспечивает экономию места на диске, поскольку название категории многократно сохраняется в таблице. Другое обстоятельство, относящееся к структуре таблицы, — ограничение длины описания 254 символами. В зависимости от этого объема описаний вместо типа char( ) можно воспользоваться типом medium или text. За дополнительной информацией о типах полей обращайтесь к документации MySQL.

Следующим шагом в работе над этим приложением будет создание инициализа-ционного файла. Помимо глобальных переменных, в инициализационном файле определяются две функции: add_bookmark( ) и view_bookmark( ). Функция add_bookmark( ) получает пользовательский ввод из формы и включает его в базу. Функция view_bookmark( ) получает индекс категории, читает из базы данных все записи, относящиеся к указанной категории, и отображает их в браузере. Инициализацион-ный файл приложения init.inc с комментариями приведен в листинге 11.8.

Листинг 11.8. Инициализационный файл каталога ссылок (init.inc)

while ($row = mysql_fetch_array($result)) ;

Настройка и использование PDO — расширения PHP Data Objects для работы с базами данных

PDO (PHP Data Objects) — расширение PHP, которое реализует взаимодействие с базами данных при помощи объектов. Профит в том, что отсутствует привязка к конкретной системе управления базами данных.

Предоставляемый интерфейс поддерживает, среди прочих, такие популярные СУБД:

В этом руководстве представлен обзор PDO:

Для работы потребуются:

  • базовые знания MySQL и опыт использования команды mysql в консоли;
  • понимание основ объектно-ориентированного программирования;
  • PHP >= 5.1;
  • рабочая СУБД MySQL/MariaDB.

Создание тестовой базы данных и таблицы

Для начала создадим базу данных для этого руководства:

Пользователю с логином testuser и паролем testpassword предоставили полные права доступа к базе solar_system .

Теперь создадим таблицу и заполним данными, астрономическая точность которых не подразумевается:

Описание соединения

Теперь, когда создана база, определим DSN (Data Source Name) — сведения для подключения к базе, представленные в виде строки. Синтаксис описания отличается в зависимости от используемой СУБД. В примере работаем с MySQL/MariaDB, поэтому указываем:

  • тип драйвера;
  • имя хоста, где расположена СУБД;
  • порт (необязательно, если используется стандартный порт 3306 );
  • имя базы данных;
  • кодировку (необязательно).

Строка DSN в этом случае выглядит следующим образом:

Первым указывается database prefix . В примере — mysql . Префикс отделяется от остальной части строки двоеточием, а каждый следующий параметр — точкой с запятой.

Создание PDO-объекта

Теперь, когда строка DSN готова, создадим PDO-объект. Конструктор на входе принимает следующие параметры:

  1. Строку DSN.
  2. Имя пользователя, имеющего доступ к базе данных.
  3. Пароль этого пользователя.
  4. Массив с дополнительными параметрами (необязательно).

Дополнительные параметры можно также определить после создания объекта с помощью метода SetAttribute :

Определение метода выборки по умолчанию

PDO::DEFAULT_FETCH_MODE — важный параметр, который определяет метод выборки по умолчанию. Указанный метод используется при получении результата выполнения запроса.

PDO::FETCH_BOTH

Режим по умолчанию. Результат выборки индексируется как номерами (начиная с 0), так и именами столбцов:

После выполнения запроса с этим режимом к тестовой таблице планет получим следующий результат:

PDO::FETCH_ASSOC

Результат сохраняется в ассоциативном массиве, в котором ключ — имя столбца, а значение — соответствующее значение строки:

В результате получим:

PDO::FETCH_NUM

При использовании этого режима результат представляется в виде массива, индексированного номерами столбцов (начиная с 0):

PDO::FETCH_COLUMN

Этот вариант полезен, если нужно получить перечень значений одного поля в виде одномерного массива, нумерация которого начинается с 0. Например:

В результате получим:

PDO::FETCH_KEY_PAIR

Используем этот вариант, если нужно получить перечень значений двух полей в виде ассоциативного массива. Ключи массива — это данные первого столбца выборки, значения массива — данные второго столбца. Например:

В результате получим:

PDO::FETCH_OBJECT

При использовании PDO::FETCH_OBJECT для каждой извлеченной строки создаётся анонимный объект. Его общедоступные (public) свойства — имена столбцов выборки, а результаты запроса используются в качестве их значений:

В результате получим:

PDO::FETCH_CLASS

В этом случае, как и в предыдущем, значения столбцов становятся свойствами объекта. Однако требуется указать существующий класс, который будет использоваться для создания объекта. Рассмотрим это на примере. Для начала создадим класс:

Обратите внимание, что у класса Planet закрытые (private) свойства и нет конструктора. Теперь выполним запрос.

Если используется метод fetch с PDO::FETCH_CLASS , перед отправкой запроса на получение данных нужно применить метод setFetchMode :

Первый параметр, который передаем методу setFetchMode , — константа PDO::FETCH_CLASS . Второй параметр — имя класса, который будет использоваться при создании объекта. Теперь выполним:

В результате получим объект Planet :

Значения, полученные в результате запроса, назначены соответствующим свойствам объекта, даже закрытым.

Определение свойств после выполнения конструктора

В классе Planet нет явного конструктора, поэтому проблем при назначении свойств не будет. При наличии у класса конструктора, в котором свойство было назначено или изменено, они будут перезаписаны.

При использовании константы FETCH_PROPS_LATE значения свойств будут присваиваться после выполнения конструктора:

Мы изменили класс Planet , добавив конструктор, который принимает на входе два аргумента: name (имя) и color (цвет). Значения этих полей по умолчанию: moon (луна) и gray (серый) соответственно.

Если не использовать FETCH_PROPS_LATE , при создании объекта свойства будут перезаписаны значениями по умолчанию. Проверим это. Сначала выполним запрос:

В результате получим:

Как и ожидалось, извлеченные из базы данных значения перезаписаны. Теперь рассмотрим решение задачи с помощью FETCH_PROPS_LATE (запрос аналогичный):

В результате получим то, что нужно:

Если у конструктора класса нет значений по умолчанию, а они нужны, параметры конструктора задаются при вызове метода setFetchMode третьим аргументом в виде массива. Например:

Аргументы конструктора обязательны, поэтому выполним:

Входящие параметры выступают также в роли значений по умолчанию, которые нужны для инициализации. В дальнейшем они будут перезаписаны значениями из базы данных.

Получение нескольких объектов

Множественные результаты извлекаются в виде объектов с помощью метода fetch внутри цикла while :

Или путём выборки всех результатов сразу. Во втором случае используется метод fetchAll , причём режим указывается в момент вызова:

PDO::FETCH_INTO

При выборе этого варианта выборки PDO не создаёт новый объект, а обновляет свойства существующего. Однако это возможно только для общедоступных (public) свойств или при использовании в объекте «магического» метода __set .

Подготовленные и прямые запросы

В PDO два способа выполнения запросов:

  • прямой, который состоит из одного шага;
  • подготовленный, который состоит из двух шагов.

Прямые запросы

Существует два метода выполнения прямых запросов:

  • query используется для операторов, которые не вносят изменения, например SELECT . Возвращает объект PDOStatemnt , из которого с помощью методов fetch или fetchAll извлекаются результаты запроса;
  • exec используется для операторов вроде INSERT , DELETE или UPDATE . Возвращает число обработанных запросом строк.

Прямые операторы используются только в том случае, если в запросе отсутствуют переменные и есть уверенность, что запрос безопасен и правильно экранирован.

Подготовленные запросы

PDO поддерживает подготовленные запросы (prepared statements), которые полезны для защиты приложения от SQL-инъекций: метод prepare выполняет необходимые экранирования.

Рассмотрим пример. Требуется вставить свойства объекта Planet в таблицу Planets . Сначала подготовим запрос:

Используем метод prepare , который принимает как аргумент SQL-запрос с псевдопеременными (placeholders). Псевдопеременные могут быть двух типов: неименнованые и именованные.

Неименованные псевдопеременные

Неименованные псевдопеременные (positional placeholders) отмечаются символом ? . Запрос в результате получается компактным, но требуется предоставить значения для подстановки, размещенные в том же порядке. Они передаются в виде массива через метод execute :

Именованные псевдопеременные

При использовании именованных псевдопеременных (named placeholders) порядок передачи значений для подстановки не важен, но код в этом случае становится не таким компактным. В метод execute данные передаются в виде ассоциативного массива, в котором каждый ключ соответствует имени псевдопеременной, а значение массива — значению, которое требуется подставить в запрос. Переделаем предыдущий пример:

Методы prepare и execute используются как при выполнении запросов на изменение, так и при выборке.

А информацию о количестве обработанных строк при необходимости предоставит метод rowCount .

Управление поведением PDO при ошибках

Параметр выбора режима ошибок PDO::ATTR_ERRMODE используется для определения поведения PDO в случае ошибок. Доступно три варианта: PDO::ERRMODE_SILENT , PDO::ERRMODE_EXCEPTION и PDO::ERRMODE_WARNING .

PDO::ERRMODE_SILENT

Вариант по умолчанию. PDO просто запишет информацию об ошибке, которую помогут получить методы errorCode и errorInfo.

PDO::ERRMODE_EXCEPTION

Это предпочтительный вариант, при котором в дополнение к информации об ошибке PDO выбрасывает исключение (PDOException). Исключение прерывает выполнение скрипта, что полезно при использовании транзакций PDO. Пример приведён ниже при описании транзакций.

PDO::ERRMODE_WARNING

В этом случае PDO также записывает информацию об ошибке. Поток выполнения скрипта не прерывается, но выдаются предупреждения.

Методы bindValue и bindParam

Для подстановки значений в запросе можно также использовать методы bindValue и bindParam . Первый связывает значение переменной с псевдопеременной, которая использована при подготовке запроса:

Связали значение переменной $planet->name с псевдопеременной :name . Обратите внимание, что при использовании методов bindValue и bindParam как третий аргумент указывается тип переменной, используя соответствующие константы PDO. В примере — PDO::PARAM_STR .

Метод bindParam привязывает переменную к псевдопеременной. В этом случае переменная связана с псевдопеременной ссылкой, а значение будет подставлено в запрос только после вызова метода execute . Рассмотрим на примере:

Транзакции в PDO

Транзакции позволяют сохранить на некоторое время и организовать выполнение нескольких запросов «пакетом». Запросы, включённые в транзакцию, применяются только в том случае, если при выполнении отсутствуют ошибки. Транзакции поддерживаются не всеми СУБД и работают не со всеми SQL-конструкциями, так как некоторые из них вызывают неявное выполнение. Список таких конструкций можно найти на сайте MariaDB.

Представим необычный пример. Пользователю требуется выбрать список планет, причём каждый раз при выполнении запроса текущие данные удаляются из базы, а потом вставляются новые. Если после удаления произойдёт ошибка, то следующий пользователь получит пустой список. Чтобы этого избежать, используем транзакции:

Метод beginTransaction отключает автоматическое выполнение запросов, а внутри конструкции try-catch запросы выполняются в нужном порядке. Если не возникнет исключений PDOException , запросы выполнятся с помощью метода commit . В противном случае откатятся с помощью метода rollback , а автоматическое выполнение запросов восстановится.

Таким образом появилась согласованность выполнения запросов. Очевидно, что для этого параметру PDO::ATTR_ERRMODE необходимо установить значение PDO::ERRMODE_EXCEPTION .

Заключение

Теперь, когда работа с PDO описана, отметим его основные преимущества:

  • с PDO легко перенести приложение на другие СУБД;
  • поддерживаются все популярные СУБД;
  • встроенная система управления ошибками;
  • разнообразные варианты представления результатов выборки;
  • поддерживаются подготовленные запросы, которые сокращают код и делают его устойчивым к SQL-инъекциям;
  • поддерживаются транзакции, которые помогают сохранить целостность данных и согласованность запросов при параллельной работе пользователей.
Илон Маск рекомендует:  Что такое код stretchbit
Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL