Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
php_лекции.doc
Скачиваний:
2
Добавлен:
21.09.2019
Размер:
817.66 Кб
Скачать

Запись данных в базу данных

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

mysql> INSERT INTO People SET title='Петров';

Для того, чтобы выполнить SQL запрос в РНР скрипте, существует функция mysql_query().

recourse mysql_query ( string query [, recourse link_identifier])

mysql_query() посылает SQL-запрос активной базе данных MySQL сервера, который определяется с помощью указателя link_identifier (это ссылка на какое-то соединение с сервером MySQL). Если параметр link_identifier опущен, используется последнее открытое соединение. Если открытые соединения отсутствуют, функция пытается соединиться с СУБД, аналогично функции mysql_connect() без параметров. Параметр query - это строка запроса, она не должна заканчиваться точкой с запятой.

Для запросов SELECT, SHOW, EXPLAIN, DESCRIBE, mysql_query() возвращает указатель на результат запроса, или FALSE, если запрос не был выполнен. В остальных случаях mysql_query() возвращает TRUE, если запрос выполнен успешно, и FALSE - в случае ошибки. Значение, не равное FALSE, говорит о том, что запрос был выполнен успешно. Оно не говорит о количестве затронутых или возвращенных рядов. Вполне возможна ситуация, когда успешный запрос не затронет ни одного ряда. mysql_query() также считается ошибочным и вернет FALSE, если у пользователя недостаточно прав для работы с указанной в запросе таблицей.

<?

$conn=mysql_connect("localhost","","");// устанавливаем соединение

$database = "book";

$table_name = "People";

mysql_select_db($database); // выбираем базу данных

$sql = "INSERT INTO $table_name SET id=123 , name =’Iavn’, surname =’Ivanov’”

// вывод запроса в браузер

//echo $sql;

$result = mysql_query($sql,$conn); // отправляем запрос

// выводим сообщение успешно ли выполнен запрос

if (!$result) echo " Can't add ($table_name) ";

else echo "Success!<br>";

?>

Получение результата

Рассмотрим какой-нибудь запрос к MySQL в РНР-программе:

$result = mysql_query("SELECT * FROM people WHERE name!=' ' ORDER BY id")

or die(mysql_error());

После того как запрос выполнен, идентификатор результирующего набора данных помещен в $result. Результат (result-set) — это упорядоченный набор данных, полностью аналогичный двумерному массиву в РНР. А именно, результат представляет собой массив строк, каждая из которых состоит из одной или нескольких ячеек. Записи и поля в таблице не упорядочены и не могут быть извлечены, например, указанием их номера (такого номера просто не существует; для выборки необходимо составлять логическое wHERE-выражение). В то же время, результирующий набор данных — это всегда массив записей, или массив массивов ячеек.

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

Количество строк, вошедших в результат, можно узнать при помощи функции mysql_num_rows(). Например, если при выборке из таблицы оказалось, что в таблице имеются 10 записей с непустым полем name, то мы в идентификаторе результата получим "ссылку" на 10 "строчек". Рассмотрим способы получения каждой строчки результата.

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

// распечатывание в браузер содержимое некоторой таблицы

<?php ## Получение результата запроса.

require_once "mysql_connect.php";

// Выполняем запрос.

$r = mysql_query('SELECT * FROM people ORDER BY id')

or die(mysql_error());

// Получаем весь результат в массив $data.

for ($data=array(); $row=mysql_fetch_assoc($r); $data[]=$row);

// Выводим массив на экран,

echo "<pre>"; print_r($data); echo "</pre>";

?>

В результате в массиве $data окажется список ассоциативных массивов. каждый такой массив состоит из пар имя_ячейки=>значение, где имя_ячейки — это имя поля в нашей таблице (id или name), а значение — соответствующее ему значение из очередной записи. Здесь используется функция mysql_fetch_assoc(), получающая очередную строку из результирующего набора данных.

array mysql_fetch_assoc (int $result)

Функция возвращает ассоциативный массив со значениями полей очередной строки результата $result. Если указатель текущей позиции результата был установлен за последней записью (т. е. строки кончились), возвращает false. Текущая позиция сдвигается к следующей записи, так что очередной вызов mysql_fetch_assoc() вернет следующую строку результата.

AS: переименование полей

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

$r = mysql_query('SELECT id AS number, name AS surname FROM people');

for ($data=array(); $row=mysql_fetch_assoc($r); $data[]=$row);

Теперь в $data окажется список ассоциативных массивов, соответствующих строкам в результате $r, однако, ключи этих массивов будут равны number и surname, а не id и name. Произошло переименование.

Передвижение по результирующему набору

В примере выше мы производили считывание результирующего набора данных с самого начала и до конца. Иногда бывает нужно пропустить несколько первых строк и начать с середины result-set.

int mysql_data_seek (int $result, int $row_number)

Эта функция устанавливает указатель текущей строки в результирующем наборе Sresult в позицию $row_number, так что следующий вызов mysql_fetch_assoc() вернет значения ячеек именно этой строки. Возвращает false в случае ошибки или если строки кончились.

LIMIT: ограничение выборки средствами SQL

В конце команды SELECT можно указать еще один необязательный модификатор, который позволяет поместить в результирующий набор данных не все строки из таблицы, удовлетворяющие WHERE-запросу, а только некоторые из них. Например:

SELECT * FROM people WHERE name!='' LIMIT 2, 10

Данная команда поместит в result-set не все записи с непустым именем, а только 10, начиная с третьей (нумерация начинается с 0, поэтому 2 означает "пропустить первые 2 записи").

Общий вид запроса

SELECT * FROM people WHERE name!='' LIMIT смещение, количество

Если смещение равно 0, а нужно только ограничить число записей:

SELECT * FROM people WHERE name! ='' LIMIT количество

Выборка строки в виде списка

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

list mysql_fetch_row(int $result)

Функция mysql_fetch_row() возвращает очередную строку результата в виде списка, где каждой ячейке соответствует элемент массива с числовым индексом. Может возникнуть вопрос: зачем вообще нужны числовые индексы, когда можно использовать обращение по именам ячеек (mysql_fetch_assoc()) и SQL-конструкцию AS. Иногда в результате выборки могут присутствовать ячейки (фактически, колонки) с одинаковыми именами, но, соответственно, с различными индексами. Это происходит тогда, когда выборка в SELECT производится одновременно из нескольких таблиц . В простейших приложениях такое случается нечасто.

int mysql_num_rows (int $ result)

Функция mysql_num_rows() возвращает число строк в результате запроса. Таким образом, она позволяет определить вертикальный размер "двумерного массива результата".

Получение отдельной ячейки результата

mixed mysql_result(int $result, int $row, mixed $field)

Функция возвращает значение поля $field в строке результата с номером $row. Аргумент field может быть порядковым номером поля в результате, именем поля или именем поля с именем таблицы через точку tablename.fieldname. Если для имени поля в запросе применялся алиас ('SELECT foo AS bar FROM...'), используйте его вместо реального имени поля. При задании порядкового номера поля, нумерация начинается с нуля.

$conn=mysql_connect("localhost","","");

$database = "book";

mysql_select_db($database);

$sql = "SELECT * FROM People"; // создаем SQL запрос

$q = mysql_query($sql,$conn)

or die(); // отправляем запрос на сервер

$n = mysql_num_rows($q); // получаем число строк результата

//отображаем значения полей

for($i=0;$i<$n; $i++){ // перебираем все строки в результате запроса на выборку

foreach ($names as $val) { // перебираем все имена полей

$value = mysql_result($q,$i,$val); // получаем значение поля

echo "<br>$value"; // выводим значение поля

} }

Функция mysql_result() универсальна с ее помощью можно "обойти" весь результат по одной ячейке. Однако mysql_result() работает довольно медленно.

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

$r = mysql_query('SELECT COUNT(*) FROM people');

echo "Число строк в таблице: ".mysql_result($r, 0, 0);

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

array mysql_fetch_array ( resource result [, int result_type])

Второй опциональный аргумент result_type в функции mysql_fetch_array() является константой и может принимать следующие значения: MYSQL_ASSOC, MYSQL_NUM и MYSQL_BOTH. Значением по умолчанию является: MYSQL_BOTH.

Используя MYSQL_BOTH, получим массив, состоящий как из ассоциативных индексов, так и из численных. MYSQL_ASSOC вернет только ассоциативные соответствия, а MYSQL_NUM - только численные. ВНИМАНИЕ: имена полей, возвращаемые этой функцией зависят от регистра.

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

// с помощью mysql_fetch_array():

<?

/* ... начало то же, что и в предыдущем примере */

// отображаем значения полей

// получаем значение поля в виде ассоциативного массива

while($row = mysql_fetch_array($q, MYSQL_ASSOC)) {

echo "<tr>";

foreach ($names as $val){

echo "<br>$row[$val] ";

// выводим значение поля

}

}

?>

Задание

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

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

Электронная почта

Отправка почты осуществляется с помощью стандартной функции mail().

bool mail(string to, string subject, string body [,string extra_headers] [,string extra_parameters])

Эта функция принимает следующие аргументы:

  • to — адрес электронной почты получателя;

  • subject —- тема сообщения:

  • body — текст сообщения;

  • extra_headers— дополнительные заголовки, которые можно задать в сообщении;

  • extra_parameters— дополнительные параметры, которые можно задать в сообщении.

Поля subject и body для темы сообщения и его тела могут быть пустыми строками. Функция возвращает true, если письмо отправлено на адрес получателя, иначе false.

// Простой пример использования функции mall ()

<?php

mail("test@mail.ru", "Привет!", 1строка\n2строка\nЗстрока")

?>

В этом примере на адрес test@mail.ru будет отправлено сообщение с темой "Привет!" и текстом:

1строка

2строка

3строка

Для совместимости с ОС Windows каждую строку в почтовых сообщениях необходимо заканчивать символом \r\n.

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

<?php

mail("test@mail.ru ", "Привет!", $msg, "From': admin <admin@mail.ru>")

?>

E-mail можно указывать в угловых скобках, при этом текст, предшествующий им, будет использован в качестве имени отправителя. Если требуется указать несколько дополнительных полей, они разделяются символом \r\n .

// Пример использования функции mail () с дополнительным заголовком

<?php

Smsg = "Содержимое письма";

mail("test@mail.ru", "Привет!", $msg,

"From: admin@{$_SERVER['SERVER_NAME']}\r\n".

"Reply-To: admin@($_SERVER['SERVER_NAME']}\r\n".

"X-Mailer: PHP/".phpversion());

?>

В этом примере в поля From и Reply-To подставляется адрес вида admin@ имясервера. При этом имя сервера возвращается из суперглобального массива $_SERVER. В пользовательском поле X‑Mailer в качестве программы отправителя указывается РНР той версии, которая установлена на сервере. Версия РНР возвращается с помощью функции pbpversion().

Функция mail () будет работать только в том случае, если в системе, где выполняется скрипт с ее использованием, установлен почтовый транспортный агент (МТА). Если у вас на компьютере нет какого-либо запущенного МТА, либо удаленного SMTP-сервера, предоставляющего доступ к вашей машине, то функция mail () работать не будет. В состав практически любого дистрибутива UNIX входит транспортный агент sendmail, выполняющий его функции, в то время как в операционной системе Windows для этого требуются установки стороннего транспортного агента (МТА).

Собственная функция mail()

Отправить сообщение с локальной машины можно, не прибегая к функции mail (). Для этого необходимо разработать приложение SMTP-клиента, которое будет соединяться с удаленным SMTP-сервером. В РНР отсутствуют функции для работы с SMTP-серверами, поэтому далее рассмотрим разработку собственной функции для работы с удаленным SMTP-сервером.

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

// Отправка сообщения через удаленный SMTP-сервер

<?php

// Функция отправки сообщения: открывает сокет, ведет диалог с сервером,

// записывает данные, закрывает сокет

function send($server, $to, $from, $subject="",$msg, $headers="")

{

// Формируем поля заголовка

$headers="To: $to\nFrom: $frcro\nSubject: $subject\nX-Mailer: MyMailer\n$headers";

// Соединяемся с сервером по порту 25,

// при этом переменная $fp содержит дескриптор соединения

$fp = fsockopen($server, 25, &$errno, &$errstr, 30);

if (!$fp)

die("Server $server. Connection failed: $errno, $errstr");

// Если соединение прошло успешно, производим запись данных в сокет,

// т. е. открываем наш SMTP-сеанс с удаленным сервером $server

fputs($fp,"HELO $server\n"); // Здороваемся с сервером

// Посылаем поле from

fputs($fp,"MAIL FROM: $from\n");

// Посылаем поле То

fputs($fp,"RCPT TO: $to\n");

// Посылаем поле Data

fputs($fp,"DATA\n");

// Посылаем сообщение, которое содержится в переменной $msg

fputs ($fp, "$msg\r\n" . ". " . "\r\n") ;

// Завершаем SMTP-сеанс

fputs($fp,"\n.\nQUIT\n");

// Завершаем соединение

fclose($fp);

}

// Отправка сообщения

send('mx2.yandex.ru', // Почтовый ретранслятор, к примеру, сервера yandex

'mail@yandex.ru', // Кому

'mail@softtime.ru', // От кого

'Hello!', // Тема

'Привет!'); // Сообщение

?>

В начале функции происходит соединение с почтовым ретранслятором удаленного SMTP-сервера по 25-му порту с помощью функции fsockopen. Затем серверу отправляются SMTP-команды. Текст сообщения должен заканчиваться строчкой на отдельной странице, поэтому точка обязательно должна присутствовать в строке отправки текста сообщения:

fputs($fp, "$msg\r\n.\r\n");

Узнать, какое имя имеют почтовые ретрансляторы конкретного SMTP- сервера, можно при помощи функция getmxrr().

string getmxrr(string hostname, array mxhost, [, array weight])

Эта функция принимает в качестве аргумента имя хоста hostname в данном домене и заполняет массив mxhost списком почтовых ретрансляторов этого домена. Если указан третий необязательный аргумент weight, то функция заполняет его значениями предпочтения, которые возвращает ей почтовый ретранслятор.

// Получение списка почтовых ретрансляторов для Windows

<?php

function win_getmxrr($hostname, &$mxhosts, &$mxweight=false) {

if (strtoupper(substr(PHP_OS, 0, 3)) != 'WIN') return;

if (!is_array ($mxhosts) ) $mxhosts = array();

if (empty($hostname)) return;

$exec='nslookup -type=MX '.escapeshellarg($hostname);

@exec($exec, $output);

if (empty($output)) return;

$i=-1;

foreach ($output as $line) {

$i++;

if(preg_match("/^$hostname\tMX preference = ([0-9]+), mail exchanger = (.+)$/i", $line, $parts))

{

$mxweight[$i] = trim($parts[1]);

$mxhosts[$i] = trim($parts[2]);

}

if (preg_match('/responsible mail addr = (.+)$/i', $line, $parts)) {

$mxweight[$i] = $i;

$mxhosts[$i] = trim($parts[1]);

}

}

return ($i!=-1);

}

if (!function_exists('getmxrr')) {

function getmxrr($hostname, &$mxhosts, &$mxweight=false) {

return win_getmxrr($hostname, $mxhosts, $mxweight);

}

}

/* example */

$domain='ukr.net';

echo "<pre>";

getmxrr($domain,$mxhosts,$mxweight);

print_r($mxhosts);

print_r($mxweight);

?>

Отправка сообщений с присоединенными к ним вложениями.

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

Спецификация MIME (Multipurpose Internet Mail Extensions, многоцелевые расширения почты Интернета) описана в RFC 2045-2049. Спецификация MIME позволяет расширить возможности обычной электронной почты для решения следующих задач:

  • пересылки восьмибитовых текстов и восьмибитовых символов в заголовке сообщения;

  • пересылки двоичных данных любого типа (графики, аудио, видео и т. д.);

  • поддержки сложных типов сообщений (к примеру, сообщений, содержащих данные различных типов).

// Отправка сообщений с вложениями

<?php

// Текст сообщения

$msg = "Привет!";

// Путь к файлу. В данном случае предполагается, что файл

// расположен в том же каталоге, что и скрипт

$path = "t.doc";

// Читаем файл

$fp = fopen($path,"r");

if (!$fp)

{

print "Файл $path не может быть прочитан";

return;

}

$file - fread($fp, filesize($path));

fclose($fp);

$boundary = "--".md5(uniqid(time()) ; // Генерируем разделитель

$headers .= "MIME-Version: 1.0\n";

$headers .="Content-Type: multipart/mixed; boundary=\"$boundary\"\n";

$multipart .= "--$boundary\n";

$kod='koi8-r'; // Указываем кодировку

$multipart .= "Content-Type: text/html; charset=$kod\n";

$multipart .= "Content-Transfer-Encoding: Quot-Printed\n\n";

$multipart .= "$msg\n\n";

Smessage_part = "";

$message_part .= "Content-Type: application/octet-stream";

$message_part .= "; file_name = \"$path\"\n";

$message_part .= "Content-Transfer-Encoding: base64\n";

$message_part .= "Content-Disposition: attachment; filename = \"".$path."\"\n\n";

$message_part .= chunk_split(base64_encode($file))."\n";

$multipart .= "--$boundary\n".$message_part."--boundary--\n";

// Отправляем сообщение

if(mail("ttt@mail.ru", "Привет", $multipart, $headers))

{

echo "Письмо успешно отправлено";

}

?>

Задание

  1. Добавить в задание из лекции №9 поля для ввода электронного адреса и по нажатию на кнопку «Зарегистрироваться» подтверждение регистрации высылается на введенный почтовый адрес.

  2. При отправке подтверждения регистрации, также отправлять вложенным файлом правила поведения на форуме.

XML (Extensible Markup Language) – это расширяемый язык разметки, являющийся подмножеством языка SGML.

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

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

Взаимодействие PHP и XML

В PHP существует два модуля, реализующие два разных стандарта обработки XML-данных: SAX (Simple API for XML) и DOM (Document Object Model).

Стандарт SAX описывает метод обработки XML-документов для получения из них данных. Создавать и изменять XML-документы с его помощью невозможно.

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

Другим стандартом для обработки XML-данных является DOM. В отличие от SAX, этот метод позволяет производить любые операции с XML-данными, представляя XML-документ как дерево объектов. Модуль, реализующий этот стандарт, называется DOM XML. Он не входит в основной набор модулей PHP, но может быть установлен как расширение. Модуль DOM XML является мощным и удобным в использовании средством обработки XML-документов.

Установка расширения DOM XML

Для установки расширение DOM XML, необходимо сделать следующее.

  1. В файле настроек PHP (php.ini) раскомментировать строку, относящуюся к этому расширению (extension=php_domxml.dll для Windows).

  2. Скопировать файл расширения (php_domxml.dll или php_domxml.so) в папку, где находятся расширения (extension_dir).

  3. Подключить расширение iconv (для преобразования русскоязычного текста) так же, как в пунктах выше.

  4. Скопировать дополнительные библиотеки в системную папку system32 (WindowsNT/2000/XP). В первую очередь это библиотеки libxml2 и iconv, затем libxslt, libexslt и zlib.

  5. Перезапустить сервер.

Следует проверить, правильно ли установлена переменная extension_dir в файле настройки php.ini. Если она не указывает на директорию, где находятся библиотеки расширений PHP, то ни одно из расширений подключить не удастся.

Чтобы проверить, установилось ли расширение, можно создать простейший скрипт, который будет выводить все настройки PHP-интерпретатора (это делает функция phpinfo() ).

<?

// выводит информацию о настройках PHP

phpinfo();

// отображает используемую версию библиотеки libxml

echo domxml_version();

?>

Взаимодействие PHP и XML посредством DOM XML

DOM XML определяет в PHP несколько классов, таких как DomNode, DomDocument, DomElement, DomText и DomAttribute, большинство из которых идут из ядра стандарта DOM. Для всех перечисленных выше классов класс DomNode является родительским, поэтому его свойства и методы наследуются всеми остальными классами.

Если рассмотреть произвольный XML-документ, то классу DomDocument будет соответствовать сам этот документ, классу DomElement – каждый XML-тег, классу DomAttribute – атрибуты тегов, а классу DomText – содержание XML-элементов. В то же время классу DomNode будет соответствовать каждый из перечисленных элементов XML-документа.

Рассмотрим пример описания списка студентов. Каждый студент описан с помощью таких характеристик, как фамилия, имя, дата рождения и электронный адрес. Структура XML документа, хранящего список студентов, будет следующая:

//student.xml

<?xml version="1.0"?>

<list>

<student id="10">

<name>

<first>Petr</first>

<last>Petrov</last>

</name>

<birth>

<day>23</day>

<month>12</month>

<year>89</year>

</birth>

<email> petr@ngs.ru </email>

</ student >

< student id="20">

<name>

<first>Ivan</first>

<last>Ivanov</last>

</name>

<birth>

<day>03</day>

<month>05</month>

<year>90</year>

</birth>

<email> ivan@ngs.ru </email>

</ student >

</list>

Рассмотрим возможности читать, добавлять, изменять и искать информацию, находящуюся в XML-файлах.

Сначала необходимо перевести имеющиеся данные в объекты и классы DOM. Это можно сделать с помощью функции domxml_open_mem и domxml_open_file.

object domxml_open_mem (string str)

В качестве параметра эта функция принимает строку str, содержащую XML-документ. Результатом ее работы является объект класса, называемого DOMDocument.

object domxml_open_file (string filename)

Эта функция обрабатывает XML-файл, имя которого задается параметром filename, и переводит его в объект класса DOMDocument. Доступ к файлу производится только на чтение.

Функции domxml_open_mem() и domxml_open_file() нужно вызывать перед вызовом любых других функций, связанных с расширением DOM.

Эти функции преобразуют XML-файл в дерево объектов. К этим объектам можно обращаться с помощью различных методов. Для выделения корневого элемента используется метод DomDocument->document_element().

Для создания нового пустого XML-документа используют функция domxml_new_doc(string version), которая создает новый пустой XML-документ. Ее параметром является номер версии создаваемого документа.

<?

//считываем файл " student.xml " в строку

$xmlstr = join('',file(' student.xml.xml'));

// переводим строку с xml-файлом в дерево объектов.

if(!$dom = domxml_open_mem($xmlstr)) {

//Если операция прошла неудачно, то выводим ошибку и прекращаем работу.

echo "Ошибка при разборе документа\n";

exit;

}

print_r($dom);

echo "<hr>";

// выделяем корневой элемент дерева объектов.

// В нашем случае это будет элемент <list>

$root = $dom->document_element();

print_r($root);

echo "<hr>";

?>

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

Обход дерева объектов

Для получения значения текущего узла используют метод DomNode->node_value() или DomNode->get_content() для получения содержимого узла.

Для получения значения атрибута используется метод DomElement‑>get_attribute(attr_name). А метод DomNode->child_nodes() возвращает массив потомков данного узла.

Для различия объектов по типам, т.е. определения, является ли узел элементом (тегом), текстом, атрибутом и т.п., используют специальные константы. XML_ELEMENT_NODE определяет, является ли узел элементом, XML_ATTRIBUTE_NODE определяет, является ли узел атрибутом, и XML_TEXT_NODE определяет, является ли узел фрагментом текста. Эти константы имеют целочисленные значения 1, 2 и 3 соответственно.

// Обход дерева XML

<?

$xmlstr = join('',file(student.xml'));

if(!$dom = domxml_open_mem($xmlstr)) {

echo "Ошибка при разборе документа\n";

exit;

}

$root = $dom->document_element();

// Получаем массив потомков родительского узла

// (в нашем случае это массив <student>)

$nodes = $root->child_nodes();

print_r($nodes);

echo "<hr>";

// Начинаем обработку каждого узла в массиве

foreach($nodes as $node){

if ($node->tagname==' student '){

// Создаем массив, куда будем собирать информацию

// о рассматриваемом студенте

$currentStud = array();

// Получаем id студента,

$ currentStud ['id'] = $node->get_attribute('id');

// Получаем всю информацию о студенте

// (<name>,<birth> и т.д.)

$student_info = $node->child_nodes();

// Перебираем все дочерние узлы $node

foreach ($student _info as $info){

// проверяем, является ли узел

// элементом (xml-тегом)

if ($info->type==

XML_ELEMENT_NODE) {

$currentStud[$info->tagname] =

$info->get_content();

}

}

// выводим на экран полученные массивы

print_r ($currentStud);

echo "<br>";

}

}

?>

Поиск информации в XML-файле.

//поиска электронного адреса Ивана Иванова.

$str = $currentStud["email"];

if ($currentStud["name"] =="Ivan" )

echo "Здравствуйте, Ivan! " .

"Ваш e-mail $str";

Добавление новых элементов в XML-документ

Вначале скопируем описание студента с помощью метода DomNode->clone_node(). Таким образом клонируется элемент <student> и все его внутренние элементы, при этом содержание тегов не копируется.

Далее необходимо установить какие-нибудь значения для элементов описания студента. В конце нужно записать полученное описание студента в качестве потомка корневого элемента в дерево DOM с помощью метода DomNode->append_child(new_node), где в качестве параметра передается созданный объект (новый узел).

Для удаления узла можно воспользоваться методом DomNode->unlink_node(), применив его к узлу, который требуется удалить..

// который содержит описание студента

$elements = $dom->get_elements_by_tagname("student");

$element = $elements[0];

//вычисляем родителя и потомков

$parent = $element->parent_node();

$children = $element->child_nodes();

// клонируем элемент student

$student = $element->clone_node();

// устанавливаем идентификатор

$attr = $student->set_attribute("id", "30");

foreach ($children as $child){

$node = $child->clone_node();

$grand_children = $child->child_nodes();

if (count($grand_children)<>1){

foreach($grand_children as $grand_child){

$lastnode = $grand_child->clone_node();

if ($grand_child->tagname=="first")

$cont = $lastnode->set_content("Nina");

if ($grand_child->tagname=="last")

$cont = $lastnode->set_content("Saveljeva");

if ($grand_child->tagname=="day")

$cont = $lastnode->set_content("7");

if ($grand_child->tagname=="month")

$cont = $lastnode->set_content("06");

if ($grand_child->tagname=="year")

$cont = $lastnode->set_content("1981");

$newlastnode = $node->append_child($lastnode);

}

}

if ($child->tagname=="email") {

$cont = $node->set_content("help@intuit.ru");

}

$newnode2 = $student->append_child($node);

}

$newnode = $parent->append_child($student);

echo "<PRE>";

$xmlfile = $dom->dump_mem(true);

echo htmlentities($xmlfile);

echo "</PRE>";

// запишем полученный XML-файл в файл "test.xml"

$h = fopen("test.xml","a");

if (!fwrite($h, $xmlfile)) {

print "Cannot write " . "to file ($filename)";

exit;

}

}

Задание.

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

  1. Укажите корректные типы данных в PHP 5.

money

varchar

char

float

complex

  1. Дан фрагмент php кода:

$m = 9;

$n = 99;

$z = 8;

$z = $n++ / $m++ + --$z;

eсhо $z;

Каким будет результат его выполнения?

18

16

20

19

17

  1. Что будет напечатано в результате выполнения следующего кода:

eсho (іnt) '1 марта 2009 г';

Варианты:

12009

1

0

Возникнет ошибка выполнения скрипта

  1. Что будет выведено после выполнения следующего фрагмента кода:

$орerаtiоn = "+";

$а = 66;

$b = 13;

switсh ($oрerаtiоn) {

dеfault : $с = 0;

сase "+": $с = $a + $b;

сase "-": $c = $а - $b;

}

есhо $c;

Варианты:

0

Возникнет ошибка выполнения сценария

53

79

null

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

function ModifyReport($Rptfile){}

function ModifyReport(&Rptfile){}

function ModifyReport(&$Rptfile){}

function ModifyReport(ByRef $Rptfile){}

  1. Что верно для final и abstract?

Абстрактный класс не может иметь не абстрактные методы

final класс не может иметь final методов

final класс не может иметь абстрактных методов

Абстрактный класс не может иметь final методов

  1. Какой результат выполнения скрипта?

funсtiоn shоw() {

SТAТІС $сount = 0;

rеturn ++$count;

}

prіnt show();

print shоw();

prіnt shоw();

Варианты:

000

111

123

012

Ничего не выведет

  1. Какой результат выполнения данного кода?

<?phр

functiоn bуRef(&$book)

{

$book++;

}

$magazin = 5;

$book = 5;

byRеf($magazin);

еchо "У меня есть $book книг и $magazin журналов";

?>

Варианты:

У меня есть 6 книг и 5 журналов

У меня есть 6 книг и 6 журналов

У меня есть 5 книг и 5 журналов

У меня есть 5 книг и 6 журналов

  1. Какой новый оператор в PHP5 определяет является ли объект экземпляром класса, потомком класса или реализующим интерфейс:

Варианты:

object

instanceof

extends

implements

  1. Какая из ниже перечисленных функций читает файл, удаляя из него HTML- и PHP-теги?

fgetss()

fgets()

file()

fread()

fgetc()

  1. В каком порядке будут располагаться ключи в массиве $a после выполнения следующего кода?

$а = аrray();

$а[1] = $а[] = $а[2] = truе;

Варианты:

1, 2 (перезапись [2])

1, 0, 2

2, 3, 1

2, 0, 1

Ошибка синтаксиса: нельзя считывать из $a[]

  1. Какой результат выполнения следующего кода?

<?рhр

іf (-1) prіnt "Тrue";

еlsе рrіnt "Fаlsе";

?>

Варианты:

True

False

Возникнет ошибка

  1. Какой результат выполнения следующего кода?

<?php

functіоn

vec_add (&$a, $b)

{

$a['х'] += $b['х'];

$a['y'] += $b['у'];

$a['z'] += $b['z'];

}

$а = arrау ('x' => 3, 'y' => 2, 'z' => 5);

$b = аrraу ('х' => 9, 'у' => 3, 'z' => -7);

veс_add (&$а, $b);

рrint_r ($a);

?>

Варианты:

Array

(

[x] => 9

[y] => 3

[z] => -7

)

Array

(

[x] => 3

[y] => 2

[z] => 5

)

Array

(

[x] => 12

[y] => 5

[z] => -2

)

Ошибка

Ничего из вышеперечисленного

  1. Какое из утверждений является не верным относительно интерфейсов?

Класс может реализовывать несколько интерфейсов

Абстрактный класс может реализовывать несколько интерфейсов

Интерфейс может расширять несколько интерфейсов

Методы с одинаковыми именами и аргументами могут существовать в нескольких интерфейсах, которые реализует данный класс

  1. Что возвращает функция mail()?

Возвращает true/false в зависимости от того, было ли письмо отправлено на адрес получателя

Возвращает true/false в зависимости от того, было ли письмо доставлено получателю

Возвращает true/false в зависимости от того, было ли письмо поставлено в очередь на отправку

Возвращает true/false в зависимости от того, было ли письмо прочтено получателем

Ничего не возвращает

  1. Укажите порядок следования параметров в функции mail().

адрес получателя, тема, хедеры, тело

тема, адрес получателя, тело, хедеры

тема, адрес получателя, хедеры, тело

адрес получателя, тема, тело, хедеры

  1. Что выведется в результате выполнения следующего кода?

$a = аrraу(1.99 => 'b', .1 => 'с');

print_r($а);

Варианты:

Ничего

Array ( [1] => b [0] => c )

$a

Сообщение об ошибке

  1. Укажите все не верные утверждения относительно абстрактных классов в php5?

Абстрактные классы введены начиная с php5

Класс хотя бы с одним абстрактным методом должен быть объявлен как абстрактный

Абстрактный класс может содержать не абстрактные методы

Определение абстрактного метода может содержать тело метода

  1. Какое значение будет выведено на экран при выполнении следующего кода:

<?рhp

class fоo {

рrivаtе $value = 42;

рublіс function &gеtVаlue() {

return $this->value;

}

рubliс functiоn еchoVаluе(){

eсhо $this->vаluе;

}

}

$obj = new fоо;

$mуVаluе = $obj->getValue();

$myValuе = 33;

$оbj->еchоVаlue();

?>

Варианты:

Сообщение об ошибке

33

42

0

  1. Заданы классы: Какие из реализаций метода getName() не валидны в классе ChildCls?

abstract class BaseCls{

protected abstract function getName();

}

class ChildCls extends BaseCls{

}

Варианты:

protected function getName(){}

function getName(){}

private function getName(){}

public function getName(){}

129

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]