Введение в программирование на PHP5

         

Оператор If


При создании кода часто требуется выполнять различные действия на основе некоторого выбора. В PHP это можно делать с помощью условных операторов – оператора if, оператора if … else и оператора elseif.

if – этот оператор используется для выполнения блока кода, когда выполняется условие (true).

if...else – этот оператор используется для выполнения блока кода, когда условие выполняется (true), или для выполнения другого блока кода, когда условие не выполняется (false).

elseif – комбинация if и else. Оператор расширяет оператор if, чтобы выполнялся другой оператор в случае, если исходное выражение if оценивается как FALSE. В отличие от else он будет выполнять альтернативное выражение, только если условное выражение elseif оценивается как TRUE.

В том случае, когда необходимо выполнить блок кода, если выполняется некоторое условие (true), можно использовать оператор if.

Ниже представлен синтаксис оператора if:

if (условие) { выполняемый код }

Строки кода оператора if заключаются в фигурные скобки ({}). Эти скобки определяют начало (открывающая скобка {) и конец (закрывающая скобка }) оператора If. Следующий пример демонстрирует использование оператора if.

<?php

$number = 5;

if ($number <= 10) { echo "Число меньше или равно 10."; } ?>

Число меньше или равно 10.

В приведенном выше примере число 5 присваивается переменной $number. Затем сценарий PHP использует оператор сравнения "<=" (меньше или равно) для сравнения значения $number с числом 10. Если значение меньше или равно 10, оператор echo выводит сообщение " Число меньше или равно 10" в окне браузера. Можно видеть, что скобки применяются для ограничения блока оператора if. Открывающая скобка { появляется сразу после оператора условия, а закрывающая скобка } — в конце оператора if.

Вспомните, что все операторы PHP должны завершаться с помощью терминатора инструкции (;): echo "Число меньше или равно 10.";

В некоторых случаях может понадобиться предоставить альтернативное сообщение. В приведенном выше примере предположим, что переменная $number содержит число 15, которое больше 10. Альтернативное сообщение должно выводиться, чтобы пользователь знал: число больше 10. Это можно выполнить с помощью оператора if … else.


<?php

$number = 15;

if ($number <= 10) { echo "Число меньше или равно 10."; }

else { echo "Число больше 10"; } ?>

Число больше 10.

В приведенном выше примере число 15 присваивается переменной $number. Затем сценарий PHP использует оператор сравнения "<=" (меньше или равно) для сравнения значения $number с числом 10. Если это значение меньше или равно 10, оператор echo выводит сообщение "Число меньше или равно 10" в окне браузера. Теперь в код добавлен оператор else, чтобы выводить альтернативное сообщение, если условие в операторе if не выполняется. Альтернативное сообщение "Число больше 10" выводится в окне браузера, если оператор условия возвращает false. Здесь также используются скобки для ограничения блока оператора if. Открывающая скобка { появляется сразу после оператора условия, а закрывающая скобка } — в конце оператора if. Скобки также используются для ограничения альтернативного блока оператора else.

Третий тип условного оператора является структурой elseif. Оператор elseif является комбинацией if и else. Подобно else он расширяет оператор if, чтобы выполнить другой оператор, если условное выражение исходного if оценивается как FALSE. Однако в отличие от else он будет выполнять это альтернативное выражение, только если условное выражение в elseif оценивается как TRUE. В одном операторе if может быть несколько структур elseif. Первое выражение elseif (если такое имеется), которое оценивается как TRUE, будет выполнено.

<?php

$number = 15;

if ($number < 10) { echo "Число меньше 10."; } elseif ($number == 10) { echo "Число равно 10."; }

else { echo "Число больше 10."; } ?>

Число больше 10.

В этом примере числовое значение переменной $number сравнивается с 10. Сперва оператор if проверяет, что $number меньше 10. Если этот оператор выполняется (true), выводится сообщение "Число меньше 10". Затем оператор elseif используется для проверки, что $number равно 10. Если этот оператор оценивается как true, выводится сообщение "Число равно 10". Оператор elseif выполняется, ТОЛЬКО если оператор if возвращает FALSE. Наконец, если операторы if и elseif возвращают FALSE, выполняется оператор else и выводится сообщение "Число больше 10". В то время как оператор if позволяет проверить только одно условие, структуру if можно применять для проверки множества условий.

Следующий пример использует функцию checkdate() (раздел 3-6), функцию explode() (раздел 3-2) и оператор if … else для проверки правильности строки даты.

<?php

$orig_date = "09/19/2005"; $date = explode("/", "$orig_date");

$month = $date[0]; $day = $date[1]; $year = $date[2];

$result = checkdate($month, $day, $year);

if ($result == true) { echo "Правильная дата"; } else { echo "Неправильная дата!"; } ?>

Правильная дата

Операторы if можно использовать "в одиночку" либо как часть оператора if...else или if...elseif...else. В любом случае вы обнаружите, что эта структура будет важным элементом в любой программе.


Оператор switch


В дополнение к операторам if, рассмотренным в предыдущем разделе, PHP включает четвертый тип условного оператора, называемый оператором switch. Оператор switch очень похож или является альтернативой для команд if...else if...else. Оператор switch проверяет условие. Результат этой проверки определяет, какой case выполняется. switch используется обычно, когда ищут точный (равенство) результат, вместо условия больше или меньше. При проверке диапазона значений должен применяться оператор if.

switch – используйте этот оператор для выбора одного из нескольких блоков кода для выполнения.

Ниже представлен синтаксис оператора switch.

<?php

switch (выражение) {

case "значение1": код, который будет выполнен, если выражение = значение1; break;

case "значение2": код, который будет выполнен, если выражение = значение2; break;

default: код, который будет выполнен, если выражение не равно ни значение1, ни значение2; } ?>

Подобно оператору if строки кода в операторе switch заключаются в фигурные скобки.

Эти скобки определяют начало и конец оператора switch. Следующий пример демонстрирует использование оператора switch.

<?php

$number = 25;

switch ($number) {

case 40: echo "Значение \$number равно 40"; break; case 25: echo "Значение \$number равно 25"; break; default: echo "Значение \$number отлично от 25 и 40";

} ?>

Оператор switch может включать множество операторов case. В предыдущем примере показаны два оператора case. Создается переменная $number, которой присваивается значение 25. Оператор switch используется для сравнения значения $number с другими значениями. Проверяемое (сравниваемое) выражение (в данном случае $number) помещается внутри скобок сразу после оператора switch. Затем вызывается последовательность операторов case для сравнения выражения с другими значениями. Эти значения помещаются сразу после оператора case. (Примечание: если проверяемые значения являются строками, они должны заключаться в кавычки.) За значением, которое сравнивается с выражением, следует двоеточие (:). Операторы case аналогичны конструкциям if и elseif. Если значение оператора case будет true, то выполняется код, связанный с этим оператором, и оператор break. Оператор break приводит к завершению оператора switch. Остальные операторы case проверяться не будут. В конце оператор switch содержит инструкцию default. Она аналогична оператору else. Если ни один из операторов case не будет выполнен (не будет иметь значение TRUE), выполняется оператор default. Здесь одновременно происходит несколько вещей:

проверяется условие switch и находится значение ($number == 25); значение условия передается по очереди операторам case; если это значение совпадает со значением case, выполняется код этого блока. Оператор break приводит к завершению оператора switch. Остальные операторы case не проверяются; если проверяемое значение не совпадает ни с одним из значений case, выполняется раздел default; в приведенном выше примере, так как выражение "значение $number" равно 25, выполняется второй оператор case, и в окне браузера выводится текст "Значение $number равно 25".



Цикл for


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

Базовый синтаксис цикла for показан ниже.

for (инициализация; условие; шаг цикла) { выполняемый код; }

Оператор цикла for имеет три параметра. Первый параметр используется для инициализации переменных, второй содержит условие, а третий включает в себя приращения, требуемые для реализации цикла. Блок кода, связанный с оператором for, всегда заключается в фигурные скобки ({}).

Следующий пример демонстрирует цикл for для 4-кратного вывода сообщения "Добро пожаловать в мир PHP":

<?php for ($counter=1; $counter < 5; $counter++) { echo "Добро пожаловать в мир PHP!"; } ?>

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

Переменная $counter инициализируется значением 1. $counter < 5 определяет условие, которое должно выполняться для выполнения цикла. $counter++ увеличивает значение переменной $counter при каждом выполнении цикла.

Ниже показан вывод, созданный этим примером цикла.

Добро пожаловать в мир PHP! Добро пожаловать в мир PHP! Добро пожаловать в мир PHP! Добро пожаловать в мир PHP!

При первом выполнении переменная $counter инициализируется значением 1. Так как 1 меньше 5, $counter увеличивается на 2. Затем используется оператор echo для вывода строки "Добро пожаловать в мир PHP!". К выводу присоединяется <br/>, чтобы создавать возврат каретки при каждом выполнении цикла. Во время второй итерации значение $counter будет равно 2. Так как 2 меньше 5, то оператор echo снова выводит строку "Добро пожаловать в мир PHP!". Этот процесс продолжается при значениях $counter, равных 3 и 4. Когда $counter становится равным 5, условие больше не выполняется, и цикл for заканчивается.

Циклы for используются также в качестве удобного способа выполнения итераций по значениям массива. Вспомните, что массивы состоят из элементов и индексов. Каждый элемент имеет связанный с ним индекс. Первый индекс массива с числовыми индексами равен 0. До сих пор при выводе элементов массива требовалось выводить каждый элемент отдельно. Для больших массивов это может потребовать много времени и оказаться громоздким. Циклы for решают эту проблему. В следующем примере создается массив с 5 элементами. Затем применяется цикл for для вывода всех значений массива.


<?php

//Создается новый массив, содержащий 5 значений цвета $colors = array('red', 'green', 'blue', 'yellow','white');

// Цикл for используется для итераций по массиву и вывода каждого элемента

for ($i = 0; $i < sizeof($colors); $i++) { echo "Значением элемента массива $i+1 является $colors[$i]."; } ?>

Массив $colors содержит пять элементов — $colors[0] = "red", $colors[1] = "green", $colors[2] = "blue", $colors[3] = "yellow", и $colors[4] = "white". Создается массив for. Переменной счетчику $i сначала задается значение 0, что соответствует первому элементу массива. Затем задается условие, проверяющее, что значение счетчика $i меньше sizeof($colors) или общего числа элементов массива. Здесь мы знаем, что размер массива равен 5, однако в большинстве случаев размер массива во время выполнения неизвестен. Наконец, переменная счетчика увеличивается на 1 во время каждой итерации. На каждом шаге выполнения цикла выводится строка — "Значением элемента массива $i+1 является $colors[$i]". Значения $i+1 и $colors[$i] расширяются и создают при выводе литеральные значения. Цикл выполняется, пока счетчик не превысит число элементов или размер массива. Получаемый вывод показан ниже.

Значением элемента массива 1 является red. Значением элемента массива 2 является green. Значением элемента массива 3 является blue. Значением элемента массива 4 является yellow. Значением элемента массива 5 является white.

Циклы являются полезными конструкциям, которые активно используются при программировании.


Цикл foreach


Конструкция foreach является вариацией цикла for и применяется для итераций на массивах. Существуют две различные версии цикла foreach.

Базовый синтаксис обоих версий цикла foreach показан ниже.

foreach (array as $value) { оператор }

foreach (array as $key => $value) { оператор }

Первый тип цикла foreach используется для итераций по массиву, обозначенному как array. Во время каждой итерации цикла текущее значение массива присваивается переменной $value, и счетчик цикла увеличивается на единицу. Цикл продолжается, пока foreach не достигнет последнего элемента или верхней границы заданного массива. Во время каждой итерации значение переменной $value можно использовать любым способом, но исходное значение массива не изменяется. Чтобы изменить реальное значение массива, необходимо заменить символ "$" на символ "&". Любые изменения, сделанные в &value, будут присвоены элементу массива с текущим индексом.

Следующий пример демонстрирует, как цикл foreach применяется для итераций по значениям массива.

<?php

$my_array = array('red','green','blue');

echo "Различные цвета включают: ";

foreach($my_array as $value)

{

$colors .= $value . " ";

}

echo $colors;

?>

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

Различные цвета включают: red green blue

Вторая форма цикла обеспечивает такие же функции, что и первая, но дополнительно присваивает на каждом шаге итерации индекс текущего элемента массива или ключ переменной $key. В предыдущем примере массив $my_array содержит три элемента: $my_array[0] = "red", $my_array[1] = "green", и $my_array[2] = "blue". В то время как переменная $value содержит значения элементов массива red, green и blue, переменная $key содержит индексы элементов массива 0, 1, и 2.



Циклы do while


Оператор do...while повторяет циклически блок кода, пока определенное условие принимает значение true. Другими словами, оператор do…while будет выполнять блок кода, если и пока условие будет выполняться (т.е. оцениваться как true).

Цикл do...while аналогичен по своей природе циклу while, рассмотренному в предыдущем разделе. Ключевое различие состоит в том, что тело цикла do...while будет обязательно выполнено как минимум один раз. Это связано с тем, что оператор условия оценивается в конце оператора цикла после выполнения тела цикла.

Базовый синтаксис цикла do…while показан ниже.

do { выполняемый код; } while (условие);

Выполнение кода внутри цикла do…while будет повторяться, пока условие в конце цикла будет оцениваться как true. Блок кода, связанный с оператором do…while, всегда размещается внутри фигурных скобок.

Следующий пример демонстрирует цикл do…while, который продолжает выполняться, пока переменная $number будет больше или равна 2.

$number = 5; do { echo $number . "<br/>"; $number -= 1; { while ($number >= 2);

В приведенном выше примере переменная $number инициализируется значением 5. Цикл do…while выполняется до тех пор, пока справедливо условие ($number >=2) или $number больше или равно 2, выводя значение $number в окне браузера. В конце блока цикла значение $number уменьшается на 1.

Ниже показан вывод, создаваемый примером цикла:

5 4 3 2

Во время первого выполнения значение $number равно 5. Так как условие для выполнения цикла не проверяется, пока цикл не будет выполнен один раз, то выводится значение $number, равное 5. Затем значение $number уменьшается на 1, становясь равным 4. Так как 4 больше 2, снова выполняется цикл, и во время второй итерации используется оператор echo для вывода значения 4. В вывод добавляется <br/>, чтобы создать возврат каретки при каждом выполнении цикла. Этот процесс продолжается, пока значение $number равно 3 и 2. Когда $number становится равным 2, оператор echo выводит значение 2, и значение $number уменьшается затем до 1. Так как 1 не больше и не равно 2, то условие больше не выполняется, и цикл do…while заканчивается.



Циклы while


В программировании часто необходимо повторить один и тот же блок кода несколько раз. Это можно реализовать с помощью операторов цикла. Язык PHP содержит несколько типов операторов цикла. Данный раздел рассматривает цикл while.

Оператор while циклически повторяет блок кода, пока указанное условие имеет значение true. Другими словами, оператор while будет выполнять блок кода, если и пока условие будет истинным.

Базовый синтаксис цикла while показан ниже.

while (условие) { выполняемый код; }

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

Следующий пример демонстрирует цикл while , который будет выполняться, пока значение переменной $number будет больше или равно 2.

<?php $number = 5; while ($number >= 2) { echo $number . "<br/>"; $number -= 1; } ?>

В приведенном выше примере переменная $number получает начальное значение, равное 5. Цикл while выполняется, пока условие ($number >=2), или значение $number больше или равно 2, и печатает в окне браузера значение $number. В конце блока цикла значение $number уменьшается на 1.

Ниже показан вывод, создаваемый примером цикла.

5 4 3 2

При первом выполнении значение $number равно 5. Так как 5 больше 2, используется оператор echo для вывода значения 5. При выводе присоединяется <br/>, чтобы создавать возврат каретки при каждом выполнении цикла. Затем значение $number уменьшается на 1. Во время второй итерации значение $number равно 4. Так как 4 больше 2, то оператор echo выводит значение 4. Этот процесс продолжается, пока значение $number равно 3 и 2. Когда $number равно 2, оператор echo выводит значение 2, а значение $number затем уменьшается на 1. Так как 1 не больше и не равно 2, то условие больше не выполняется, и цикл while заканчивается.



Использование функций


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

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

function AddNumbers($num1,$num2) {

echo "Это пример функции PHP. Она вычисляет сумму двух чисел и возвращает результат вызывающей программе";

return $num1 + $num2;

}

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

<?php

function AddNumbers($num1,$num2)

{ return $num1 + $num2; } echo "Сумма 5 и 2 равна " . AddNumbers(5,2); ?>

Однако определенная в начале функция AddNumbers() вызывается только позже в программе. Вызов функции происходит в операторе echo. Выводится строка "Сумма 5 и 2 равна ". Имя функции соединяется со строкой вывода, вызывая тем самым функцию. Функции передается два параметра — 5 и 2. Они присваиваются параметрам функции $num1 и $num2. Параметры складываются, и вызывается оператор return, чтобы "вернуть" значение или сумму двух чисел в то место в блоке кода PHP, который первоначально вызвал функцию. Вывод результата показан ниже:

Сумма 5 и 2 равна 7

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



Включаемые файлы


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

Включаемые файлы могут содержать любой код XHTML или PHP и обычно сохраняются с расширением .inc, хотя можно использовать также расширения .php, .txt, или .htm. Содержимое включаемого файла кодируется один раз и включается в любое необходимое количество страниц PHP. Если во включаемом файле делается изменение, то обновление автоматически отражается на всех страницах PHP, ссылающихся на включаемый файл.

Ниже показан пример типичного включаемого файла, содержащего информацию о заголовке страницы.

Header.inc

<h3> Welcome to WebBooks.Com </h3>

Этот пример показывает включаемый файл с именем header.inc. Файл содержит текст "Welcome to WebBooks.Com", окруженный тегом XHTML <h3>. Он создает заголовок третьего уровня, который можно теперь включать на все страницы, которые составляют сайт WebBooks.

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

require(имя_файла) – включает и проверяет указанный файл

include(имя_файла) – альтернативное имя require()

В следующем примере файл header.inc включается в существующую страницу PHP:

home.php

<?php

require('header.inc');

echo "<p>This is the WebBooks site...</p>";

?>

Функция require() вызывает файл header.inc и проверяет содержимое файла. Содержимое затем выводится, как если бы оно было частью страницы home.php. В этом примере функция require() кодируется вверху страницы, так как она содержит информацию заголовка. Оператор require() можно, однако, включить в любом месте документа PHP. Расположение функции require() определяет, где будет выводиться содержимое файла в контексте страницы PHP.

Welcome to WebBooks.Com

This is the WebBooks site...

Важно отметить, что при использовании включаемых файлов, которые содержат конфиденциальную информацию, такую, как пароли или информацию о пользователе, файлы должны сохраняться с использованием расширения .php, а не .inc или другого нестандартного расширения. Файлы, которые применяют нестандартные расширения файлов, могут загружаться с сервера Web, а их содержимое можно просматривать как обычный текст. Использование расширения .php гарантирует, что клиент не сможет увидеть исходный код, сервер вернет только код XHTML.



Your First Name is:


form_process.php

<?php

echo " Your First Name is: " . $_POST["FName"] . "
";

echo "Your Last Name is: " . $_POST["LName"] . "
";

echo "Your City is: " . $_POST["City"] . "
";

echo "Your State is: " . $_POST["State"] . "
";

echo "
";

echo "Your Message is: " . $_POST["Message"];

?>


"http://www.w3.org/TR/xhtml1/DTD/xhtml11-transitional.dtd">

A Web Page

First Name:

Last Name:

City:

State:

Message:


Итерации по массиву $_Request


С помощью цикла foreach можно выполнять итерации на массиве $_Request. Это предоставляет хороший способ отладки сценариев, которые обрабатывают информацию формы, а также просмотреть имена полей и присланные значения, чтобы проверить, что из формы была прислана правильная информация.

<?php foreach($_REQUEST as $key => $value)

{

echo $key; echo ": " $value; echo "<br/>";

}

?>

На каждом шаге цикла значение текущего элемента $_REQUEST присваивается переменной $value, а указатель массива сдвигается на единицу. Текущий индекс массива присваивается на каждом шаге переменной $key.

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

FName: John LName: Smith City: Atlanta State: Georgia Message: I like PHP submit: Submit Data

Просматривая этот вывод, можно убедиться, что ожидаемые данные были присланы на страницу welcome.php перед реальной обработкой правильно.



Контрольный вывод введенных значений формы


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


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

Вспомните, что значения полей посланной формы хранятся в суперглобальных переменных $_POST или $_GET. В предыдущем примере имя пользователя хранится в переменной массива $_POST['FName'], а фамилия — в переменной массива $_POST['LName']. Поэтому вывод значений полей формы можно выполнить, присваивая атрибутам 'value' полей формы с помощью кода PHP значения, содержащиеся в массиве. Следующий код демонстрирует такой подход.

process.php

<!DOCTYPE html PUBLIC "-//W3C//DTD/XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml11-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> <head> <title>Страница Web </title> </head> <body>

<form action="process.php" method="post">

First Name: <input type="text" name="FName" value="<?php echo $_POST['FName']?>"/> Last Name: <input type="text" name="LName" value="<?php echo $_POST['LName']?>"/>

<input type="submit" name="submit" value="Submit Data"/>

</form>

</body> </html>

Отметим, что значения текстовых полей First Name и Last Name обновлены, чтобы включить следующий код PHP:

<?php echo $_POST['FName']?> <?php echo $_POST['LName']?>

Когда этот код присваивается атрибуту 'value', он снова выводит значения, введенные ранее пользователем. Когда страница загружается в первый раз, значения переменных POST будут NULL, а value = "". Атрибут value содержит значение только после того, как была нажата кнопка submit.

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


<input type="submit" name="submit" value="Submit Data"/>

</form>

</body> </html>

Отметим, что значения текстовых полей First Name и Last Name обновлены, чтобы включить следующий код PHP:

<?php echo $_POST['FName']?> <?php echo $_POST['LName']?>

Когда этот код присваивается атрибуту 'value', он снова выводит значения, введенные ранее пользователем. Когда страница загружается в первый раз, значения переменных POST будут NULL, а value = "". Атрибут value содержит значение только после того, как была нажата кнопка submit.

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

© 2003-2007 INTUIT.ru. Все права защищены.

Массив $_Request


Массив PHP $_Request предоставляет ценную помощь при сборе передаваемой на сервер информации формы, помещая ее в структуру для удобной обработки сценарием. Массив $_Request перехватывает строку имен/значений, разбирает строку на имена и соответствующие значения и помещает эту информацию в ассоциативный массив, индексированный соответствующими именами полей формы. PHP предоставляет также массивы $_POST и $_GET, однако массив $_REQUEST часто является лучшим выбором, особенно в ситуациях, когда данные отправляются с удаленного сайта и неизвестно, какой метод используется — GET или POST.


Когда значения данных оказываются в массиве $_Request, их можно легко использовать по их именам, применяя следующий синтаксис:

$_Request['FName']="John" $_Request['LName']="Doe" $_Request['City']="Atlanta" $_Request['State']="Georgia" $_Request['Message']="I like PHP" $_Request['submit']="Submit Data"

где именем является имя, связанное с полем в форме. Поэтому ссылка $_Request['Account'] указывает на значение, введенное в поле Password; а ссылка $_Request['SubmitButton'] — на значение, связанное с кнопкой Submit. С точки зрения программирования $_Request['name'] работает как переменная программы, которая указывает на значение, хранящееся в этой переменной.



Пары имя/значение


Данные из формы передаются на сервер как последовательность пар имя/значение. Это значит, что имя каждого элемента формы (появляющееся в атрибуте NAME тега) связывается со значением этого элемента (введеным или выбранным пользователем). Формат имя/значение, используемый для передачи, имеет вид имя=значение. Используется столько пар имя/значение, сколько имеется элементов формы, и все пары соединяются с помощью символа амперсанда (&), чтобы сформировать текстовую строку, имеющую следующий вид:

name1=value1&name2=value2&name3=value3....

Все символы-разделители, появляющиеся в именах или значениях, заменяются символом плюс (+), чтобы создать неразрывную строку пар имя/значение. Предположим, что пользователь ввел имя учетной записи "myaccount" и пароль "xyzzy". Полученная строка пар имя/значение, доставляемая на сервер, будет иметь вид:

Account=myaccount&Password=xyzzy&SubmitButton=Submit

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

PHP имеет три типа переменных для работы с формами, предназначенные для хранения и обработки ввода пользователя в форму: $_GET, $_POST, и $_REQUEST. Вспомните из раздела 3-2, что они являются в действительности ассоциативными массивами значений.

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

$_GET[] — ассоциативный массив, который содержит все значения, передаваемые в сценарий с помощью метода формы GET.

$_POST[] – ассоциативный массив, который содержит все значения, передаваемые в сценарий с помощью метода формы POST.

$_REQUEST[] – ассоциативный массив, который содержит все значение, передаваемые в сценарий с помощью методов POST и GET.

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


form_page.htm>

<!DOCTYPE html PUBLIC "-//W3C//DTD/XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml11-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> <head> <title>A Web Page</title> </head> <body>

<form action="process.php" method="post">

First Name: <input type="text" name="FName"/> Last Name: <input type="text" name="LName"/> City: <input type="text" name="City"/> State: <input type="text" name="State"/>

Message: <textarea name="Message" cols="30" rows="5"></textarea>

<input type="submit" name="submit" value="Submit Data"/>

</form>

</body> </html>

Ниже показана форма с введенными пользователем данными для обработки:



Когда в приведенном выше примере нажимают кнопку отправки, все введенные пользователем данные формы передаются для обработки на страницу process.php. Так как эта форма использует метод POST, все данные формы передаются с помощью переменной PHP $_POST.

Каждый элемент управления ввода уникальным образом определяется значением, присвоенным его атрибуту name. Значение атрибута name элемента управления формы становится значением индекса массива $_POST. Страница формы PHPForm.htm передает данные с помощью следующих перменных PHP $_POST:

$_POST["FName"] = John $_POST["LName"] = Smith $_POST["City"] = Atlanta $_POST["State"] = Georgia $_POST["Message"] = I like PHP

Так как переменные PHP $_POST и $_GET используют значение, связанное с атрибутом name элемента управления формы, важно, чтобы всем элементам формы было присвоено уникальное значение name (имя).

Приведенная выше страница формы XHTML обрабатывается показанной ниже страницей process.php. Введенные в форму данные передаются с помощью переменной $_POST в сценарий PHP, который выводит информацию в окне браузера:



process.php

<?php

echo "Your First Name is: " . $_POST["FName"] . "<br/>"; echo "Your Last Name is: " . $_POST["LName"] . "<br/>"; echo "Your City is: " . $_POST["City"] . "<br/>"; echo "Your State is: " . $_POST["State"] . "<br/>"; echo "<br/>"; echo "Your Message is: " . $_POST["Message"];

?>

Сценарий PHP анализирует данные формы XHTML и применяет оператор echo для вывода результатов в окне браузера.

Если вместо метода POST используется метод GET, <form method="get" action="process.php/>, то массив $_POST заменяется массивом $_GET. Можно также воспользоваться массивом $_REQUEST. Этот массив можно применять для получения данных, посланных с помощью метода POST или GET. Переменную REQUEST можно использовать также с файлами Cookies, что рассматривается в дальнейшем.

В данном месте возникает естественный вопрос: что лучше использовать при обработке форм в PHP — метод GET или POST. Хотя оба метода определяют способ, которым информация формы передается на страницу, заданную в атрибуте ACTION, рекомендуется применять метод POST.

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

POST — (рекомендуемый) информация из формы передается отдельным потоком данных. Если служба, связанная с обработкой формы, имеет побочные эффекты (например, модификация базы данных или подписка на обслуживание), то должен использоваться метод POST. Метод POST защищает целостность данных, так как их нельзя видеть.

В предыдущем примере приложение обработки формы состоит из двух отдельных страниц – страницы формы XHTML (form_page.htm) и страницы PHP (process.php). Страница XHTML является статической, содержащей только детали представления и не имеющей кода. В противоположность этому страница PHP содержит только сценарий для обработки данных формы и не имеет тегов XHTML или деталей представления. Распространенной практикой при обработке форм в PHP является разделение деталей представления и кода обработки. В этом случае страницу сценария PHP можно создать таким образом, что ее можно будет использовать повторно с множеством страниц форм XHTML. Повторное использование является распространенной практикой программирования, которая позволяет использовать код повторно в различных программах, сокращая тем самым стоимость написания приложений.

Хотя разделение разметки XHTML и кода PHP является широко используемой многими программистами практикой, можно также объединять разметку и код PHP в одном файле PHP. Этот подход создает только один файл, упрощая кодирование и процесс обнаружения ошибок.

Следующий пример показывает предыдущий пример (form_page.htm и process.php), объединенный на одной странице PHP — form_process.php.



Пример 7.1.

(html, txt)

Блок кода PHP помещается вверху страницы. Кроме того, значение тега формы ACTION изменяется на "form_process.php". Теперь страница будет отсылать к себе, а не к отдельной странице PHP. Требуется еще один конечный шаг, чтобы новая страница работала правильно. Взгляните на представленный ниже вывод созданной страницы.



Здесь раздел формы XHTML выводится правильно. Однако блок кода PHP был выполнен до отправки формы (или до того, как был сделан щелчок на кнопке отправки). Это приводит к выводу строковых значений в операторах echo при загрузке страницы. Присоединенные значения $_POST[] отсутствуют, так как форма еще не была отправлена. Решение этой проблемы состоит в запрете выполнения блока кода PHP, пока форма не будет отправлена или пока не будет сделан щелчок на кнопке submit. Это можно сделать с помощью некоторой условной конструкции. Когда страница загружается, оператор if используется для определения, что была нажата кнопка submit в форме if($_POST['submit'] == "Submit Data"). Этот условие будет выполняться только после того, как будет запущена отправка формы в результате щелчка на кнопке submit. Предыдущая страница показана ниже с оператором if, проверяющим отправку формы.

Пример 7.2.

(html, txt)

Теперь код раздела PHP страницы выводится только после того, как условие ($_POST['submit'] == "Submit Data") станет истинно (true), т.е. будет нажата кнопка submit и начнется процесс отправки формы. По большей части, практика разделения PHP и XHTML или их объединения является вопросом личных предпочтений.



form_process.php

<?php

if ($_POST['submit'] == "Submit Data") {

echo "Your First Name is: " . $_POST["FName"] . "<br/>"; echo "Your Last Name is: " . $_POST["LName"] . "<br/>"; echo "Your City is: " . $_POST["City"] . "<br/>"; echo "Your State is: " . $_POST["State"] . "<br/>"; echo "<br/>"; echo "Your Message is: " . $_POST["Message"]; }

?>

<!DOCTYPE html PUBLIC "-//W3C//DTD/XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml11-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> <head> <title>A Web Page</title> </head> <body>

<form action="form_process.php" method="post">

First Name: <input type="text" name="FName"/> Last Name: <input type="text" name="LName"/> City: <input type="text" name="City"/> State: <input type="text" name="State"/>

Message: <textarea name="Message" cols="30" rows="5"></textarea>

<input type="submit" name="submit" value="Submit Data"/>

</form>

</body> </html>

Пример 7.2.

Теперь код раздела PHP страницы выводится только после того, как условие ($_POST['submit'] == "Submit Data") станет истинно (true), т.е. будет нажата кнопка submit и начнется процесс отправки формы. По большей части, практика разделения PHP и XHTML или их объединения является вопросом личных предпочтений.


Поля формы


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

Поле Account. Пример страницы содержит текстовое поле, в котором пользователь вводит свое учетное имя. Это стандартное текстовое поле, созданное с помощью тега <input type="text"> с заданными атрибутами name и size.

<input type="text" name="Account" size="10">

Поле Password. Поле пароля имеет вид стандартного текстового поля ввода; однако при вводе символов в поле, они выводятся как звездочки (*) или маркеры, чтобы сохранить приватность вводимых данных. Поле пароля создается с помощью тега <input type="password">. Полю необходимо присвоить имя и изменить его размер, равный по умолчанию 20 символам.

<input type="password" name="Password" size="10">

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

Кнопка Submit. При щелчке на кнопке передачи submit выполняется действие, определенное параметром ACTION тега <form>. Другими словами, щелчок на кнопке submit передает данные из формы на указанную страницу. Кнопка submit создается с помощью тега <INPUT TYPE="submit">. Кроме того, необходимо задать имя кнопки для ссылки в сценарии и присвоить значение, которое служит в качестве метки, появляющейся на кнопке.

<input type="submit" name="SubmitButton" value="Submit">

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



Пример приложения


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


Вторая страница является страницей приветствия сайта с именем "welcome.php". Информация формы посылается на эту страницу для проверки учетной записи и пароля. Если имя учетной записи и пароль будут правильными, то страница становится доступной. Если имя учетной записи или пароль будут неправильными, посетитель возвращается на страницу logon.php.


<html> <body>

<h3>Страница регистрации </h3>

<form name="Logon" action="welcome.php" method="post"> <table border="0"> <tr> <td>User name: </td> <td><input type="text" name="Account" size="10"></td> </tr> <tr> <td>Password: </td> <td><input type="password" name="Password" size="10"></td> </tr> </table> <input type="submit" name="SubmitButton" value="Submit"> </form>

</body> </html>

Элементы управления формы XHTML выводятся на странице Web при кодировании их внутри тегов <form>...</form>. Эти теги окружают элементы управления формы, однако они не обязаны окружать их "плотно". Другими словами, теги <form> не обязаны непосредственно предшествовать первому элементу управления и не обязаны следовать сразу за последним элементом управления. Если страница содержит одну форму, можно записать открывающий тег <form> сразу после тега <body>, а закрывающий тег </form> — непосредственно перед закрывающим тегом </body>. Затем элементы управления могут появляться в теле документа вперемешку с другими тегами HTML или текстом.

Тег <form> содержит три важные для обработки форм атрибута.

Атрибут Name. Все формы должны быть именованы. Хотя это не требуется для текущего упражнения, стоит следовать такой привычке. Имя формы потребуется, когда понадобится выполнить проверку данных в браузере, что будет рассмотрено в оставшейся части этого раздела. Формы именуют, записывая name="ИмяФормы" в теге <form>. Форме можно присвоить любое имя по желанию. В данном примере используется name="Logon".

Атрибут Action. Атрибут Action="url" определяет расположение и имя страницы, на которую посылается информация из формы для обработки. Если страница, которая будет обрабатывать данные, находится в том же каталоге, что и содержащая форму страница, то URL в параметре Action является просто именем этой страницы. Иначе это может быть полный URL, определяющий адрес Web на другом сервере или в другом каталоге на том же сервере. В рассматриваемом примере имя учетной записи и пароль, введенные посетителем, посылаются на страницу welcome.php в том же каталоге: action="welcome.php".

Атрибут Method. Атрибут method="GET|POST" определяет способ, используемый для пересылки данных формы на страницу, где они будут обрабатываться. Существует два метода на выбор.

Метод GET является более старым способом пересылки данных. В этом случае данные из формы присоединяются в конце URL страницы, на которую посылаются данные (URL в атрибуте action). Данные формы состоят из текстовой строки, которая соединяется с URL с помощью знака вопроса (?). Вы могли видеть, как это происходит, при посещении Web. Этот метод не является предпочтительным при отправке данных формы, так как существует ограничение на количество посылаемых символов, и данные плохо защищены от постороннего взгляда, когда они появляются в поле адреса URL в браузере. Мы будем в дальнейшем в некоторых случаях использовать этот метод. Метод POST отчасти решает эти проблемы. Он посылает данные формы на страницу action как отдельный поток данных, который не появляется в поле адреса браузера, кроме того, можно посылать любое требуемое для обработки формы количество символов. Если нет специальных причин, всегда используйте метод POST. В этом примере применяется method="post".



Проектирование форм


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

В этом учебнике будут рассмотрены все аспекты обработки форм. У нас будет возможность обсудить и продемонстрировать все элементы управления или механизмы ввода данных, которые можно закодировать в формах. Вполне вероятно, что большинство из них встречались вам во время посещения Web: поля ввода текста, активные кнопки, радиокнопки, флажки, раскрывающиеся меню и тому подобное. Все они будут изучены в дальнейшем. Сейчас мы рассмотрим два распространенных элемента управления – поля ввода текста и кнопки отправки форм.



Проверка формы


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

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

is_string(string) – определяет, является ли переменная string строкой. Возвращает значение true или false.

is_int(string) или is_integer(string) – определяет, является ли переменная string целым числом. Возвращает значение true или false.

is_numeric(string) – определяет, является ли переменная string числовой строкой. Возвращает значение true или false.

is_double(string) или is_float(string) – определяет, является ли переменная string числом с плавающей точкой. Возвращает значение true или false

strlen(string) – возвращает длину строки string.

strpbrk(string1, string2) – ищет в строке string1 символ из строки string2, возвращает строку, начинающуюся с найденного символа (или FALSE, если ничего не найдено).

strtolower(string) – преобразует строку, хранящуюся в переменной string, в символы нижнего регистра.

strtoupper(string) — преобразует строку, хранящуюся в переменной string, в символы верхнего регистра.

Рассмотрим следующую страницу с формой XHTML:


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

Отправка формы становится теперь трехшаговым процессом.

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


Следующий сценарий демонстрирует этот процесс.

Пример 7.3.

(html, txt)

Когда нажимается кнопка отправки, применяется последовательность операторов для проверки содержимого полей формы. Сначала проверяется, что поле name не NULL (значение $_POST['name']). Если $_POST['name'] содержит значение NULL, это указывает, что пользователь не ввел имя в поле 'name'. Оператор echo используется для вывода пользователю сообщения об ошибке. Если $_POST['name'] содержит значение, то оно присваивается скалярной переменной $name, которая может использоваться позже в программе, когда начнется обработка данных. Затем проверяется поле 'user name' с помощью того же метода, который применялся для проверки поля 'name'. Если имя пользователя не введено, выводится сообщение об ошибке. Иначе значение присваивается скалярной переменной $username. Наконец, проверяется поле пароля 'password'. Проверка пароля является двухшаговым процессом: 1) проверяется, что пароль был введен, и 2) если пароль был введен, проверяется, что он содержит не меньше 4 символов. Первый оператор if проверяет, что пароль был введен. Оператор elseif (который выполняется, только если предыдущий оператор if будет оцениваться как true) проверяет введенный пароль с помощью функции strlen(). Эта функция возвращает длину пароля. Полученная длина сравнивается с числом 4. Если значение меньше 4, выводится ошибка. Иначе длина пароля будет допустима, и он присваивается скалярной переменной $password.

Если все поля формы содержат допустимые данные, можно начинать обработку формы. Можно задать флаг, чтобы помочь в отслеживании проверки. Сначала флаг задается (($valid_form = true) в начале блока кода. Если какое-то из полей формы не содержит допустимые данные, то флагу присваивается значение false ($valid_form). После проверки всех полей формы применяется финальный оператор if для проверки статуса флага ($valid_form). Если значение $valid_form будет true (все поля формы содержат допустимые данные), можно начинать обработку формы, иначе блок обработки формы пропускается. Пользователь получает сообщение об ошибке, возникшей во время процесса проверки, и может начинать делать исправления.


Работа с формами


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

Введенные в форму данные посылаются на обработку, после щелчка на кнопке формы submit (отправка), <input type="submit">. Информация из полей формы передается затем на страницу, определенную атрибутом ACTION тега <form>. Когда запрос этого URL и соответствующие данные формы прибывают на сервер, вызывается указанная страница и данные передаются ей для обработки.



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


login.php

<?php if ($_POST['submit'] == "Login") {

// сценарий проверки имени пользователя и пароля должен кодироваться здесь

//если аутентификация прошла успешно session_start(); $_SESSION['access'] = "yes"; header(Location:access.php); {

if ($_POST['submit'] == "Log Out") {

//если пользователь решает выйти session_destroy(); }

?>

access.php

<?php // если пользователь обращается к этой странице, // проверьте, что он был аутентифицирован в login.php

if ($_SESSION['access'] != "yes") {

header(Location:login.php);

}

?>
Пример 8.1.
Закрыть окно


<?php

if ($_REQUEST[auth] == "no") { $msg = "Вы не являетесь пользователем. Зарегистрируйтесь."; }

// Если пользователь щелкает на кнопке Login, создается cookie, // содержащий его имя пользователя и IP-адрес

if ($_POST[submit] == "Login") { $cookie_name = "user"; $cookie_value = $_POST[uname]; $cookie_value = $cookie_value; $cookie_expire = time() + 14400;

setcookie($cookie_name,$cookie_value,$cookie_expire,"/");

$formDisplay = "no"; }

?>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHMTL 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">

<head> <title>Страница Web </title>

<style type="text/css">

body {font:10pt arial;color:white} div#form {background-color:gray;border:solid 1px black;padding:10px} input {border:solid 2px black}

</style>

<?php

if ($formDisplay == "no")

{

?>

<meta http-equiv='refresh' content='0;url=siteaccess.php?auth=yes'/>

<?php

}

?>

</head>

<body>

<div id="form"> <h4 style="color:red">New User? Create User Name</h4> <form action="setcookie.php" method="post">

<p>User Name: <br/> <input type="text" name="uname" size="7"/> </p>

<input type="submit" value="Login" name="submit"/>

</form>

<h4 style="color:red">Existing User? <a style="color:white" href="siteaccess.php?auth=yes">Enter Site</a></h4>

</div> <br/> <br/> <?php

echo "<span style='color:red'>" . $msg . "</span>";

?>

</body> </html>
Пример 8.2.
Закрыть окно


siteaccess.php

<?php

// Если пользователь щелкает на кнопке Login, // создается cookie, содержащий его имя пользователя и IP-адрес

if ($_REQUEST[auth] == "yes" && $_REQUEST[user]) {

echo "Добро пожаловать " . " " . $_COOKIE[user] . " на сайт с ограниченным доступом. Теперь на вашем жестком диске хранится cookie, и вы можете обращаться к этому сайту без регистрации при каждом обращении";

}

else

{

header("Location:setcookie.php?auth=no"); }

?>
Пример 8.3.
Закрыть окно

Файлы Cookies


Файл cookie является сообщением браузеру Web от сервера Web. Браузер сохраняет сообщение в текстовом файле. Это сообщение посылается затем назад на сервер каждый раз, когда браузер запрашивает страницу с сервера.

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

В PHP файлы cookies создают с помощью функции setcookie(). Все данные cookie хранятся в глобальной переменной PHP $_COOKIE и доступны для последующих страниц.

setcookie(name,value,expiration,path,domain,security) – определяет файл cookie, который посылается вместе с остальными заголовками HTTP. Как и другие заголовки, файлы cookie должны посылаться до какого-либо вывода работы сценария (это ограничение протокола). Поэтому требуется, чтобы обращение к функции было помещено до любого вывода, включая теги и любые символы разделители. Если вывод происходит до обращения к этой функции, то setcookie() не выполнится и вернет FALSE. Если setcookie() выполняется успешно, то возвращается TRUE. Это не указывает на то, что пользователь принял cookie.

Параметры setcookie() объясняются в следующей таблице.

ПараметрОписание
nameИмя cookie. Этот идентификатор хранится в глобальной переменной $_COOKIE и доступен в последующих сценариях
valueЗначение cookie. Значение, связанное с идентификатором cookie. Хранится на компьютере пользователя, поэтому не должно содержать секретной информации
expirationВремя, когда истекает значение cookie или становится более недоступным. Это время можно задать с помощью функции time(). Файлы cookie, без заданного значения времени истечения, завершают свое существование при закрытии браузера
path Указывает пути доступа на сервере, для которых cookie действителен или доступен. Прямая косая черта "/" говорит, что cookie доступен во всех папках
domainДомен, в котором доступен cookie. Если домен не определен, по умолчанию используется хост, на котором создан cookie. Значения domain должны содержать в строке как минимум две точки ".", чтобы быть допустимыми
securityУказывает, будет ли cookie передаваться через HTTPS. Значение 1 означает, что cookie передается через защищенное соединение. Значение 0 обозначает стандартную передачу HTTP

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


Пример 8.2.

(html, txt)

Пример 8.3.

(html, txt)


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



<?php

if ($_REQUEST[auth] == "no") { $msg = "Вы не являетесь пользователем. Зарегистрируйтесь."; }

// Если пользователь щелкает на кнопке Login, создается cookie, // содержащий его имя пользователя и IP-адрес

if ($_POST[submit] == "Login") { $cookie_name = "user"; $cookie_value = $_POST[uname]; $cookie_value = $cookie_value; $cookie_expire = time() + 14400;

setcookie($cookie_name,$cookie_value,$cookie_expire,"/");

$formDisplay = "no"; }

?>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHMTL 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">

<head> <title>Страница Web </title>

<style type="text/css">

body {font:10pt arial;color:white} div#form {background-color:gray;border:solid 1px black;padding:10px} input {border:solid 2px black}

</style>

<?php

if ($formDisplay == "no")

{

?>

<meta http-equiv='refresh' content='0;url=siteaccess.php?auth=yes'/>

<?php

}

?>

</head>

<body>

<div id="form"> <h4 style="color:red">New User? Create User Name</h4> <form action="setcookie.php" method="post">

<p>User Name: <br/> <input type="text" name="uname" size="7"/> </p>

<input type="submit" value="Login" name="submit"/>

</form>

<h4 style="color:red">Existing User? <a style="color:white" href="siteaccess.php?auth=yes">Enter Site</a></h4>



</div> <br/> <br/> <?php

echo "<span style='color:red'>" . $msg . "</span>";

?>

</body> </html>

Пример 8.2.

siteaccess.php

<?php

// Если пользователь щелкает на кнопке Login, // создается cookie, содержащий его имя пользователя и IP-адрес

if ($_REQUEST[auth] == "yes" && $_REQUEST[user]) {

echo "Добро пожаловать " . " " . $_COOKIE[user] . " на сайт с ограниченным доступом. Теперь на вашем жестком диске хранится cookie, и вы можете обращаться к этому сайту без регистрации при каждом обращении";

}

else

{

header("Location:setcookie.php?auth=no"); }

?>

Пример 8.3.

© 2003-2007 INTUIT.ru. Все права защищены.

Сеансы


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

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

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

Система PHP имеет ряд средств для поддержки сеансов. Это руководство начинается с введения глобальной переменной $_SESSION[]. Переменную $_SESSION[] рекомендуется использовать для улучшения безопасности и удобочитаемости кода.

Также вводятся функции сеанса session_start() и session_destroy(). Каждая из них определена ниже:

$_SESSION[] – суперглобальный массив PHP, который содержит зарегистрированные в данный момент переменные сеанса сценария.

session_start() – инициализация данных сеанса. Эта функция вызывается перед созданием новой переменной сеанса с помощью $_SESSION[].

session_destroy() – разрушает все данные, зарегистрированные для текущего сеанса сценария

В учебнике вводится также функция PHP header("Location …"). Хотя это функция HTTP, а не функция сеанса, она обычно используется для перенаправления пользователей во время существующих сеансов. Эта функция определена ниже.

header("Location: http://www.domain.com") – функция header используется для перенаправления браузера на страницу, определенную параметром Location.

Следующий блок кода демонстрирует, как инициализируется переменная сеанса.

<?php


session_start();

if ($_SESSION['count'] == "") {

$_SESSION['count'] = 1; }

else { $_SESSION['count'] = $_SESSION['count'] + 1;

}

?>

В этом примере сначала вызывается функция session_start() для инициализации данных сеанса. Функция session_start() должна вызываться перед созданием и присваиванием значений переменным сеанса. Затем используется оператор if для проверки значения переменной сеанса "count". Если сеанс будет null или не содержит значения, то он инициализируется как 1, иначе значение переменной сеанса увеличивается на 1. В этом случае переменная сеанса count используется для подсчета числа посетителей. Переменные сеанса предоставляют идеальный способ создания счетчиков страниц, так как каждому пользователю предоставляется уникальный сеанс.

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

Пример 8.1.

(html, txt)

Пример выше состоит из двух страниц — login.php и access.php. Прежде чем пользователь сможет увидеть содержимое access.php, он должен пройти login.php. Создается сеанс, чтобы гарантировать, что пользователь был аутентифицирован. После того как пользователь вводит действительное имя пользователя и пароль, выполняется щелчок на кнопке "Login". Сценарий PHP проверяет, что пароль и имя пользователя допустимы. Затем переменной сеанса присваивается значение "yes" и доступ предоставляется. Пользователь перенаправляется на страницу access.php. Сценарий на access.php проверяет, что существует сеанс. Если сеанс не существует, применяется функция header(), чтобы перенаправить пользователя назад на страницу login.php и не разрешить доступ к содержимому страницы access.php.

Страница login.php содержит второй сценарий, который используется для уничтожения переменной сеанса, вызывая функцию session_destroy(). Сценарий выполняется после того, как пользователь щелкает на кнопке "Log Out".

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

Так как значение session_id() является уникальным для каждого пользователя, его можно применять для идентификации пользователей, не создавая при этом индивидуальных имен пользователей и паролей. Функция session_id() определена ниже:

session_id() – используется для получения значения id текущего сеанса.


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


Применяя функции ODBC, рассмотренные в предыдущем разделе, вместе с языком SQL можно добавлять записи в таблицы базы данных. Записи добавляют в таблицу базы данных с помощью формы, представляющей поля ввода данных. Затем с помощью кнопки вызывается сценарий PHP для записи новой информации в таблицу с помощью команды SQL INSERT. Типичная форма ввода для добавления новой записи в таблицу Survey показана ниже.


Поля формы именуются соответствующим образом:

Name — 'Name', Email — 'Email', Web Connection — 'Connection', Residence (City/ST/Country) — 'Residence', Age — 'Age', Gender — 'Gender', Comments — 'Comments'.

Прежде чем переходить к коду, покажем синтаксис оператора SQL INSERT:

INSERT INTO TableName (FieldName1 [,FieldName2]...) VALUES (Value1 [,Value2]...)

Более подробно оператор INSERT рассматривается в разделе 10-1.

Следующий код применяется для обработки данных формы VisitorSurvey.php:

Пример 9.1.

(html, txt)

После щелчка на кнопке отправки создается суперглобальный массив $_POST, содержащий значения формы. Значения массива присваиваются скалярным переменным. Это упрощает кодирование оператора SQL. Затем выполняется оператор odbc_connect(). Этому оператору требуется три параметра – DSN или строка соединения без DSN, имя пользователя и пароль. Здесь для соединения с базой данных Access используется строка соединения без DSN. Так как Access для доступа к данным не требует имя пользователя или пароль, то параметры username и password кодируются как значения NULL. Ссылка на соединение сохраняется в переменной $conn. Это пример ссылочной переменной PHP.

В отличие от скаляров или переменных массивов, ссылочные переменные не применяются в программе непосредственно, но часто используются в качестве параметров для других функций. После оператора соединения выполняется оператор SQL INSERT и присваивается переменной $sql. Затем функция odbc_exec() выполняет оператор SQL, создающий множество записей (множество записей из базы данных). Это множество записей присваивается $rs, другой ссылочной переменной PHP. Отметим, что функция odbc_exec() требует два параметра — $conn (ссылка на текущее соединение базой данных) и $sql (ссылка на текущий оператор SQL). В конце вызывается функция odbc_close() для закрытия текущего соединения с базой данных.

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

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

Предположим в предыдущем коде, что функция odbc_exec() содержит вместо $sql параметр $sqlString. PHP немедленно остановит выполнение страницы и выведет следующее сообщение:

Warning: odbc_exec() [function.odbc-exec]: SQL error: [Microsoft][ODBC Microsoft Access Driver] Invalid use of null pointer , SQL state S1009 in SQLExecDirect in C:\ApacheRoot\VisitorSurvey.php on line 38

Ошибку PHP можно подавить с помощью оператора управления ошибками "@". После подавления ошибки можно добавить код для создания более понятного пользователю ответа. Такой подход показан ниже:

Пример 9.2.

(html, txt)

После функции odbc_exec() используется оператор if для проверки статуса множества записей — $rs. Если множество записей успешно создано, то выводится сообщение "Запись была успешно добавлена". Если возникает проблема, выводится сообщение "Произошла ошибка. Попробуйте еще раз."


Warning: odbc_exec() [function.odbc-exec]: SQL error: [Microsoft][ ODBC Microsoft Access Driver] Invalid use of null pointer , SQL state S1009 in SQLExecDirect in C:\ApacheRoot\VisitorSurvey.php on line 38

Ошибку PHP можно подавить с помощью оператора управления ошибками "@". После подавления ошибки можно добавить код для создания более понятного пользователю ответа. Такой подход показан ниже:

VisitorSurvey.php

<?php

if ($_POST[submit] == "Submit") {

//Извлечение данных формы и присвоение скалярным переменным

$Name = $_POST[Name]; $Email = $_POST[Email]; $Connection = $_POST[Connection]; $Residence = $_POST[Residence]; $Age = $_POST[Age]; $Gender = $_POST[Gender]; $Comments = $_POST[Comments];

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

$conn = @odbc_connect('Driver={Microsoft Access Driver (*.mdb)}; DBQ=c:\path\to\database.mdb','','');

//Оператор SQL

$sql = "INSERT INTO Survey " . "(Name,Email,Connection,Residence,Age,Gender,Comments) VALUES ('$Name', '$Email', '$Connection', '$Residence', '$Age', '$Gender', '$Comments')";

//Выполнение оператора SQL и сохранение результатов в множестве записей

$rs = @odbc_exec($conn,$sqlstring);

if (!$rs) {

echo "Произошла ошибка. Попробуйте еще раз. ";

}

else

{

echo "Запись была успешно добавлена.";

}

odbc_close($conn);

}

?>

Пример 9.2.

После функции odbc_exec() используется оператор if для проверки статуса множества записей — $rs. Если множество записей успешно создано, то выводится сообщение "Запись была успешно добавлена". Если возникает проблема, выводится сообщение "Произошла ошибка. Попробуйте еще раз."


Доступ ODBC


PHP обеспечивает поддержку ODBC (Open DataBase Connectivity), что позволяет обращаться к любой совместимой с ODBC системе управления базами данных (СУБД), если в системе или сети доступно Имя источника данных (DSN — Data Source Name) или доступна строка соединения без DSN. Это включает доступ к таким реляционным базам данных, как Oracle, DB2, MS SQL Server, MySQL, и MS Access. Так как PHP включает функции доступа к базам данных MySQL без DSN, которые не требуют ODBC, в этом разделе для демонстрации методов ODBC будет применяться MS Access. Примеры можно использовать также с другими СУБД, совместимыми с ODBC.



Получение данных формы


VisitorSurvey.php

<?php

if ($_POST[submit] == "Submit") {

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

$Name = $_POST[Name]; $Email = $_POST[Email]; $Connection = $_POST[Connection]; $Residence = $_POST[Residence]; $Age = $_POST[Age]; $Gender = $_POST[Gender]; $Comments = $_POST[Comments];

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

$conn = odbc_connect('Driver={Microsoft Access Driver (*.mdb)}; DBQ=c:\path\to\database.mdb','','');

// Оператор SQL

$sql = "INSERT INTO Survey " . "(Name,Email,Connection,Residence,Age,Gender,Comments) VALUES ('$Name', '$Email', '$Connection', '$Residence', '$Age', '$Gender', '$Comments')";

//Выполнение оператора SQL и сохранение результатов в множестве записей

$rs = odbc_exec($conn,$sql);

odbc_close($conn);

}

?>
Пример 9.1.
Закрыть окно


VisitorSurvey.php

<?php

if ($_POST[submit] == "Submit") {

//Извлечение данных формы и присвоение скалярным переменным

$Name = $_POST[Name]; $Email = $_POST[Email]; $Connection = $_POST[Connection]; $Residence = $_POST[Residence]; $Age = $_POST[Age]; $Gender = $_POST[Gender]; $Comments = $_POST[Comments];

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

$conn = @odbc_connect('Driver={Microsoft Access Driver (*.mdb)}; DBQ=c:\path\to\database.mdb','','');

//Оператор SQL

$sql = "INSERT INTO Survey " . "(Name,Email,Connection,Residence,Age,Gender,Comments) VALUES ('$Name', '$Email', '$Connection', '$Residence', '$Age', '$Gender', '$Comments')";

//Выполнение оператора SQL и сохранение результатов в множестве записей

$rs = @odbc_exec($conn,$sqlstring);

if (!$rs) {

echo " Произошла ошибка. Попробуйте еще раз. ";

}

else

{

echo "Запись была успешно добавлена.";

}

odbc_close($conn);

}

?>
Пример 9.2.
Закрыть окно


DirectorySearch.php

<?php

if ($_POST[submit] == "Search") {

//Извлечение данных формы

$string = $_POST['search'];

//Установление соединения с данными

$conn = odbc_connect('Driver={Microsoft Access Driver (*.mdb)}; DBQ=c:\path\to\database.mdb','','');

//Выполнение оператора SQL SELECT

$sql = "SELECT * FROM Directory WHERE LName = '$string'";

$rs = odbc_exec($conn, $sql); }

?>

<!DOCTYPE html PUBLIC "-//W3C/DTD/XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml11-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> <head> <title>Страница Web</title>

<style>

body {margin:15px;font:10pt Verdana} td {vertical-align:top;border:solid 1px gray} input,textarea{border:0px}

</style>

</head>

<body>

<form action="DirectorySearch.php" method="post"> <p> Введите ниже фамилию и щелкните на кнопке "Search", чтобы найти номер телефона сотрудника и адрес e-mail </p> <table> <tr> <td colspan="2">Company XYZ Directory</td> </tr> <td><input type="text" size="15" name="SearchName"/></td> <td><input type="submit" value="Search" name="submit"/> </tr> </table> </form>

<div>

<?php

if(!empty($_POST)) { while($row = odbc_fetch_array($rs))

{ echo "Name: " .$row['FName'] . " "; echo $row['LName'] . "<br/>"; echo "Telephone: " . $row['Telephone'] . "<br/>"; echo "Email: " . $row['Email'] . "<br/>"; }

odbc_close($conn); } ?>

</div> </body> </html>
Пример 9.3.
Закрыть окно


DirectorySearch.php

<?php

if ($_POST['submitb']=="Delete Record") {

$conn = odbc_connect('Driver={Microsoft Access Driver (*.mdb)}; DBQ=c:\path\to\database.mdb','',''); $sqlDelete = " DELETE FROM Personnel WHERE AutoNum =" . $_POST['AutoNum']; $rsDelete = odbc_exec($conn,$sqlDelete);

if(odbc_num_rows($rsDelete) == 1) {

echo "Запись успешно удалена!";

}

odbc_close($conn);

}

?>
Пример 9.4.
Закрыть окно


DirectorySearch.php

<?php

if ($_POST['submitb']=="Update Record") {

$new_fname = $_POST['FName']; $new_lname= $_POST['LName']; $new_telephone = $_POST['Telephone']; $new_email = $_POST['Email'];

$conn = odbc_connect('Driver={ Microsoft Access Driver (*.mdb)}; DBQ=c:\path\to\database.mdb','',''); $sqlUpdate = "UPDATE Personnel SET (FName = '$new_fname', LName = '$new_lname', Telephone = '$new_telephone', Email = '$new_email') WHERE AutoNum =" . $_POST['AutoNum']; $rsUpdate = odbc_exec($conn,$sqlUpdate);

if(odbc_num_rows($rsUpdate) == 1) {

echo "Запись успешно обновлена!";

}

odbc_close($conn);

}

?>
Пример 9.5.
Закрыть окно

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


Оператор SQL UPDATE используется для изменения или обновления существующих записей базы данных.

Синтаксис оператора SQL UPDATE показан ниже:

UPDATE ИмяТаблицы SET (FieldName1=value1 [,FieldName2=value2]...) WHERE критерий

Следующая форма представляет запись пользователя, которая будет обновлена в таблице базы данных Personnel. Модификация любых полей, связанных с записью, и щелчок на кнопке Update Record вызывает процедуру PHP, которая выполняет оператор SQL UPDATE, чтобы обновить эту запись в таблице базы данных.


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

Пример 9.5.

(html, txt)

После щелчка на кнопке "Update Record" текущие значения полей формы присваиваются скалярным переменным. Этот шаг не является обязательным, однако он упрощает кодирование оператора SQL UPDATE. Затем устанавливается соединение с базой данных Access. После соединения с базой данных выполняется оператор SQL UPDATE для обновления записи в таблице Personnel со значением поля AutoNum, равным значению скрытого текстового поля AutoNum. Затем выполняется оператор SQL. Результаты функции odbc_exec() присваиваются переменной $rsUpdate. Последний шаг состоит в проверке, что обновление записи было успешно, и в выводе подтверждающего сообщения.

Функция odbc_num_rows() используется для определения числа строк в результате ODBC или числа строк, затронутых оператором odbc_exec(). Так как обновляется только одна запись, то обновление записи проходит успешно, если результат функции odbc_num_rows() будет равен 1. В конце соединение с базой данных закрывается.



Соединения ODBC без DSN


Соединения без DSN не требуют создания DSN системного уровня для соединения с базами данных и предоставляет некоторую альтернативу DSN. Вместо использования DSN для соединения с базой данных, разработчик определяет необходимую информацию прямо в приложении. При соединении без DSN разработчик может использовать стандарты соединения, отличные от ODBC, такие, как OLE DB. Соединения без DSN должны применяться в том случае, когда отсутствует доступ к серверу для регистрации DSN.

В Microsoft Access для создания соединений без DSN используется следующая строка соединения:

Driver={Microsoft Access Driver (*.mdb)}; DBQ=c:\path\to\database.mdb

odbc_connect(dsn/строка соединения без dsn,имя_пользователя,пароль) – функция, используемая для соединения с источником данных ODBC. Функция получает четыре параметра: имя источника данных (dsn) или строку соединения без dsn, имя пользователя, пароль и необязательный тип курсора. В тех случаях, когда имя пользователя, пароль, и тип курсора не требуются, параметры можно заменить пустой строкой — ''. id соединения, возвращаемый этой функцией, требуется другим функциям ODBC. Можно иметь одновременно открытыми несколько соединений, если они либо имеют различные id, либо используют различные имя пользователя и пароль.

odbc_exec(id_соединения, строка_запроса SQL) – функция, используемая для выполнения оператора SQL. Функция получает два параметра: объект соединения id, созданный функцией odbc_connect(), и оператор SQL. При возникновении ошибки возвращает FALSE. Возвращает множество записей, если команда SQL выполняется успешно.

odbc_fetch_array(имя множества записей) – используется для извлечения записей или строк из множества записей как ассоциативного массива. Имя множества записей создается при вызове функции odbc_exec(). Эта функция возвращает TRUE, если может вернуть строки, иначе — FALSE.

odbc_num_rows(имя множества записей) – возвращает число строк в множестве результатов ODBC. Функция возвращает -1, если возникает ошибка. Для операторов INSERT, UPDATE и DELETE функция odbc_num_rows() возвращает число затронутых строк. Для предложения SELECT это может быть число доступных строк. Примечание: использование odbc_num_rows() для определения числа доступных строк после оператора SELECT возвращает -1 для драйверов MS Access.

odbc_close(id соединения) – закрывает соединение с сервером базы данных, связанное с данным идентификатором соединения.

Эти функции будут рассмотрены в разделах с 8-2 по 8-5 .



Соединения ODBC с помощью DSN


Чтобы соединиться с базой данных, используя ODBC, сначала необходимо создать системное имя источника данных.

Вот как создается соединение ODBC с базой данных MS Access

Откройте в Панели управления значок Администрирование.

Сделайте в раскрывшемся окне двойной щелчок на значке Источники данных (ODBC).

Выберите вкладку Системный DSN.

На вкладке Системный DNS щелкните на кнопке Добавить.

Выберите Microsoft Access Driver. Щелкните на кнопке Готово.

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

Задайте для базы данных Имя источника данных (DSN).

Щелкните на кнопке OK.

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

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



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


Оператор SQL DELETE используется для удаления существующих в базе данных записей.

Синтаксис оператора SQL DELETE показан ниже:

DELETE FROM Имя_таблицы WHERE критерий

Более подробно оператор DELETE рассматривается в разделе 10.

Следующая форма представляет запись пользователя, которая будет удалена из таблицы базы данных Personnel (Персонал). Щелчок на кнопке Delete вызывает процедуру PHP, которая выполняет оператор SQL DELETE, чтобы удалить эту запись из таблицы базы данных.


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

Пример 9.4.

(html, txt)

После щелчка на кнопке "Delete Record" устанавливается соединение с базой данных Access. Затем выполняется оператор SQL DELETE для удаления записи из таблицы Personnel со значением поля AutoNum равным значению скрытого текстового поля AutoNum. Затем выполняется оператор SQL. Результаты функции odbc_exec() присваиваются переменной $rsDelete. Последний шаг состоит в проверке, что удаление записи было успешным, и в выводе подтверждающего сообщения. Функция odbc_num_rows() применяется для определения числа строк в результатах ODBC или числа строк, затронутых оператором odbc_exec(). Так как удаляется одна запись, то запись будет удалена успешно, если результат функции odbc_num_rows() будет равен 1. В конце соединение с базой данных закрывается.



Выбор записей


Кроме использования функций ODBC с оператором SQL INSERT для добавления записей в базу данных, можно также извлекать записи из таблицы базы данных с помощью оператора SQL SELECT. Типичная форма ввода для выбора существующих записей из таблицы Directory показана ниже. В этом примере фиктивная компания Company XYZ, имеет онлайновую форму, которая позволяет пользователям ввести фамилию сотрудника и найти имя и фамилию сотрудника, номер телефона и адрес e-mail.


Оператор SQL SELECT показан ниже:

SELECT * | [DISTINCT] field1 [,field2]... FROM TableName WHERE criteria ORDER BY FieldName1 [ASC|DESC] [,FieldName2 [ASC|DESC] ]...

Более подробное рассмотрение оператора SELECT дано в разделе 10.

Следующий код используется для обработки формы DirectorySearch.php:

Пример 9.3.

(html, txt)

Эта страница содержит два блока кода PHP. Первый выполняется, когда делается щелчок на кнопке отправки "Search". Введенное пользователем имя (first name) присваивается скалярной переменной '$string'. Затем с базой данных устанавливается соединение и выполняется оператор SQL SELECT для выбора всех (*) полей записей таблицы, где значение поля 'lastname' совпадает со строкой фамилии, введенной пользователем. Наконец, выполняется оператор SQL. Если найдены подходящие записи, то множество записей присваивается переменной '$rs'.

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

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

Затем используется цикл while для итераций на множестве записей. Во время каждой итерации по множеству записей, функция odbc_fetch_array() создает ассоциативный массив (здесь массив называется $row), содержащий значения полей текущей записи. Индексы массива соответствуют именам полей формы, а элементы массива — значениям полей. Каждая запись затем выводит $row['FName'] — значение поля 'FirstName', $row['LName'] – значение поля 'LastName', $row['Telephone'] – значение поля 'Telephone', и $row['Email'] – значение поля 'Email'. Этот процесс продолжается, при этом каждый раз массив $row содержит новые значения, пока не будет достигнут конец множества записей.

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

Ниже показан пример вывода, созданного после поиска в каталоге компании XYZ.




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

DirectorySearch.php

<?php

if(!empty($_POST)) { $results = 0; while($row = odbc_fetch_array($rs))

{ echo "Name: " .$row['FName'] . " "; echo $row['LName'] . "<br/>"; echo "Telephone: " . $row['Telephone'] . "<br/>"; echo "Email: " . $row['Email'] . "<br/>";

$results += 1; }

if ($results == 0)

{

echo "Ничего не найдено!";

}

odbc_close($conn); } ?>

</div> </body> </html>

Модифицированный сценарий, показанный выше, добавляет счетчик записей $results для подсчета числа выводимых записей. В начале значение счетчика задается равным 0. Если множество записей существует, то цикл while будет выполнять итерации на каждой записи и увеличивать значение счетчика на 1. После окончания цикла проверяется значение счетчика. Если это значение равно 0, то никаких записей не было найдено, и выводится сообщение "Ничего не найдено!"





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

DirectorySearch.php

<?php

if(!empty($_POST)) { $results = 0; while($row = odbc_fetch_array($rs))

{ echo "Name: " .$row['FName'] . " "; echo $row['LName'] . "<br/>"; echo "Telephone: " . $row['Telephone'] . "<br/>"; echo "Email: " . $row['Email'] . "<br/>";

$results += 1; }

if ($results == 0)

{

echo "Ничего не найдено!";

}

odbc_close($conn); } ?>

</div> </body> </html>

Модифицированный сценарий, показанный выше, добавляет счетчик записей $results для подсчета числа выводимых записей. В начале значение счетчика задается равным 0. Если множество записей существует, то цикл while будет выполнять итерации на каждой записи и увеличивать значение счетчика на 1. После окончания цикла проверяется значение счетчика. Если это значение равно 0, то никаких записей не было найдено, и выводится сообщение "Ничего не найдено!"


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


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

Типичная форма ввода для добавления новой записи в таблицу Survey показана ниже.


Поля формы именованы соответствующим образом:

Name — 'Name', Email — 'Email', Web Connection — 'Connection', Residence (City/ST/Country) — 'Residence', Age — 'Age', Gender — 'Gender', Comments — 'Comments'.

Прежде чем подробно рассматривать код, будет полезно посмотреть на синтаксис оператора SQL INSERT:

INSERT INTO TableName (FieldName1 [,FieldName2]...) VALUES (Value1 [,Value2]...)

Более подробное рассмотрение оператора INSERT дано в приложении.

Следующий код используется для обработки данных формы VisitorSurvey.php:

Пример 10.1.

(html, txt)

После нажатия кнопки отправки Submit создается суперглобальный массив $_POST, содержащий значения из формы. Значения массива присваиваются скалярным переменным. Это упрощает кодирование оператора SQL. Затем выполняется оператор mysql_connect(). Этот оператор требует три параметра – имя хоста сервера MySQL, имя пользователя, и пароль. Здесь для соединения с базой данных MySQL используется строка соединения без DSN. Ссылка на соединение хранится в переменной $conn. Это пример ссылочной переменной PHP. В отличие от скалярных переменных и массивов, ссылочные переменные не применяются непосредственно в программе, но часто используются как параметры для других функций. После соединения с сервером базы данных MySQL следующий шаг состоит в выборе базы данных. Так как экземпляр сервера MySQL может содержать большое число баз данных, то задействуется функция mysql_select_db для выбора одной из них для использования в приложении. Эта функция требует два параметра – имя базы данных и ссылку на соединение MySQL. Вслед за выбором базы данных формируется оператор SQL INSERT и присваивается переменной $sql. Затем функция mysql_query() выполняет оператор SQL, создающий множество записей (множество записей базы данных). Это множество записей присваивается переменной $rs, еще одной ссылочной переменной PHP. Отметим, что функция mysql_query() требует два параметра — $sql (ссылка на текущий оператор SQL) и $conn (ссылка на текущее соединение с базой данных). Наконец, вызывается функция close() для закрытия текущего соединения с базой данных. Для таких приложений обычно желательно выполнять проверку данных, прежде чем заносить данные в таблицу базы данных. Это необходимо делать перед установлением соединения с базой данных с помощью методов, рассмотренных в разделе 6-2.

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

Предположим, что в предыдущем коде функция mysql_query() содержит вместо $sql параметр $sqlString. В этом случае PHP немедленно прекратит выполнение страницы и выведет следующее сообщение:

Warning: odbc_exec() [function.odbc-exec]: SQL error: [Microsoft][ODBC Microsoft Access Driver] Invalid use of null pointer, SQL state S1009 in SQLExecDirect in C:\ApacheRoot\VisitorSurvey.php on line 38

Вывод сообщения об ошибке PHP можно подавить с помощью оператора управления ошибками "@". При подавленном сообщении об ошибке можно добавить код для создания более понятного пользователю сообщения. Такой подход показан ниже:

Пример 10.2.

(html, txt)

Вслед за функцией mysql_query() используется оператор if для проверки статуса множества записей $rs. Если множество записей успешно создается, выводится сообщение "Запись была успешно добавлена". Если возникает проблема, выводится сообщение "Произошла ошибка. Попробуйте еще раз."


Warning: odbc_exec() [function.odbc-exec]: SQL error: [Microsoft][ ODBC Microsoft Access Driver] Invalid use of null pointer, SQL state S1009 in SQLExecDirect in C:\ApacheRoot\VisitorSurvey.php on line 38

Вывод сообщения об ошибке PHP можно подавить с помощью оператора управления ошибками "@". При подавленном сообщении об ошибке можно добавить код для создания более понятного пользователю сообщения. Такой подход показан ниже:

VisitorSurvey.php

<?php

if ($_POST[submit] == "Submit") {

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

$Name = $_POST[Name]; $Email = $_POST[Email]; $Connection = $_POST[Connection]; $Residence = $_POST[Residence]; $Age = $_POST[Age]; $Gender = $_POST[Gender]; $Comments = $_POST[Comments];

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

$conn = @mysql_connect('localhost','root','xyxyxy');

//Выбор базы данных MySQL

$db = @mysql_select_db('Membership', $conn);

//Оператор SQL

$sql = "INSERT INTO Survey " . "(Name,Email,Connection,Residence,Age,Gender,Comments) VALUES ('$Name', '$Email', '$Connection', '$Residence', '$Age', '$Gender', '$Comments')";

//Выполнение оператора SQL и сохранение результатов в виде множества записей

$rs = @mysql_query($sqlstring,$conn);

if (!$rs) {

echo "Произошла ошибка. Попробуйте еще раз.";

}

else

{

echo "Запись была успешно добавлена.";

}

mysql_close($conn);

}

?>

Пример 10.2.

Вслед за функцией mysql_query() используется оператор if для проверки статуса множества записей $rs. Если множество записей успешно создается, выводится сообщение "Запись была успешно добавлена". Если возникает проблема, выводится сообщение "Произошла ошибка. Попробуйте еще раз."


Доступ к MySQL


База данных MySQL® стала самой популярной в мире базой данных с открытым исходным кодом — благодаря ее высокой производительности, надежности и легкости использования. Существует более 6 миллионов установок этой базы данных, начиная от больших корпораций и до специализированных встроенных приложений.


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

Используемые обычно функции PHP для MySQL описаны ниже.

mysql_connect(имя сервера MySQL,имя пользователя,пароль) – открывает соединение с сервером MySQL.

mysql_select_db(имя базы данных,идентификатор_соединения) – выбирает базу данных, расположенную на сервере MySQL. Параметр "имя базы данных" относится к активной базе данных на сервере MySQL, которая была открыта с помощью функции mysql_connect. "Идентификатор_соединения" является ссылкой на текущее соединение с MySQL.

mysql_query(запрос sql) – посылает запрос активной в данный момент базе данных.

mysql_fetch_array(resourse result) – возвращает массив, который соответствует извлеченной строке, и перемещает внутренний указатель данных вперед.

mysql_affected_rows(resourse result) – определяет число строк, затронутых предыдущей операцией SQL.

mysql_close(link_identifier) – закрывает соединение MySQL.

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

При работе с сервером MySQL полезно также использовать инструменты управления с графическим интерфейсом, которые обеспечивают более легкий интерфейс использования данных. Популярными инструментами являются: SQLyog (доступный на http://www.webyog.com) и MySQL Administrator (доступный на http://www.mysql.com/products/tools/).



Получение данных формы


VisitorSurvey.php

<?php

if ($_POST[submit] == "Submit") {

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

$Name = $_POST[Name]; $Email = $_POST[Email]; $Connection = $_POST[Connection]; $Residence = $_POST[Residence]; $Age = $_POST[Age]; $Gender = $_POST[Gender]; $Comments = $_POST[Comments];

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

$conn = mysql_connect('localhost','root','xyxyxy');

//Выбор базы данных MySQL

$db = mysql_select_db('Membership', $conn);

//Оператор SQL

$sql = "INSERT INTO Survey " . "(Name,Email,Connection,Residence,Age,Gender,Comments) VALUES ('$Name', '$Email', '$Connection', '$Residence', '$Age', '$Gender', '$Comments')";

//Выполнение оператора SQL и сохранение результатов в множестве записей

$rs = mysql_query($sql,$conn);

mysql_close($conn);

}

?>
Пример 10.1.
Закрыть окно


VisitorSurvey.php

<?php

if ($_POST[submit] == "Submit") {

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

$Name = $_POST[Name]; $Email = $_POST[Email]; $Connection = $_POST[Connection]; $Residence = $_POST[Residence]; $Age = $_POST[Age]; $Gender = $_POST[Gender]; $Comments = $_POST[Comments];

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

$conn = @mysql_connect('localhost','root','xyxyxy');

//Выбор базы данных MySQL

$db = @mysql_select_db('Membership', $conn);

//Оператор SQL

$sql = "INSERT INTO Survey " . "(Name,Email,Connection,Residence,Age,Gender,Comments) VALUES ('$Name', '$Email', '$Connection', '$Residence', '$Age', '$Gender', '$Comments')";

//Выполнение оператора SQL и сохранение результатов в виде множества записей

$rs = @mysql_query($sqlstring,$conn);

if (!$rs) {

echo " Произошла ошибка. Попробуйте еще раз.";

}

else

{

echo "Запись была успешно добавлена.";

}

mysql_close($conn);

}

?>
Пример 10.2.
Закрыть окно


DirectorySearch.php

<?php

if ($_POST[submit] == "Search") {

//Получение данных формы

$string = $_POST['search'];

//Установление соединения с данными

$conn = mysql_connect('localhost','root','xyxyxy');

//Выбор базы данных

$db = mysql_select_db('Membership', $conn);

//Создание оператора SQL SELECT

$sql = "SELECT * FROM Directory WHERE LName = '$string'";

$rs = mysql_query($sql, $conn); }

?>

<!DOCTYPE html PUBLIC "-//W3C/DTD/XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml11-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> <head> <title>Страница Web </title>

<style>

body {margin:15px;font:10pt Verdana} td {vertical-align:top;border:solid 1px gray} input,textarea{border:0px}

</style>

</head>

<body>

<form action="DirectorySearch.php" method="post"> <p>Введите ниже фамилию и нажмите кнопку "Search", чтобы найти номер телефона и адрес e-mail сотрудника</p> <table> <tr> <td colspan="2">Company XYZ Directory</td> </tr> <td><input type="text" size="15" name="SearchName"/></td> <td><input type="submit" value="Search" name="submit"/> </tr> </table> </form>

<div>

<?php

if(!empty($_POST)) { while($row = mysql_fetch_array($rs)) { echo "Name: " .$row['FName'] . " "; echo $row['LName'] . "<br/>"; echo "Telephone: " . $row['Telephone'] . "<br/>"; echo "Email: " . $row['Email'] . "<br/>"; } mysql_close($conn); } ?>

</div> </body> </html>
Пример 10.3.
Закрыть окно

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


Оператор SQL DELETE используется для удаления существующих записей в базе данных.

Синтаксис оператора SQL DELETE показан ниже:

DELETE FROM Имя_Таблицы WHERE критерий

Более подробно оператор DELETE рассматривается в приложении.

Следующая форма представляет запись пользователя, которая будет удалена из таблицы базы данных Personnel. Щелчок на кнопке Delete вызывает процедуру PHP, которая выполняет оператор SQL DELETE для удаления этой записи из таблицы базы данных.


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

DirectorySearch.php

<?php

if ($_POST['submitb']=="Delete Record") {

$conn = mysql_connect('localhost','root','xyxyxy'); $db = mysql_select_db('Membership',$conn); $sqlDelete = "DELETE FROM Personnel WHERE AutoNum =" . $_POST['AutoNum']; $rsDelete = mysql_query($sqlDelete,$conn);

if(mysql_affected_rows($rsDelete) == 1) {

echo "Запись успешно удалена!";

}

mysql_close($conn);

}

?>

После нажатия кнопки "Delete Record" устанавливается соединение с базой данных MySQL. Затем создается оператор SQL DELETE для удаления записи из таблицы Personnel со значением поля AutoNum, равным значению скрытого текстового поля AutoNum. Затем оператор SQL выполняется. Результаты работы функции mysql_query() присваиваются переменной $rsDelete. Последний шаг состоит в проверке, что удаление записи прошло успешно, и в выводе подтверждающего сообщения. Функция mysql_affected_rows() используется для определения числа строк в множестве результатов ODBC или числа строк, затронутых оператором mysql_query(). Так как будет удалена только одна запись, то результат mysql_affected_rows() равный 1 означает, что запись удалена успешно. В конце соединение с базой данных закрывается.



Выбор записей


Кроме применения функций MySQL с оператором SQL INSERT для добавления записей в базу данных, можно также извлекать записи из таблицы базы данных с помощью оператора SQL SELECT.

Типичная форма ввода для выбора существующих записей из таблицы Directory показана ниже. В этом примере фиктивная компания, Company XYZ, имеет онлайн форму, которая позволяет пользователям ввести фамилию сотрудника и найти полное имя сотрудника, номер телефона и адрес e-mail.


Оператор SQL SELECT показан ниже:

SELECT * | [DISTINCT] field1 [,field2]... FROM TableName WHERE criteria ORDER BY FieldName1 [ASC|DESC] [,FieldName2 [ASC|DESC] ]...

Более подробно оператор SELECT рассматривается в приложении.

Следующий код используется для обработки формы DirectorySearch.php:

Пример 10.3.

(html, txt)

Эта страница содержит два блока кода PHP. Первый выполняется, когда нажимается кнопка отправки формы "Search". Введенная пользователем фамилия присваивается скалярной переменной '$string'. Затем создается соединение с базой данных и формируется оператор SQL SELECT для выбора всех (*) полей таблицы записей, в которых поле 'lastname' совпадает со строкой фамилии, введенной пользователем. В конце выполняется оператор SQL. Если найдены подходящие записи, то множество записей присваивается переменной '$rs'.

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

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

Затем используется цикл while для итераций по множеству записей. Во время каждой итерации по множеству записей функция mysql_fetch_array() создает ассоциативный массив (здесь этот массив назван $row), содержащий значения полей текущей записи. Индексы массива соответствуют именам полей формы, а элемент массива соответствует значению поля. Каждая запись затем выводит $row['FName'] — значение поля 'FirstName', $row['LName'] -- значение поля 'LastName', $row['Telephone'] – значение поля 'Telephone', и $row['Email'] – значение поля 'Email'. Этот процесс продолжается, пока не будет достигнут конец множества записей, при этом массив $row каждый раз будет содержать новые значения.

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

Ниже представлен пример вывода, созданного после поиска в каталоге.




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

DirectorySearch.php

<?php

if(!empty($_POST)) {

while($row = mysql_fetch_array($rs))

{

echo "Name: " .$row['FName'] . " "; echo $row['LName'] . "<br/>"; echo "Telephone: " . $row['Telephone'] . "<br/>"; echo "Email: " . $row['Email'] . "<br/>";

}

if (mysql_affected_rows($rs) == 0)

{

echo "No records found!";

}

mysql_close($conn); } ?>

</div> </body> </html>

Показанный выше измененный сценарий содержит дополнительно функцию mysql_affected_rows(). Эта функция требует один параметр – ссылку на текущее множество записей $rs и определяет число строк, затронутых последней операцией SQL. Если возвращаемое функцией mysql_affected_rows() значение равно 0, то оператор SQL SELECT не затронул ни одной строки. Поэтому подходящих записей найдено не было.



<div>

<?php

if(!empty($_POST)) { while($row = mysql_fetch_array($rs)) { echo "Name: " .$row['FName'] . " "; echo $row['LName'] . "<br/>"; echo "Telephone: " . $row['Telephone'] . "<br/>"; echo "Email: " . $row['Email'] . "<br/>"; } mysql_close($conn); } ?>

</div> </body> </html>

Пример 10.3.

Эта страница содержит два блока кода PHP. Первый выполняется, когда нажимается кнопка отправки формы "Search". Введенная пользователем фамилия присваивается скалярной переменной '$string'. Затем создается соединение с базой данных и формируется оператор SQL SELECT для выбора всех (*) полей таблицы записей, в которых поле 'lastname' совпадает со строкой фамилии, введенной пользователем. В конце выполняется оператор SQL. Если найдены подходящие записи, то множество записей присваивается переменной '$rs'.

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

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

Затем используется цикл while для итераций по множеству записей. Во время каждой итерации по множеству записей функция mysql_fetch_array() создает ассоциативный массив (здесь этот массив назван $row), содержащий значения полей текущей записи. Индексы массива соответствуют именам полей формы, а элемент массива соответствует значению поля. Каждая запись затем выводит $row['FName'] — значение поля 'FirstName', $row['LName'] -- значение поля 'LastName', $row['Telephone'] – значение поля 'Telephone', и $row['Email'] – значение поля 'Email'. Этот процесс продолжается, пока не будет достигнут конец множества записей, при этом массив $row каждый раз будет содержать новые значения.

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

Ниже представлен пример вывода, созданного после поиска в каталоге.


Чтение файлов


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

Для чтения файлов в PHP имеются функции fread() и filesize(). Они определяются ниже.

fread(указатель_ресурса, длина) – функция, используемая для чтения содержимого файла. Читает указанное количество байтов "длина" из файла "указатель_ресурса". Чтение останавливается, когда будет прочитано заданное количество байтов ("длина") или будет достигнут маркер EOF (end of file). Функция требует два параметра – указатель файла, который создается, когда файл открывается с помощью функции fopen(), и размер, который определяет, какая часть содержимого будет считана.

fgetcsv(указатель_ресурса, длина, ограничитель) – функция, используемая для чтения содержимого файла и анализа данных для создания массива. Данные разделяются параметром-ограничителем, задаваемым в функции.

filesize(имя_файла) – возвращает размер файла. Если возникает ошибка, функция возвращает значение false.

Следующий пример иллюстрирует, как прочитать все содержимое файла:

fileread.php

<?php

$filename = "C:/Documents and Settings/Administrator/MyFiles/myfile.txt";

$newfile = @fopen($filename, "r") or exit("Невозможно открыть файл!");

$file_contents = @fread($newfile, filesize($filename)) or exit("Невозможно прочитать содержимое файла!");

fclose($newfile);

?>

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

$filename = "C:/Documents and Settings/Administrators/MyFiles/myfile.txt";

Путь доступа к текстовому файлу myfile.txt хранится в переменной с именем filename. Затем создается указатель файла с именем $newfile и используется с функцией fopen() для открытия файла, указанного в предыдущем разделе. Указатель файла применяется для ссылки на только что открытый файл:

$newfile = fopen($filename, "r");

Указатель файла является переменной PHP, которая содержит ссылку на открытый файл. Он будет задействован позже с функцией fread() для чтения содержимого из открытого файла.

Затем создается переменная с именем $file_contents и используется для хранения содержимого текстового файла myfile.txt. Первый параметр функции fread() указывает на имя файла, содержимое которого будет прочитано. Второй параметр определяет длину файла. Если длина файла неизвестна, можно воспользоваться специальной функцией PHP с именем filesize(), которая определяет длину файла. Она требует один параметр – имя или путь доступа файла, который читается в данный момент.


$file_contents = fread($newfile, filesize($filename));

Все содержимое текстового файла хранится теперь в переменной $file_contents. Эти данные можно выводить на экране с помощью оператора echo или записать в другой текстовый файл.

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

Предположим, что текстовый файл numbers.txt существует и содержит следующие данные:

numbers.txt

50,17,34,90

Следующий сценарий демонстрирует использование функции fgetcsv() для чтения содержимого текстового файла.

fileread.php

<?php

$filename = "C:/numbers.txt";

$newfile = @fopen($filename, "r") or exit("Could not open file");

$file_contents = @fgetcsv($newfile, filesize($filename),",") or exit("Could not read file contents");

while ($i=0; $i < sizeof($file_contents); $i++) { echo $file_contents[$i]; echo "<br/>"; }

fclose($newfile);

?>

После открытия файла функция fgetcsv() считывает все содержимое файла, создавая массив — '$file_contents'. Третий параметр функции fgetcsv() определяет, что каждый элемент, отделенный с помощью запятой ",", станет элементом нового массива. Так как numbers.txt содержит значения 50,28,34,90, то $file_contents[0] = 50, $file_contents[1] = 28, $file_contents[2] = 34, $file_contents[3] = 90. После создания массива значениями можно манипулировать с помощью любой из функций для массивов PHP. В предыдущем примере цикл while выполняет итерации на массиве $file_contents[] и выводит каждое число.

После завершения обработки файла функция fclose() используется для закрытия открытого файла.


Данные формы успешно записаны


<?php

if ($_POST['SubmitB'] == "Submit Data") { $file_name = "c:\formfile.txt"; $open_file = fopen($file_name, "a+");

$file_contents= $_POST['FName'] . "," . $_POST['LName'] . "," . $_POST['DateTime'] ."\n";

fwrite($open_file,$file_contents);

fclose($open_file);

echo " Данные формы успешно записаны в файл"; } ?>

<!DOCTYPE html PUBLIC "-//W3C//DTD/XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml11-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> <head> <title>Страница Web </title> </head> <body>

<p>Запись данных формы в файл </p>

<p> <form method="post" action="createfile.php">

Enter First Name <input type="text" name="FName"/><br/><br/> Enter Last Name <input type="text" name="LName"/><br/><br/> <input type="hidden" name="DateTime" value="<?php echo date('g:i a') ?>"/> <input type="submit" name="SubmitB" value="Submit Data"/>

</form> </p>

</body> </html>
Пример 11.1.
Закрыть окно


upload.php

<?php

if ($_POST[SubmitB] == "Upload File") {

move_uploaded_file ($_FILES['uploadFile'] ['tmp_name'], "../PHPTutorial/ECommerce/Databases/{$_FILES['uploadFile'] ['name']}");

if($_FILES['uploadFile'] ['error'] > 0) { switch ($_FILES['uploadFile'] ['error']) {

case 1: echo ' Файл превышает максимальный серверный размер для пересылки'; break;

case 2: echo 'Файл превышает максимальный размер файла'; break;

case 3: echo 'Файл загрузился только частично'; break;

case 4: echo 'Никакой файл не загрузился'; break;

}

}

else

{

echo 'Файл успешно загружен';

} }

?>

<form enctype="multipart/form-data" action="upload.php" method="post">

Select File: <input type="file" name="uploadFile"/>

<input type="hidden" name="MAX_FILE_SIZE" value="1000000"/>

<input name="SubmitB" type="submit" value="Upload File"/>

</form>
Пример 11.2.
Закрыть окно

Копирование файлов


Этот раздел описывает, как использовать PHP для копирования файлов в системах Windows.

PHP содержит функцию copy() для копирования файлов. Эта функция определяется ниже:

copy(исходный_файл, новый_файл) – копирует содержимое исходного файла, определенного первым параметром, в новый файл, определенный вторым параметром функции. Функция возвращает значение true или false.

Следующий пример показывает, как скопировать содержимое одного файла в другой файл:

filecopy.php

<?php

$orig_filename = "C:/Documents and Settings/Administrator/MyFiles/myfile.txt";

$new_filename = "C:/Documents and Settings/Administrator/MyFiles/myNewfile.txt";

$status = @copy($orig_filename, $new_filename) or die("Невозможно скопировать файл");

echo "Содержимое файла успешно скопировано!";

?>

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

$orig_filename = "C:/Documents and Settings/Administrators/MyFiles/myfile.txt";

Затем создается вторая переменная для хранения полного пути доступа к новому файлу, который будет создан:

$new_filename = "C:/Documents and Settings/Administrators/MyFiles/myNewfile.txt";

Копирование выполняет функция copy(), принимая два параметра, путь доступа к исходному файлу — $orig_filename, и путь доступа к новому — $new_filename. Функция copy() возвращает значение true, если копирование завершается успешно; иначе возвращается значение false. Возвращаемое значение хранится в переменной $status.

$status = copy($orig_filename, $new_filename) or die("Невозможно скопировать файл");

Если функция copy() отказывает, выполняется функция die(), выводя сообщение об ошибке. Иначе с помощью функции echo выводится сообщение об успехе.

echo "Содержимое успешно скопировано";

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



Открытие файлов


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

PHP содержит функции fopen() и fclose() для работы с файлами. Обе функции определяются ниже.

fopen(имя_файла, режим)- функция используется для открытия файла. Для функции требуется задать имя файла и режим работы. Она возвращает указатель на файл, который содержит информацию о файле и используется в качестве ссылки.

fclose(указатель_ресурса) – функция используется для закрытия файла. Для функции требуется указатель файла, созданный при открытии файла с помощью функции fopen(). Возвращает TRUE при успешной работе или FALSE при отказе.

Имя файла является полным путем доступа к файлу, который требуется создать или открыть. Этот путь доступа может быть относительным путем доступа к файлу: "/Documents and Settings/Administrator/PHP/myfile.txt" или абсолютным путем доступа к файлу: "E:/MyFiles/PHP/myfile.txt". Для каждого определенного каталога необходимо иметь подходящие права NTFS для создания, модификации или удаления файлов.

Режим может быть одним из следующих.

Режимы, используемые в fopen()

Режим Применение
r Открывает существующий файл с целью чтения из него данных. Указатель файла помещается в начале файла
r+ Открывает существующий файл с целью чтения или записи данных. Указатель файла помещается в начале файла
w Открывает файл для записи. Если файл не существует, то он создается. Если файл существует, то указатель файла помещается в начале файла и функция удаляет все существующее содержимое файла
w+ Открывает файл для чтения и записи. Если файл не существует, то он создается. Если файл существует, то указатель файла помещается в начале файла и функция удаляет все существующее содержимое файла
a Открывает файл для записи. Если файл не существует, то он создается. Если файл существует, то указатель файла помещается в конце файла
a+ Открывает файл для чтения и записи. Если файл не существует, то он создается. Если файл существует, то указатель файла помещается в конце файла


Следующий пример показывает, как открыть файл для чтения:

fileprocess.php

<?php

$filename = "C:/Documents and Settings/Administrator/MyFiles/myfile.txt";

$newfile = fopen($filename, "w+");

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

fclose($newfile);

?>

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

$filename = "C:/Documents and Settings/Administrators/MyFiles/myfile.txt";

Путь доступа к текстовому файлу myfile.txt хранится в переменной с именем filename. Затем создается указатель файла с именем $newfile и применяется с функцией fopen() для открытия файла, указанного в предыдущем разделе. Указатель файла является ссылочной переменной PHP, используемой для ссылки на только что открытый файл:

$newfile = fopen($filename, "w+");

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

В некоторых ситуациях функция fopen() не сможет успешно открыть файл в результате неверного пути доступа к файлу, полномочий безопасности или других непредвиденных проблем. В связи с этим рекомендуется использовать специальную функцию PHP для аккуратной обработки таких ошибок. Эти функции можно применять в сочетании с оператором управления ошибками PHP "@", рассмотренного в разделе 8-2 для завершения сценария, подавления создаваемых PHP сообщений об ошибках, и вывода более понятного пользователю сообщения. Функции управления ошибками PHP описаны ниже:

exit(сообщение_об_ошибке) – завершает текущий сценарий и выводит сообщение об ошибке, передаваемое в функцию.

die(сообщение_об_ошибке) – алиас функции exit().

Следующий сценарий демонстрирует использование функций управления ошибками:

fileprocess.php

<?php

$filename = "C:/Documents and Settings/Administrator/MyFiles/ myfile.txt";

$newfile = @fopen($filename, "w+") or exit("Невозможно открыть или создать файл");

//код для чтения или записи данных в файл размещается здесь

fclose($newfile);

?>

Если файл невозможно открыть, функция exit() выводит сообщение " Невозможно открыть или создать файл" и сценарий завершается.

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


Переименование файлов


Этот раздел описывает, как использовать PHP для переименования файлов в системах Windows.

PHP содержит функцию rename() для переименования файлов. Эта функция определена ниже:

rename($orig_filename, $new_filename) – переименует файл, определенный первым параметром, в имя, определенное вторым параметром. Функция возвращает значение true или false.

Следующий пример показывает, как переименовать файл с помощью функции rename():

filerename.php

<?php

$orig_filename = "C:/Documents and Settings/Administrator/MyFiles/myfile.txt"; $new_filename = "C:/Documents and Settings/Administrator/MyFiles/newfile.txt"; $status = rename($orig_filename, $new_filename) or exit("Невозможно переименовать файл");

echo "файл успешно переименован";

?>

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

$orig_filename = "C:/Documents and Settings/Administrators/MyFiles/myfile.txt";

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

$new_filename = "C:/Documents and Settings/Administrators/MyFiles/newfile.txt";

При выполнении функция rename() получает два параметра, путь доступа к исходному файлу — $orig_filename и путь доступа к файлу, который будет создан, когда старый файл будет переименован — $new_filename. Функция rename() возвращает значение true, если файл переименовывается успешно, иначе возвращается значение false. Возвращаемое значение хранится в переменной $status.

$status = rename($orig_filename,$new_filename) or exit("Невозможно переименовать файл");

Если функция rename() отказывает, выполняется функция exit(), выводящая сообщение об ошибке. Иначе выводится сообщение об успехе с помощью оператора echo.

echo "файл успешно переименован";



Пересылка файлов


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

В PHP пересылку файлов можно реализовать с помощью следующей функции:

move_uploaded_file(имя_файла, место_назначения) – перемещает файл в указанное место на сервере.

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

<form enctype="multipart/form-data" action="upload.php" method="post">

Select File: <input type="file" name="uploadFile">

<input name="SubmitB" type="submit" value="Upload File">

</form>

Блок кода начинается со стандартного тега XHTML <form>. Кроме атрибутов action и method форма, используемая для пересылки файлов, должна включать тип кодирования или атрибут "encrypt". Когда форма применяется для пересылки файлов должно использоваться значение атрибута encrypt "multipart/form-data".

После тега <form> следует элемент текстового поля <input>. Этот элемент управления нужен для определения расположения и имени файла, который будет пересылаться. Он содержит атрибуты name и type. Атрибут type должен быть задан как "file". name имеет определенное пользователем значение, которое будет использоваться сервером для идентификации файла источника во время процесса пересылки.

Текстовое поле file включает также кнопку "Browse…" при выводе в окне браузера. Когда нажимается эта кнопка, появляется диалоговое окно, позволяющее пользователю найти на своем локальном компьютере файл, который будет пересылаться.

Последним элементом управления является кнопка отправки (submit). Кнопка отправки используется для инициирования процесса отправки формы. Когда нажимается эта кнопка, информация о файле посылается на страницу upload.php, которая содержит код PHP для пересылки файла в папку, расположенную на сервере Web.

После кодирования формы XHTML на страницу можно добавить сценарий PHP для выполнения динамической пересылки файла. Когда файл пересылается с помощью функции move_uploaded_file(), он кратко хранится во временном месте на сервере Web. Для перемещения файла в его конечное место назначения и манипуляций с его различными свойствами, используется суперглобальный массив PHP $_FILES. Массив $_FILES применяет значение name, заданное в теге lt;input type="file" name="uploadFile"/> (в данном случае 'uploadFile') для идентификации пересылаемого файла. Записи, связанные с массивом $_FILES, описаны ниже.

$_FILES['uploadFile']['tmp_name'] – каталог на сервере web, где временно хранится файл. По умолчанию используется каталог uploadtemp, расположенный в папке PHP.

$_FILES['uploadFile']['name'] – имя файла в системе пользователя.

$_FILES['uploadFile']['size'] – размер файла в байтах.

$_FILES['uploadFile']['type'] – тип MIME файла.

$_FILES['uploadFile']['error'] – код ошибки, связанный с пересылкой файла (0 – успешная пересылка, 1 – файл превышает максимальный размер пересылки, 2 – файл превышает максимальный размер файла, 3 – файл частично загружен, 4 – файл не загружен).

Следующие блоки кода показывают, как массив $_FILES используется с функцией move_uploaded_file() для создания простой процедуры пересылки.


upload.php

<?php

if ($_POST[SubmitB] == "Upload File") {

move_uploaded_file ($_FILES['uploadFile'] ['tmp_name'], "../PHPTutorial/ECommerce/Databases/{$_FILES['uploadFile'] ['name']}");

echo "Файл загружен.";

}

?>

<form enctype="multipart/form-data" action="upload.php" method="post">

Select File: <input type="file" name="uploadFile">

<input name="SubmitB" type="submit" value="Upload File">

</form>

Когда нажимается кнопка "Upload File", то файл, определенный в <input type="file" name="uploadFile"/>, автоматически посылается во временную папку на сервере Web. Затем вызывается функция move_uploaded_file() для перемещения файла. Первый параметр функции, $_FILES['uploadFile'] ['tmp_name'], становится ссылкой на файл, когда функция готовится к перемещению его в конечное место назначения. Второй параметр, "../PHPTutorial/ECommerce/Databases/{$_FILES['uploadFile'] ['name']}", является относительным путем доступа к папке, в которой был временно сохранен файл. Последняя часть пути доступа включает код {$_FILES['uploadFile'] ['name']}. Это можно интерпретировать как имя файла, который был введен в текстовое поле file с именем "uploadFile". Вкратце, функция move_uploaded_file() перемещает файл из временной папки пересылки folder ($_FILES['uploadFile'] ['tmp_name']) в папку "../PHPTutorial/ECommerce/Databases/), и файл сохраняется с тем именем, которое ввел пользователь, ({$_FILES['uploadFile'] ['name']}). Файлы можно пересылать в любой каталог на сервере Web, однако папка места назначения должна иметь полномочия доступа для записи ("write").

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

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



Пример 11.2.

(html, txt)

Обновленный код включает оператор if и оператор switch/case для проверки статуса пересылки файла. После выполнения функции move_uploaded_file() оператор if проверяет значение массива $_FILES['uploadFile'] ['error']. Если значение больше 0, то произошла ошибка. Значение $_FILES['uploadFile'] ['error'] передается оператору switch и проверяется. После этого выводится соответствующее сообщение об ошибке. Если значение $_FILES['uploadFile'] ['error'] равно 0, оператор else выводит сообщение об успешном выполнении.

Еще одним новым свойством, включенным в этот пример, является скрытое текстовое поле XHTML с именем "MAX_FILE_SIZE". Это специальный скрытый тег, который можно использовать с тегом file, <input type="file" name="uploadFile"/>, для задания максимального размера файла. Если файл превышает определенное значение, то произойдет ошибка. Это значение измеряется в байтах. Здесь максимальный размер файла задан равным 1,000,000 байт (приблизительно 1 мегабайт). Можно также задать максимальный серверный размер пересылки. Это максимальный размер файла, заданный на сервере в файле PHP.ini.


Получение данных формы


В большинстве случаев введенные пользователями данные формы записывают в СУБД, такую, как MS Access и MySQL, с помощью функций ODBC и MySQL, рассмотренных в разделах 9 и 10. Аналогичным образом данные формы можно также записать в текстовый файл. Этот раздел описывает, как использовать PHP для получения данных формы и записи их в текстовый файл.


Рассмотрим приведенную выше страницу с формой. Следующий пример показывает, как записать отправленные данные формы в текстовый файл:

Пример 11.1.

(html, txt)

В этом примере форма страницы XHTML содержит текстовое поле для имени и фамилии пользователя. Также кодируется скрытое поле, в которое заносится с помощью функции PHP date() текущие дата и время. Когда нажимается кнопка отправки формы, создается новый текстовый файл 'formfile.txt' и открывается в режиме добавления:

$file_name = "c:\ApacheRoot\formfile.txt"; $open_file = fopen($file_name, "a+");

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

$file_contents= $_POST['FName'] . "," . $_POST['LName'] . "," . $_POST['DateTime'] ."\n";

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

fclose($open_file); echo "Данные формы успешно записаны в файл";



Удаление файлов


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

PHP содержит функцию unlink() для удаления файлов. Функцию unlink() надо использовать с осторожностью. После удаления файла его невозможно восстановить. Эта функция определяется ниже.

unlink(имя_файла) – удаляет файл, определенный параметром. Функция возвращает значение true или false.

Следующий пример показывает, как удалить файл с помощью функции unlink():

filedelete.php

<?php

$filename = "C:/Documents and Settings/Administrator/MyFiles/myfile.txt";

$status = unlink($filename) or exit("Невозможно удалить файл");

echo "файл удален успешно";

?>

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

$filename = "C:/Documents and Settings/Administrators/MyFiles/myfile.txt";

Функция unlink() выполняется, получая один параметр, путь доступа исходного файла — $filename. Функция unlink() возвращает значение true, если файл удаляется успешно; иначе возвращается значение false. Возвращаемое значение хранится в переменной $status.

$status = unlink($filename) or die("Невозможно удалить файл");

Если функция unlink() отказывает, выполняется функция exit(), выводя сообщение об ошибке. Иначе с помощью оператора echo выводится сообщение об успехе:

echo "файл удален успешно";



Запись в файлы


Этот раздел описывает, как использовать PHP для записи содержимого в файлы в системах Windows.

PHP содержит функцию fwrite() для записи файлов. Эта функция определена ниже.

fwrite(указатель_файла,строка) – записывает содержимое строки в поток указанного файла. Если задан аргумент length (длина), запись будет остановлена после записи length байтов или достижения конца строки.

Следующий пример иллюстрирует, как записать все содержимое файла:

filewrite.php

<?php

$filename = "C:/Documents and Settings/Administrator/MyFiles/myfile.txt";

$newfile = @fopen($filename, "w") or exit("Невозможно открыть файл");

$file_contents = "Добавьте эту строку в текстовый файл";

fwrite($newfile,$file_contents);

fclose($newfile);

?>

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

$filename = "C:/Documents and Settings/Administrators/MyFiles/myfile.txt";

Путь доступа к текстовому файлу myfile.txt хранится в переменной с именем filename. Затем создается указатель файла с именем $newfile и используется с функцией fopen() для открытия файла, указанного в предыдущем разделе. Указатель файла применяется для ссылки на только что открытый файл. Файл открывается в режиме записи:

$newfile = fopen($filename, "w");

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

Затем создается переменная с именем $file_contents и ей присваивается строковое значение, которое будет записано в текстовый файл myfile.txt.

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

fwrite($newfile, $file_contents);

После завершения обработки файла используется функция fclose() для закрытия открытого файла.

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


filecopy.php

<?php

$fileAname = "C:/MyFiles/PHP/file1.txt"; $fileBname = "C:/MyFiles/PHP/file.txt";

$currentfile = fopen($fileAname,"r") or exit("Невозможно открыть файл"); $fileAcontents = fread($currentfile,filesize($fileAname));

$newfile = fopen($fileBname,"w");

fwrite($newfile, $fileAcontents);

fclose($newfile); fclose($currentfile);

echo "Содержимое файла file1.txt скопировано в файл file.txt";

?>

Этот сценарий копирует содержимое "file1.txt" в новый файл "file.txt". Сначала объявляются две переменные $fileAname и $fileBname, которым присваиваются пути доступа к каталогам существующего и нового файла. Функция fopen() используется для открытия текущего файла для чтения его содержимого. Открытый файл присваивается указателю файла $currentfile. Содержимое открытого файла считывается с помощью функции fread() и присваивается переменной $fileAcontents. Затем функция fopen() применяется снова для открытия нового файла. Открытый файл присваивается указателю файла $newfile. Функция fwrite() используется для записи содержимого исходного файла в новый файл. Когда процесс копирования завершается, оба файла закрываются с помощью функции fclose().