Работа с wddx в рнр


Содержание

Работа с wddx в рнр

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

Теперь продолжим по массивам. Функция EXTRACT() создает переменные на основе ассоциативного массива. Функция имеет три параметра: исходный массив, тип операции (необязателен), строка-префикс (необязательный; для типов операций EXTR_PREFIX_SAME и EXTR_PREFIX_ALL) — для создания переменных с строкой-префиксом в названии, не попадающих под правило, определяемое типом операции.

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

Как Вы, наверное, заметили, тип операции задается константой (допустимые значения от 0 до 3). Перед выполнением EXTRACT()-а проинициализирована одна из создаваемых функцией переменных — $size. Значение 2-го параметра EXTR_OVERVIEW (значение по умолчанию) заставляет функцию перезаписывать значение этой переменной новым значением (из массива).

EXTR_SKIP не «портит» значение $size.

EXTR_PREFIX_SAME также не изменяет $size, но создает одноименную переменную с префиксом, передаваемым в третьем параметре (в этом случае третий параметр обязателен — умолчания нет!), т.е. в данном примере переменную wddx_size.

И наконец, EXTR_PREFIX_ALL, не трогая $size, создает на каждый ключ массива переменную с префиксом.

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

То же касается и случая, когда:

т.к. в имени переменной не может быть пробелов — ключ для функции неверен.

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

К WDDX-группе мы перейдем ближе к финалу рассмотрения возможностей PHP, когда вплотную займемся работой с XML. По описанию на сайте разработчиков WDDX-концепция основана на XML-технологии (DTD) и предназначена для сериализации данных, под которой авторы понимают сохранение и передачу данных между разными скриптовыми технологиями на стороне сервера (например, PHP ;). Необходимоть такого решения обуславливается различиями внутреннего формата данных в разных скриптовых решениях (ColdFusion, Perl, ASP, Java, JavaScript, PHP и пр.).
(Надеюсь, я правильно понял описание. )

Функция KEY() возвращает текущее значение ключа массива (напомню, когда речь идет о текущем значении, имеется в виду внутренний указатель на элемент массива). В качестве параметра передается массив. Если массив неассоциативный, то ключем является индекс.

Функция RANGE() создает массив из диапазона чисел:

Функция SHUFFLE() случайным образом «перемешивает» содержимое массива (правда, для полноценной «случайности» надо проинициализировать псевдослучайную последовательность функцией SRAND(), дав ей на вход уникальное число, например, от функции TIME()).

Вот пример (взят из мануала).

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

Функции COUNT() и SIZEOF() возвращают количество элементов массива. Если в качестве параметра указана обычная переменная, то обе вернут «1». Если переменная еще не определена, то возвращаемое значение будет «0» (кстати, для подавления Warning-а перед функцией можно поставить знак «@» — подавление сообщения об ошибки или предупреждения). В чем разница между этими функциями, я так и не выяснил.

Обмен данными между приложениями с помощью XML+WDDX в PHP4

В статье рассматривается методика организации кроссплатформенного межзадачного обмена данными на основе XML с применением WDDX-пакетов. Приведенные примеры демонстрируют возможность как формирования входных документов, так и загрузки массивов в формате XML+WDDX в PHP-приложение.
Одна из весьма серьезных проблем, возникающих при Web-программировании заключается в необходимости стыковки между расличными задачами (программами), объединяемыми в Internet/Intranet-систему. Например, при разработке сложных систем, которые ведутся в несколько этапов различными коммандами разработчиков, может возникнуть ситуация, при которой часть модулей реализована на Perl, а часть — на PHP.
Достаточно удобное решение возникающих в такой ситуации многочисленных проблем, которое было предложено фирмой Allaire, разработчиком известной инструментальной системы Gold Fusion, основано на формате XML. А точнее на одном из его расширений.
WDDX (Web Distributed Data eXchange — обмен данными, распределенными в сети), является производным от XML и предоставляет достаточно удобный механизм, позволяющий конвертировать структуры данных из Perl, Javascript или PHP в некоторый унифицированный формат на базе XML или обратно. (В отличие от пакета Gold Fusion, WDDX выпущен как проект с открытым кодом. Вы можете загрузить WDDX SDK с сервера http://www.openwddx.org. А при необходимости обеспечить работу с WDDX из программы на Perl, воспользуйтесь модулем WDDX.pm с CPAN.)

1. Первое знакомство с WDDX

Главное преимущество WDDX заключается в прозрачной для программиста поддержке не только разнообразных «элементарных» типов данных: строк, чисел, логических значений, даты и времени, но и составных — массивов, структур и записей. Кроме того, WDDX позволяет представлять и двоичные данные, например, графические изображения. Естественно, поддерживается как вывод, так и ввод данных.
По умолчанию, поддержка WDDX в PHP отключена, чтобы ее активизировать и иметь возможность проверить работоспособность примеров этой статье, вы должны перекомпилировать PHP-машину с конфигурационным ключом —enable-wddx.
После перезагрузки WWW-сервера с поддержкой WDDX мы можем приступить к изучению возможностей этого протокола. Вначале попробуем сериализировать (преобразовать в формат, пригодный для обмена) одно отдельное значение. Хитрость WDDX, которая находит отражение в терминологии, состоит в том, что исходные данные преобразуются в так называемые «пакеты данных», которые инкапсулируют имя переменной, её тип и значение.
Поэтому приведенная ниже программа:

приведет к формированию пакета (текстовой строки):

Преобразование РНР в WDDX

Итак, что мы видим. Вначале в поток помещен тэг, представляющий собой идентификатор версии протокола WDDX. Версия 1.0 является единственной существующей, поэтому просто принимайте эту информацию к сведению. Затем следует комментарий, в котором содержится либо описание переменной, либо иногда помещается имя переменной, в которой хранились данные в исходной программе. А уже затем следует тэг (в данном случае ), который определяет тип переменной и её значение.
Но использовать WDDX для хранения отднльных, изолированных переменных на практике не слишком удобно. Поэтому в WDDX предусмотрен механизм «накопления» переменных, подлежащих сериализации, с последующим помещением их «в один флакон». Вот как это выглядит на практике:

В результате выполнения этой программы вы получите следующий пакет WDDX:

3.1415926

Austin
Novato
Seattle

2. Функции WDDX-генератора и анализатора

Теперь давайте приступим к подобному обсуждению функций WDDX.

2.1 Сериализация переменной — wddx_serialize_value

string wddx_serialize_value (mixed var [, string comment])

Функция wddx_serialize_value() используется для создания WDDX пакета, содержащего одно единственое значение. Это значение извлекается из переменной var, а при наличии необязательного комментария comment, он добавляется в заголовок пакета. Результатом работы функции является сформированный WDDX-пакет.

2.2 Сериализация множества — wddx_serialize_vars

string wddx_serialize_vars (mixed var_name [, mixed . ])

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

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

1

5.5

blue
orange
violet

colors

2.3 Создание нового пакета — wddx_packet_start

int wddx_packet_start ([string comment])

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

2.4 Закрытие пакета — wddx_packet_end

string wddx_packet_end (int packet_id)

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

2.5 Добавление данных в пакет — wddx_add_vars

wddx_add_vars (int packet_id, mixed name_var [, mixed . ])

Функция wddx_add_vars() используется для сериализации переданных ей аргументов с помещением в открытый ранее пакет с идентификатором id. Переменные, которые подлежат сериализации, определяются так же, как и в функции wddx_serialize_vars().


2.6 Восстановление данных — wddx_deserialize

mixed wddx_deserialize (string packet)

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

3. Генерация системного журнала в XML+WDDX

Теперь, в качестве иллюстрации, рассмотрим практический пример работы подсистемы обработки ошибок в РНР (Листинг 1). Мы создадим собственную функцию обработчика ошибок, которая будет генерировать журнал, представленный в модном XML-формате, а также отправлять письмо администратору узла при обнаружении критических ошибок. Поскольку нам придется иметь дело с массивами, для их помещения в журнал мы воспользуемся WDDX.
Возможно, пример покажется вам достаточно длинным, но, поверьте, дело того стоит.
Состоит он из двух основных частей — формирования журнала и его последующего просмотра. Поскольку пользователь nobody, от имени которого обычно запускаются PHP-программы на сервере Apache, не имеет особых прав на работу с файловой системой, для размещения системного журнала мы будем использовать каталог tmp. В некоторых версиях Linux доступ на запись в этот каталог «посторонним» пользователям закрыт. Поэтому вам может потребоваться изменить права доступа к нему с помощью команды (такая комманда — это грубейшее нарушение безопасности и не рекомендуется проводить на узлах, подключенных с сети Интернет)
chmod a+w /tmp
Обратите внимание на команду unlink в самом начале программы. Дело в том, что XML-документ может содержать только один элемент верхнего уровня, а команда error_log осуществляет extit<дописывание в конец существующего файла>. Поэтому, если вы не будете создавать системный журнал заново, то выполнить программу больше одного раза просто не сможете — анализатор XML аварийно завершит работу при обнаружении второго документа верхнего уровня.
После этого мы создаем новый файл журнала и помещаем в него открывающий тег . Затем устанавливаем свой собственный обработчик ошибочных ситуаций, в задачу которого входит сформировать запись в XML-формате, которая будет записана в журнал.
До тех пор, пока структура записи определена достаточно жестко:

Работа с wddx в рнр

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

Чаще всего PHP сценарии встроены в HTML-разметку внутри специальных тегов . Во время запроса документа, имеющего PHP сценарии, на сервере происходит выполнение кода, а пользователь получает в браузер «чистый» HTML. Таким образом, PHP сценарии решают все те задачи, которые характерны для типичных CGI-приложений.

Однако PHP можно использовать не только так. Вот основные области применения этой технологии:

— создание скриптов для выполнения на стороне сервера — это основная задача PHP, и в большей степени PHP используется именно в этом варианте;

— создание скриптов для выполнения в командной строке, например для обработки текстов на локальном компьютере;

— создание оконных приложений, выполняющихся на стороне клиента (здесь надо использовать расширение PHP-GTK), в таком варианте PHP используется крайне редко.

PHP — это кроссплатформенная технология. Дистрибутив PHP доступен для большинства операционных систем, включая Linux, многие модификации Unix (например, HP-UX, Solaris и OpenBSD), Microsoft Windows, Mac OS X, RISC OS, и многих других. PHP поддерживает большинство наиболее популярных вебсерверов, таких, как Apache, Microsoft Internet Information Server, Microsoft Personal Web Server, Netscape, iPlanet, Oreilly Website Pro, Caudium, Xitami, OmniHTTPd и другие. Для большинства серверов PHP поставляется в 2-х вариантах — в качестве модуля и в качестве CGI препроцессора.

Кроме этого, программируя на PHP разработчик может отдавать предпочтение как процедурному, так и объектно-ориентированному программированию (особенно при работе с PHP 5).

PHP способен генерировать не только HTML документы, но и изображения разных форматов, файлы PDF и Flash. PHP способен формировать данные в любом текстовом формате, включая XHTML и XML.

PHP поддерживает работу с ODBC и большое количество баз данных:

Adabas D, InterBase, PostgreSQL, dBase, FrontBase, SQLite, Empress, mSQL, Solid, FilePro, Direct MS-SQL, Sybase, Hyperwave, MySQL, Velocis, IBM DB2, ODBC, Unix, dbm, Informix, Oracle, DBX, Ingres, Ovrimos.

Возможно создание PHP сценариев для работы с протоколами LDAP, IMAP, SNMP, NNTP, POP3, HTTP, COM (на платформах Windows), WDDX и многими другими.

PHP включает такие средства обработки текстовой информации как регулярные выражения Perl, POSIX Extended, парсеры документов XML, для которых в PHP 4 используются стандарты SAX и DOM. Возможно преобразование документов XML при помощи расширение XSLT. В PHP 5 обработка XML-документов происходит на базе библиотеки libxml2, а также добавлены два новые расширения: SimpleXML и XMLReader.

Для использования PHP в электронной коммерции имеются функции осуществления платежей Cybercash, CyberMUT, VeriSign Payflow Pro и CCVS.

Кроме этого PHP поддерживает много других расширений, например, таких, как функции поисковой машины mnoGoSearch, функции IRC Gateway, функции для работы со сжатыми файлами (gzip, bz2), функции календарных вычислений, функции перевода и т.п.

Технология JavaScript

JavaScript это созданный фирмой Netscape межплатформенный, объектно-ориентированный язык скриптинга (сценариев). Ядро JavaScript содержит набор основных объектов, таких как Array, Date и Math, и основной набор элементов языка, таких как операции, структуры управления и операторы. Ядро JavaScript может быть расширено для различных целей путём дополнения новыми объектами; например:

— клиентский JavaScript расширяет ядро языка, предоставляя объекты управления браузером (Navigator или другой web-браузер) и Document Object Model (DOM). Например, клиентские расширения дают приложению возможность размещать элементы в HTML-форме и реагировать на действия пользователя, такие как щелчок мыши, ввод данных в форму и навигация по страницам;

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

JavaScript позволяет создавать приложения, работающие по всей сети Internet. Клиентские приложения работают в браузере, таком как Netscape Navigator, а серверные приложения — на сервере, таком как Netscape Enterprise Server. Используя JavaScript, Вы можете создавать динамические HTML-страницы, обрабатывающие пользовательский ввод и имеющиеся данные, используя специальные объекты, файлы и реляционные БД.

С помощью функциональности JavaScript LiveConnect Вы можете организовать взаимодействие кодов Java и JavaScript. Из JavaScript Вы можете инстанциировать объекты Java и получать доступ к их public-методам и полям. Из Java Вы можете получать доступ к объектам, свойствам и методам JavaScript.

Корпорация Netscape изобрела JavaScript, и JavaScript был впервые использован в браузерах Netscape.

PHP: PDO быстрый старт, работа с MySQL

Содержание:

PDO (PHP Data Objects) — расширение PHP, которое реализует взаимодействие с базами данных при помощи объектов. Профит в том, что отсутствует привязка к конкретной системе управления базами данных. PDO поддерживает СУБД: MySQL, PostgreSQL, SQLite, Oracle, Microsoft SQL Server и другие.

Официальный мануал по PHP PDO здесь . Там же можно найти и сам класс PDO .

Почему стоит использовать PDO

Функции mysql в PHP для работы с БД давно уже устарели, на сегодняшний день желательно использовать mysqli или PDO (PHP Data Objects). Кроме того, mysqli — эта библиотека, которая по большому счёту, не предназначена для использования напрямую в коде. Она может послужить хорошим строительным материалом для создания библиотеки более высокого уровня. При работе с mysqli следует также помнить об обеспечении безопасности вашего приложения, в частности о защите от SQL-инъекций. В случае использования PDO (с его подготовленными запросами), такая защита идёт уже «из коробки», главное правильно применить необходимые методы.

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

Установка PDO

Проверить доступные драйвера

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

Соединения устанавливаются автоматически при создании объекта PDO от его базового класса.

При ошибке подключения PHP выдаст ошибку:

В этом примере подключения мы используем конструкцию try. catch . Многие спорят о целесообразности её использования. Лично я использую try. catch , она мне не мешает.

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

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

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

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


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

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

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

Если же в запрос передаётся хотя бы одна переменная, то этот запрос в обязательном порядке должен выполняться только через подготовленные выражения . Что это значит? Это обычный SQL запрос, в котором вместо переменной ставится специальный маркер — плейсхолдер. PDO поддерживает позиционные плейсхолдеры ( ? ), для которых важен порядок передаваемых переменных, и именованные ( :name ), для которых порядок не важен. Примеры:

Чтобы выполнить такой запрос, сначала его надо подготовить с помощью метода prepare() . Она также возвращает PDO statement , но ещё без данных. Чтобы их получить, надо исполнить этот запрос, предварительно передав в него наши переменные. Передать можно двумя способами: Чаще всего можно просто выполнить метод execute() , передав ему массив с переменными:

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

ВАЖНО! Подготовленные запросы — основная причина использовать PDO, поскольку это единственный безопасный способ выполнения SQL запросов, в которых участвуют переменные.

Получение данных. Метод fetch()

Мы уже выше познакомились с методом fetch() , который служит для последовательного получения строк из БД. Этот метод является аналогом функции mysq_fetch_array() и ей подобных, но действует по-другому: вместо множества функций здесь используется одна, но ее поведение задается переданным параметром. В подробностях об этих параметрах будет написано в другой заметке , а в качестве краткой рекомендации посоветую применять fetch() в режиме FETCH_LAZY

В этом режиме не тратится лишняя память, и к тому же к колонкам можно обращаться любым из трех способов — через индекс, имя, или свойство (через -> ). Недостатком же данного режима является то, что он не работает с fetchAll()

Получение данных. Метод fetchColumn()

Также у PDO statement есть метод для получения значения единственной колонки. Очень удобно, если мы запрашиваем только одно поле — в этом случае значительно сокращается количество кода:

Получение данных. Метод fetchAll()

PDO и оператор LIKE

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

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

PDO и оператор LIMIT

Важно! Когда PDO работает в режиме эмуляции, все данные, которые были переданы напрямую в execute() , форматируются как строки. То есть, эскейпятся и обрамляются кавычками. Поэтому LIMIT . превращается в LIMIT ’10’, ’10’ и очевидным образом вызывает ошибку синтаксиса и, соответственно, пустой массив данных.

Решение #1 : Отключить режим эмуляции:

Решение #2 : Биндить эти цифры через bindValue() , принудительно выставляя им тип PDO::PARAM_INT :

PDO и оператор IN

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

Добавление записей

Изменение записей

Удаление записей

Использование транзакций

Важно! Транзакции в PDO работают только с таблицами InnoDB

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

Работа с wddx в рнр

WDDX — (Web Distributed Data eXchange) is a programming language , platform and transport neutral data interchange mechanism to pass data between different environments and different computers. It supports simple data types such as number, string,… … Wikipedia

WDDX — (Web Distributed Data eXchange) ist ein plattform und transportneutraler programmiersprachlicher Mechanismus für den Austausch von Daten zwischen unterschiedlichen System Umgebungen und Computern. Das Format unterstützt einfache Datentypen wie… … Deutsch Wikipedia

WDDX — (Web Distributed Data eXchange) es un estándar XML para el intercambio de información estructurada entre distintos lenguajes de programación. Usando WDDX es posible convertir un vector en PHP en una estructura WDDX serializada y luego des… … Wikipedia Español

WDDX — Web Distributed Data eXchange Web Distributed Data eXchange, sigle WDDX, est un format d échange de données entre applications. Il est basé sur XML. Il a été créé par Allaire pour son environnement ColdFusion. Des bibliothèques permettent de l… … Wikipédia en Français

WDDX — Web Distributed Data Exchange (Computing » General) … Abbreviations dictionary

WDDX — ● ►en sg. m. ►XML Web Distributed Data Exchange. Technique basée sur XML, mise au point par la société Allaire, afin de permettre les échanges de données entre les différents langage de programmation liés au web comme ASP, Java, Javascript, Perl … Dictionnaire d’informatique francophone

Web Distributed Data eXchange — Web Distributed Data eXchange, sigle WDDX, est un format d échange de données entre applications. Il est basé sur XML. Il a été créé par Allaire pour son environnement ColdFusion. Des bibliothèques permettent de l utiliser avec de nombreux… … Wikipédia en Français

Adobe ColdFusion — ColdFusion ist eine für Web basierte Datenbankanwendungen konzipierte M >Deutsch Wikipedia

CFML — ColdFusion ist eine für Web basierte Datenbankanwendungen konzipierte M >Deutsch Wikipedia

ColdFusion Language — ColdFusion ist eine für Web basierte Datenbankanwendungen konzipierte M >Deutsch Wikipedia

CXXXII. WDDX Functions

These functions are intended for work with WDDX .

In order to use WDDX, you will need to install the expat library (which comes with Apache 1.3.7 or higher).

After installing expat compile PHP with —enable-wddx .

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


Данное расширение не определяет никакие директивы конфигурации в php.ini .

Данное расширение не определяет никакие типы ресурсов.

Данное расширение не определяет никакие константы.

All the functions that serialize variables use the first element of an array to determine whether the array is to be serialized into an array or structure. If the first element has string key, then it is serialized into a structure, otherwise, into an array.

Пример 1. Serializing a single value with WDDX

This example will produce:

I think it would be helpful for passing data between languages to show a direct translation of the above examples into Perl, using WDDX.pm 1.00 from CPAN. It took me awhile to figure out. To serialize:

The PHP WDDX module encodes all scalars as strings in the XML packet, due to PHP’s loose typing. The current Perl WDDX module takes a different approach, requiring the caller to mark each variable with a type. This is helpful if the reader of the packet is a more strongly typed language that distinguishes between string, int, float, and bool; but it’s more cumbersome to use than the PHP approach. The Perl module is hard to find right now; its home page is:

Since there aren’t any examples of reversing the process, here’s one. If you had the packet produced by the above example (without the htmlentities() call), you could retrieve the values like this:

To make these examples work, you’ll probably want to format the output with a call to htmlentities:

$pi = 3.1415926;
$packet_ );
wddx_add_vars($packet_id, «pi»);

/* Suppose $cities came from database */
$cities = array(«Austin», «Novato», «Seattle»);
wddx_add_vars($packet_id, «cities»);

$packet = wddx_packet_end($packet_id);
print htmlentities($packet);

Настройка и использование 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 нет явного конструктора, поэтому проблем при назначении свойств не будет. При наличии у класса конструктора, в котором свойство было назначено или изменено, они будут перезаписаны.

14 ноября в 18:30, Витебск, беcплатно

При использовании константы 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-инъекциям;
  • поддерживаются транзакции, которые помогают сохранить целостность данных и согласованность запросов при параллельной работе пользователей.

Справочник по PHP : Функции работы с данными : Работа с массивами : Переменные и массивы

Материал из WebWikiABCD

Заносит элементы массива в переменные.

Наподобие array(), функция list() не совсем функция, а языковая конструкция. Она используется для формирования списка переменных.

Замечание: list() работает только с цифровыми индексами массива и принимает ключи элементов начиная с 0.

Пример использования функции list():

Пример использования функции list():

Пример использования функции list(): Индексы

Функция поддерживается PHP 3, PHP 4, PHP 5

compact

Упаковывает в массив переменные из текущего контекста.

Функция compact() упаковывает в массив переменные из текущего контекста (глобального или контекста функции), заданные своими именами в varname1, $varname2 и т.д. При этом в массиве образуются пары с ключами, равными содержимому varnameN, и значениями соответствующих переменных.

Число аргументов может быть неопределенное.

Если в аргументе указано имя несуществующей переменной, он пропускается. Действие этой функции противоположно функции extract().

Пример использования функции compact():

В результате выполнения кода переменная $result имеет значение:

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

Пример использования функции compact():

Функция поддерживается PHP 4, PHP 5

extract

Импорт элементов массива в переменные.

Функция extract() используется для импортирования значений массива в строку. Эта функция берет ассоциативный массив var_array, использую ключ элемента как имя переменной, а значение элемента как значение полученной переменной. Для создания переменных из пары ключ => значение можно также использовать необязательные параметры extract_type и prefix.


Замечание: начиная с PHP версии 4.0.5 эта функция возвращала количество извлеченных переменных.

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

EXTR_OVERWRITE Если переменная с таким именем уже существует, то ее значение будет заменено (значение по умолчанию). EXTR_SKIP Если переменная с таким именем уже существует, то ее значение не будет заменено. EXTR_PREFIX_SAME Если переменная с таким именем уже существует, то к ее имени добавится префикс, определенный в параметре prefix. EXTR_PREFIX_ALL Ко всем образуемым переменным будет добавлен префикс prefix. EXTR_PREFIX_INVALID Только при неправильных или числовых индексах массива к имени переменной будет добавлен префикс prefix. EXTR_IF_EXISTS Если переменная с таким именем уже существует, то ее значение будет переписано. Иначе ничего не сделает. Это может быть полезно, если вы задали список всех переменных, а затем хотите извлечь только те переменные, которые были определены, например, из $_REQUEST. Этот флаг был добавлен в PHP 4.2.0 EXTR_PREFIX_IF_EXISTS Создает переменные с префиксом, если такие переменные без префикса уже существовали. В любом другом случае ничего не создает. Этот флаг был добавлен в PHP 4.2.0 EXTR_REFS Переменные создаются как ссылки. Это означает, что созданные переменные все еще ссылаются на значения соответствующих элементов массива var_array. Вы можете применять этот флаг как в одиночку, так и совместно с другими флагами. Этот флаг был добавлен в PHP 4.3.0

Пример использования функции extract():

Здесь переменная $size не была переписана, т.к. мы указали параметр EXTR_PREFIX_SAME. Если указать EXTR_SKIP, тогда переменная $wddx_size даже не была бы создана. Если указать EXTR_OVERWRITE, то переменная $size имела бы значение «medium». Если EXTR_PREFIX_ALL — то в результате были бы созданы переменные $wddx_color, $wddx_size, и $wddx_shape.

Лучше всего использовать ассоциативные массивы. Массивы с цифровыми ключами не могут быть использованы в этой функции, если установлены флаги EXTR_PREFIX_ALL или EXTR_PREFIX_INVALID.

Функция поддерживается PHP 3 >= 3.0.7, PHP 4, PHP 5

Обмен данными между приложениями с помощью XML+WDDX в PHP4

В статье рассматривается методика организации кроссплатформенного межзадачного обмена данными на основе XML с применением WDDX-пакетов. Приведенные примеры демонстрируют возможность как формирования входных документов, так и загрузки массивов в формате XML+WDDX в PHP-приложение.
Одна из весьма серьезных проблем, возникающих при Web-программировании заключается в необходимости стыковки между расличными задачами (программами), объединяемыми в Internet/Intranet-систему. Например, при разработке сложных систем, которые ведутся в несколько этапов различными коммандами разработчиков, может возникнуть ситуация, при которой часть модулей реализована на Perl, а часть — на PHP.
Достаточно удобное решение возникающих в такой ситуации многочисленных проблем, которое было предложено фирмой Allaire, разработчиком известной инструментальной системы Gold Fusion, основано на формате XML. А точнее на одном из его расширений.
WDDX (Web Distributed Data eXchange — обмен данными, распределенными в сети), является производным от XML и предоставляет достаточно удобный механизм, позволяющий конвертировать структуры данных из Perl, Javascript или PHP в некоторый унифицированный формат на базе XML или обратно. (В отличие от пакета Gold Fusion, WDDX выпущен как проект с открытым кодом. Вы можете загрузить WDDX SDK с сервера http://www.openwddx.org. А при необходимости обеспечить работу с WDDX из программы на Perl, воспользуйтесь модулем WDDX.pm с CPAN.)

1. Первое знакомство с WDDX

Главное преимущество WDDX заключается в прозрачной для программиста поддержке не только разнообразных «элементарных» типов данных: строк, чисел, логических значений, даты и времени, но и составных — массивов, структур и записей. Кроме того, WDDX позволяет представлять и двоичные данные, например, графические изображения. Естественно, поддерживается как вывод, так и ввод данных.
По умолчанию, поддержка WDDX в PHP отключена, чтобы ее активизировать и иметь возможность проверить работоспособность примеров этой статье, вы должны перекомпилировать PHP-машину с конфигурационным ключом —enable-wddx.
После перезагрузки WWW-сервера с поддержкой WDDX мы можем приступить к изучению возможностей этого протокола. Вначале попробуем сериализировать (преобразовать в формат, пригодный для обмена) одно отдельное значение. Хитрость WDDX, которая находит отражение в терминологии, состоит в том, что исходные данные преобразуются в так называемые «пакеты данных», которые инкапсулируют имя переменной, её тип и значение.
Поэтому приведенная ниже программа:

приведет к формированию пакета (текстовой строки):

Преобразование РНР в WDDX

Итак, что мы видим. Вначале в поток помещен тэг, представляющий собой идентификатор версии протокола WDDX. Версия 1.0 является единственной существующей, поэтому просто принимайте эту информацию к сведению. Затем следует комментарий, в котором содержится либо описание переменной, либо иногда помещается имя переменной, в которой хранились данные в исходной программе. А уже затем следует тэг (в данном случае ), который определяет тип переменной и её значение.
Но использовать WDDX для хранения отднльных, изолированных переменных на практике не слишком удобно. Поэтому в WDDX предусмотрен механизм «накопления» переменных, подлежащих сериализации, с последующим помещением их «в один флакон». Вот как это выглядит на практике:

В результате выполнения этой программы вы получите следующий пакет WDDX:

3.1415926

Austin
Novato
Seattle

2. Функции WDDX-генератора и анализатора

Теперь давайте приступим к подобному обсуждению функций WDDX.

2.1 Сериализация переменной — wddx_serialize_value

string wddx_serialize_value (mixed var [, string comment])

Функция wddx_serialize_value() используется для создания WDDX пакета, содержащего одно единственое значение. Это значение извлекается из переменной var, а при наличии необязательного комментария comment, он добавляется в заголовок пакета. Результатом работы функции является сформированный WDDX-пакет.

2.2 Сериализация множества — wddx_serialize_vars

string wddx_serialize_vars (mixed var_name [, mixed . ])

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

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

1

5.5

blue
orange
violet

colors

2.3 Создание нового пакета — wddx_packet_start

int wddx_packet_start ([string comment])

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

2.4 Закрытие пакета — wddx_packet_end

string wddx_packet_end (int packet_id)

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

2.5 Добавление данных в пакет — wddx_add_vars

wddx_add_vars (int packet_id, mixed name_var [, mixed . ])

Функция wddx_add_vars() используется для сериализации переданных ей аргументов с помещением в открытый ранее пакет с идентификатором id. Переменные, которые подлежат сериализации, определяются так же, как и в функции wddx_serialize_vars().

2.6 Восстановление данных — wddx_deserialize

mixed wddx_deserialize (string packet)

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

3. Генерация системного журнала в XML+WDDX

Теперь, в качестве иллюстрации, рассмотрим практический пример работы подсистемы обработки ошибок в РНР (Листинг 1). Мы создадим собственную функцию обработчика ошибок, которая будет генерировать журнал, представленный в модном XML-формате, а также отправлять письмо администратору узла при обнаружении критических ошибок. Поскольку нам придется иметь дело с массивами, для их помещения в журнал мы воспользуемся WDDX.
Возможно, пример покажется вам достаточно длинным, но, поверьте, дело того стоит.
Состоит он из двух основных частей — формирования журнала и его последующего просмотра. Поскольку пользователь nobody, от имени которого обычно запускаются PHP-программы на сервере Apache, не имеет особых прав на работу с файловой системой, для размещения системного журнала мы будем использовать каталог tmp. В некоторых версиях Linux доступ на запись в этот каталог «посторонним» пользователям закрыт. Поэтому вам может потребоваться изменить права доступа к нему с помощью команды (такая комманда — это грубейшее нарушение безопасности и не рекомендуется проводить на узлах, подключенных с сети Интернет)
chmod a+w /tmp
Обратите внимание на команду unlink в самом начале программы. Дело в том, что XML-документ может содержать только один элемент верхнего уровня, а команда error_log осуществляет extit<дописывание в конец существующего файла>. Поэтому, если вы не будете создавать системный журнал заново, то выполнить программу больше одного раза просто не сможете — анализатор XML аварийно завершит работу при обнаружении второго документа верхнего уровня.
После этого мы создаем новый файл журнала и помещаем в него открывающий тег . Затем устанавливаем свой собственный обработчик ошибочных ситуаций, в задачу которого входит сформировать запись в XML-формате, которая будет записана в журнал.
До тех пор, пока структура записи определена достаточно жестко:

Работа с wddx в рнр

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

Пример #1 Сериализация одно значения с помощью WDDX

Этот пример создает:

Пример #2 Использование инкрементальных пакетов WDDX

= 3.1415926 ;
$packet_id = wddx_packet_start ( «PHP» );
wddx_add_vars ( $packet_id , «pi» );

/* Предпожим, что $cities была заполнена из базы данных */
$cities = array( «Austin» , «Novato» , «Seattle» );
wddx_add_vars ( $packet_id , «cities» );

$packet = wddx_packet_end ( $packet_id );
echo $packet ;
?>

Этот пример создает:

Если вы хотите сериализовать не ASCII-символы, то вам будет необходимо сконвертировать ваши данные в UTF-8 (см. utf8_encode() и iconv() ).

Илон Маск рекомендует:  Что такое код ungetc
Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL