Страницу Назад
Поискать другие аналоги этой работы

1300

Лаб№1. « ЯзыкMySQL» Лаб№2. «Основные конструкции языка PHP» Лаб№3. «Обработка форм»

ID: 237202
Дата закачки: 20 Июня 2023
Продавец: Илья (Напишите, если есть вопросы)
    Посмотреть другие работы этого продавца

Тип работы: Работа Лабораторная
Сдано в учебном заведении: ДО СИБГУТИ

Описание:
1 Теоретический материал
1.0. Структура учебной базы данных
1. После устанвки пакета Denwer создаем приведенную ниже базу данных - непосредственно с помощью phpMyAdmin или используя файл ins.php, который расположен в директории work полученного Вами задания.

Таблица sal - продавцы
snum - номер продавца
sname - имя продавца
city - город, где находится продавец
comm - комиссионные продавца
snum sname city comm
1001 Peel London 0.12
1002 Serres San Jose 0.13
1004 Motica London 0.11
1007 Rifkin Barcelona 0.15
1003 Axelrod New York 0.10
Таблица cust - покупатели
cnum - номер покупателя
cname - имя покупателя
city - город, где находится покупатель
rating - рейтинг покупателя
snum - номер продавца, у которого покупатель сделал покупку
cnum cname city rating snum
2001 Hoffman London 100 1001
2002 Giovanni Rome 200 1003
2003 Liu San Jose 200 1002
2004 Grass Berlin 300 1002
2006 Clemens London 100 1001
2008 Cisneros San Jose 300 1007
2007 Pereira Rome 100 1004
Таблица ord - заказы
onum - номер заказа
amt - сумма заказа
odate - дата заказа
cnum - номер покупателя, который сделал заказ
snum - номер продавца, которому сделан заказ
onum amt odate cnum snum
3001 18.69 03-OCT-90 2008 1007
3003 767.19 03-OCT-90 2001 1001
3002 1900.10 03-OCT-90 2007 1004
3005 5160.45 03-OCT-90 2003 1002
3006 1098.16 03-OCT-90 2008 1007
3009 1713.23 04-OCT-90 2002 1003
3007 75.75 04-OCT-90 2004 1002
3008 4723.00 05-OCT-90 2006 1001
3010 1309.95 06-OCT-90 2004 1002
3011 9891.88 06-OCT-90 2006 1001

1.1. Запрос данных
Запрос данных в языке SQL осуществляется командой SELECT. Для выбора всей информации из таблицы используется наиболее простая форма команды:

SELECT * FROM <имя_объекта>;

где <имя_объекта> вообще говоря, имеет вид <имя_базы_данных.имя_таблицы>



Например:

SELECT * FROM sample.sal;



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



Например:

SELECT * FROM sal;





УПРАЖНЕНИЕ 1.1.

Просмотрите содержимое таблиц учебной базы данных (SAL,

CUST, ORD).





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

SELECT * FROM cust;

SELECT city, cname FROM cust;

Для того, чтобы вывести данные из столбца БЕЗ повторяющихся значений, используется параметр DISTINCT. Сравните результаты запросов:

SELECT city FROM sal;

SELECT DISTINCT city FROM sal;

Выбор требуемых строк осуществляется применением фразы WHERE <условие> в команде SELECT. Следующая команда выводит записи только о тех покупателях, которые размещаются в городе San Jose (Сан Хосе):

SELECT * FROM cust

WHERE city = \'San Jose\';

Для указания конкретных столбцов в команде SELECT необходимо знать их точное название. Команда DESCRIBE (или сокращенно DESC) позволяет получить имена столбцов и другую информацию о структуре таблиц. Например, следующая команда выводит структуру таблицы Заказов:

DESC ord;



УПРАЖНЕНИЕ 1.2.

Запросите информацию о структурах всех известных вам

объектов базы SAMPLE.



1.2. Использование реляционных, булевых и специальных операторов


Реляционные операторы, которыми располагает SQL:

= - равно

> - больше, чем

< - меньше, чем

>= - больше или равно

<= - меньше или равно

<>, != - не равно



Cледующая команда выводит сведения о покупателях, чей рейтинг отличен от 200:

SELECT * FROM cust WHERE rating <> 200;

Cтандартными булевыми операторами, распознаваемыми SQL, являются:

AND - логическое И

OR - логическое ИЛИ

NOT - логическое ОТРИЦАНИЕ

В следующем примере показано использование реляционных и булевых операторов при указании условия выборки данных. Команда SELECT выбирает всех заказчиков, находящихся в San Jose и имеющих рейтинг выше 200:

SELECT * FROM cust

WHERE city = \'San Jose\' AND rating > 200;



УПРАЖНЕНИЕ 2.1.

Выполните два следующих запроса и объясните результаты:

SELECT * FROM cust

WHERE NOT city = \'San Jose\' OR rating > 200;

SELECT * FROM cust

WHERE NOT (city = \'San Jose\' OR rating > 200);



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

SELECT * FROM sal

WHERE city IN (\'Barcelona\', \'London\');



УПРАЖНЕНИЕ 2.2.

Как еще можно выполнить тот же запрос?



Оператор BETWEEN похож на оператор IN, но BETWEEN задает диапазон значений. После ключевого слова BETWEEN вводится начальное значение диапазона, затем ключевое слово AND и конечное значение. Следующая команда будет извлекать всех продавцов с комиссионными от 0.10 до 0.12:

SELECT * FROM sal WHERE comm BETWEEN .10 AND .12;



УПРАЖНЕНИЕ 2.3.

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

диапазона.





Оператор LIKE используется, чтобы находить подстроки в указанном поле таблицы. Этот оператор применим только к полям типа CHAR или VARCHAR. В искомой строке могут использоваться групповые символы (wildkards):

- символ подчеркивания (_) замещает любой одиночный символ,

- знак процента (%) группу из любого числа символов.

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

SELECT * FROM cust WHERE cname LIKE \'_i%\';



УПРАЖНЕНИЕ 2.4.

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

буквой s.



1.3. Агрегатные функции
Агрегатные (общие, многострочные, групповые) функции обрабатывают множества значений всего столбца таблицы или группы строк. Агрегатные функции возвращают одиночное значение. Наиболее употребимы следующие функции:

SUM - арифметическая сумма всех значений столбца

AVG - среднее значение всех значений столбца

MAX - наибольшее значение из всех значений столбца

MIN - наименьшее значение из всех значений столбца



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

<функция> ([ DISTINCT | ALL ] <выражение>)



Агрегатные функции используются подобно именам полей в команде SELECT, при этом они используют имена полей (столбцов) как аргументы. Функции SUM и AVG могут применяться только к числовым полям. С MAX и MIN могут использоваться как числовые, так и символьные поля.

Например, для нахождения суммы всех заказов в таблице ORD можно ввести следующий запрос:

SELECT SUM (amt) FROM ord;



УПРАЖНЕНИЕ 3.1.

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

SELECT MAX(city) FROM sal;

SELECT MIN(city) FROM sal;



Агрегатные функции могут применяться к группам строк при использовании опции GROUP BY. При этом автоматически выполняется разбивка на группы значений в тех столбцах, которые указаны как аргументы в опции GROUP BY. Например, требуется найти наиболее крупный заказ для каждого продавца. Можно сделать раздельный запрос для каждого из них, выбрав MAX(amt) из таблицы Заказов для каждого значения поля snum. Однако GROUP BY позволяет это сделать одной командой:

SELECT snum, MAX(amt) FROM ord

GROUP BY snum;



УПРАЖНЕНИЕ 3.2.

Сравните предыдущий запрос с показанным ниже и поясните

разницу:

SELECT snum, odate, MAX(amt) FROM ord

GROUP BY snum, odate;



Таблицы - это неупорядоченные наборы строк. Для того чтобы выводить данные в желаемой последовательности, SQL использует фразу ORDER BY с опциями ASC и DESC. ASC определяет возрастающий порядок значений поля, а DESC - убывающий. Поля во фразе ORDER BY могут быть указаны по именам или по номерам. Номер указывает позицию поля в команде SELECT, а не в таблице. Упорядочивать можно не только поля, но и группы, определенные фразой GROUP BY. Следующая команда выводит данные о заказах, причем номера покупателей указаны в убывающем порядке:

SELECT amt, odate, cnum FROM ord

ORDER BY cnum DESC;



УПРАЖНЕНИЕ 3.3.

Сравните и объясните результат выполнения предыдущей команды

и команды, указанной ниже:

SELECT amt, odate, cnum FROM ord

ORDER BY cnum DESC, 1 DESC;



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

SELECT cname, sname, sal.city FROM sal, cust

WHERE sal.city = cust.city;



УПРАЖНЕНИЕ 4.1.

Измените предыдущую команду так, чтобы из перечня городов

был исключен Лондон, и сравните результаты запросов.



Объединение таблиц с собой может быть представлено как объединение двух копий одной и той же таблицы. Таблицы на самом деле не копируются, но SQL выполняет команды так, как если бы это было сделано.

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





В следующем примере выбираются все пары покупателей, имеющих один и тот же рейтинг, причем SQL ведет себя так, как если бы он соединял две таблицы - first и second:

SELECT first.cname, second.cname, first.rating

FROM cust first, cust second

WHERE first.rating = second.rating;



УПРАЖНЕНИЕ 4.2.

Сравните и объясните результаты выполнения предыдущей

команды и команды, приведенной ниже:

SELECT first.cname, second.cname, first.rating

FROM cust first, cust second

WHERE first.rating = second.rating

AND first.cname < second.cname;



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

Например, следующий запрос находит всех покупателей, живущих в городах, в которых продавец Motica (с номером 1004) имеет своих покупателей:

SELECT b.cnum, b.cname

FROM cust a, cust b

WHERE a.snum = 1004

AND b.city = a.city;



УПРАЖНЕНИЕ 4.3.

Выполните такой же запрос для продавца Serres и поясните

результат.



Язык SQL позволяет создавать объединения, которые включают и различные таблицы, и псевдонимы одной и той же таблицы. Следующий запрос объединяет таблицу Покупателей с собой, чтобы найти все пары покупателей, обслуживаемых одним продавцом. Кроме того, этот запрос объединяет таблицу Покупателей с таблицей Продавцов по номеру продавца для выбора имени продавца:

SELECT sname, sal.snum, a.cname, b.cname

FROM cust a, cust b, sal

WHERE a.snum = b.snum

AND sal.snum = a.snum;



Если же в предыдущем запросе добавить

AND a.cname <> b.cname;

то можно исключить избыточные строки (т.е. пары покупателей сами с собой).



1.5. Вложенные запросы
Язык SQL позволяет вкладывать один запрос внутрь другого. Чтобы выполнить внешний (основной) запрос, SQL сначала должен выполнить внутренний запрос (подзапрос). Предположим, что требуется извлечь все заказы из таблицы Заказов для продавца Motica. Если мы знаем его номер (1004), то это можно сделать с помощью следующего запроса:

SELECT * FROM ord WHERE snum = 1004;



Допустим, что номер продавца Motica нам неизвестен, тогда можно

использовать подзапрос для решения той же задачи:

SELECT * FROM ord WHERE snum =

(SELECT snum FROM sal WHERE sname = \'Motica\');



УПРАЖНЕНИЕ 5.1.

Получите с помощью подзапроса все заказы покупателя Grass.



В предыдущем примере использован подзапрос, который возвращает единственное значение (одну строку). Для того, чтобы воспользоваться подзапросом, возвращающим больше одного значения, применяют оператор IN. Следующая команда выбирает все заказы для продавцов из Лондона.

SELECT * FROM ord WHERE snum IN

(SELECT snum FROM sal WHERE city = \'London\');



УПРАЖНЕНИЕ 5.2.

Выполните упражнение 5.1 с использованием оператора IN.





1.6. Создание, изменение и удаление таблиц
Команды создания, изменения и удаления таблиц относятся к группе команд SQL, называемой языком определения данных - DDL (Data Definition Language). Таблицы создаются командой CREATE TABLE. В простейшем случае команда определяет имя таблицы, имена столбцов, а также типы и размеры данных для столбцов. В примере показано создание таблицы MYTAB, включающей три столбца:

CREATE TABLE mytab

(col1 INT(3) NOT NULL,

col2 VARCHAR (10) NOT NULL,

col3 DATE);





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



Для удаления таблицы из базы данных можно использовать команду DROP TABLE.



УПРАЖНЕНИЕ 6.1.

Удалите таблицу MYTAB и создайте другую, с именем TAB1 и

с той же структурой. Убедитесь, что в словаре базы данных

указана новая таблица. Выведите ее структуру.



Команда CREATE TABLE создает пустую таблицу. Для наполнения таблицы данными их можно загружать в таблицу при ее создании. Для этого в команде CREATE TABLE используют фразу AS SELECT..., которая позволяет копировать данные из другой, уже существующей таблицы. В этом случае структура создаваемой таблицы будет идентична (полностью или частично) структуре этой другой таблицы.

В следующем примере показано, как при создании таблицы TAB2 в нее загружаются все данные из таблицы SАL:

CREATE TABLE tab2

AS SELECT * FROM sal;



УПРАЖНЕНИЕ 6.2.

Создайте новую таблицу и скопируйте в нее первые два столбца

из таблицы SAL. Выведите структуру и содержимое вновь

созданной таблицы.



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

таблицы. В первом примере добавляется столбец к таблице ТАВ1, во втором - увеличивается размер столбца CITY таблицы ТАВ2:

ALTER TABLE tab1 ADD colnew CHAR(10);

ALTER TABLE tab2 MODIFY city VARCHAR(20);



УПРАЖНЕНИЕ 6.3.

Модифицируйте таблицу, которую вы создали в упражнении 6.2

следующим образом: увеличьте размер второго столбца, добавьте

два новых столбца к таблице. Выведите структуру таблицы

после модификации.



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

INSERT INTO tb1

VALUES (100, 1012, NULL, NULL);



В следующем примере показан второй вариант команды INSERT: команда вставляет строки в таблицу TAB2, копируя их из таблицы SAL

INSERT INTO tab2

SELECT * FROM sal;



УПРАЖНЕНИЕ 7.1.

Создайте две таблицы с одинаковой структурой. Вставьте

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

команды INSERT. Скопируйте строки из первой таблицы во

вторую, применив второй вариант команды.



Для удаления строк из таблиц можно использовать команды DELETE и TRUNCATE. При помощи команды DELETE можно удалить все строки из таблицы (если не использовать фразу WHERE) или только строки, удовлетворяющие условию во фразе WHERE. Команда TRUNCATE всегда удаляет все строки из таблицы.

Примеры:

DELETE FROM tab1;

DELETE FROM tab2 WHERE snum=1003;

TRUNCATE TABLE tab2;



УПРАЖНЕНИЕ 7.2.

Удалите все строки из первой таблицы, созданной

в упражнении 7.1. В вашей копии таблицы Продавцов (TAB2)

удалите только одну строку, в которой город - San Jose.



Для изменения полей существующих в таблице строк используют команду UPDATE. Эта команда обновляет поля для всех строк, удовлетворяющих условию во фразе WHERE. В следующем примере команда изменяет название города:

UPDATE tab2

SET city = \'Paris\'

WHERE snum = \'1002\';



УПРАЖНЕНИЕ 7.3.

Скопируйте таблицу SAL под именем MYSAL и увеличьте

в своей копии комиссионные на 0.01 у продавцов, работающих

в городе Лондон.



2 Конторольные вопросы
1.Назовите команды, позволяющие просматривать содержимое таблиц и получать информацию об их структуре.

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

3.Каким образом агрегатные функции применяются к группам строк?

4.Для чего служит механизм определения псевдонимов таблиц?

5.Назовите команды создания, изменения и удаления таблиц.

6.Перечислите команды изменения данных в таблицах.


3 Задание
В файл z1-1.txt занесите ответы на следующие вопросы:

Напишите запрос, который выводит все строки из таблицы Покупателей, для которых номер продавца равен 1001.
Напишите запрос, который выводит таблицу Продавцов со столбцами в следующем порядке: city, sname, snum, comm.
Напишите запрос, который выводит оценку (rating), сопровождаемую именем каждого покупателя в городе San Jose.
Напишите запрос, который выводит значение номера продавца всех продавцов из таблицы Заказов без каких бы то ни было повторений.
Напишите запрос, который может выдать вам поля sname и city для всех продавцов в Лондоне с комиссионными строго больше 0.11
Напишите запрос к таблице Покупателей, который может вывести данные обо всех покупателях с рейтингом меньше или равным 200, если они не находятся в Риме
Запросите двумя способами все заказы на 3 и 5 октября 1990 г.
Напишите запрос, который может вывести всех покупателей, чьи имена начинаются с буквы, попадающей в диапазон от A до G.
Напишите запрос, который выберет всех продавцов, имена которых содержат букву e.
Напишите запрос, который сосчитал бы сумму всех заказов на 3 октября 1990 г.
Напишите запрос, который сосчитал бы сумму всех заказов для продавца с номером 1001
Напишите запрос, который выбрал бы наибольший заказ для каждого продавца.
Напишите запрос, который выбрал бы покупателя, чье имя является первым в алфавитном порядке среди имен, заканчивающихся на букву s.
Напишите запрос, который выбрал бы средние комиссионные в каждом городе.
Напишите запрос, который вывел бы для каждого заказа на 3 октября его номер, стоимость заказа в евро (1$=0.8 евро), имя продавца и размер комиссионных, полученных продавцом за этот заказ.
Напишите запрос, который выводит номера заказов в возрастающем порядке, а также имена продавцов и покупателей заказов, продавец которых находится в Лондоне или Риме.
Запросите имена продавцов в алфавитном порядке, суммарные значения их заказов, совершенных до 5 октября, и полученные комиссионные.
Выведите номера заказов, их стоимость и имена продавцов и покупателей, если продавцы и покупатели находятся в городах, чьи названия начинаются с букв из диапазона от L до R.
Запросите все пары покупателей, обслуживаемые одним и тем же продавцом. Исключите комбинации покупателей с самими собой, а также пары в обратном порядке.
С помощью подзапроса выведите имена всех покупателей, чьи продавцы имеют комиссионные меньше 0.13.
Напишите команду, создающую копию таблицы Продавцов с одновременным копированием данных из SAMPLE.SAL. Убедитесь в сходности структур таблиц при помощи команды DESC и идентичности данных в таблице-оригинале и таблице-копии.
Напишите последовательность команд, которая вставляет две новые записи в вашу таблицу Продавцов, выводит таблицу после вставки, удаляет одну запись о новом продавце и вновь выводит таблицу.
Напишите последовательность команд, которая вставляет две строки в вашу таблицу Продавцов, увеличивает в 2 раза комиссионные у всех продавцов и выводит содержимое таблицы после каждого изменения.

1 Теоретический материал
1.0. Краткие сведения о PHP и о запуске программ
Что такое РНР?

РНР — это язык программирования, который давно уже перерос свое название. Дело в том, что первоначально это был просто набор макросов, предназначенных для создания несложных личных web-страниц, и название РНР — не более чем аббревиатура от слов Personal Home Page (личная домашняя страница). Но со временем набор макросов превратился в полноценный язык программирования, с помощью которого можно создавать развитые web-узлы, обменивающиеся информацией с современными базами данных.

В настоящее время создатели РНР называют его обработчиком гипертекста (HyperText Preprocessor) Это язык программирования, используемый на стороне сервера (server side scripting language), конструкции которого вставляются в HTML-текст.


Рисунок 1

В отличие от обычного HTML-текста web-страницы, программа на РНР не передается браузеру, но обрабатывается препроцессором РНР или его модулями (рисунок 1). Фрагменты HTML-текста при этом остаются без изменений, а операторы РНР выполняются и результат их обработки вставляется в HTML-текст, после чего все вместе передается браузеру. Программа на РНР может делать запрос к базе данных, создавать графические изображения, читать и записывать файлы, общаться с внешними серверами, то есть возможности такой программы практически не ограничены.

Как запускать PHP-программы:

1. На созданном после установки сервера диске Z: в директории Z:\\home\\localhost\\www\\ создаем рабочую директорию, например /work-php/

2. Заносим в нее предназначенные для запуска файлы (разумеется, в рабочей директории допустимо создание поддиректорий)

3. Запускаем файлы, набрав в командной строке Вашего просмотрщика Internet Explorer путь к файлу (начинающийся как http://localhost/work-php/) и нажав "Enter" (не забудьте при этом убедиться в том, что сервер запущен!)

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


1.1. Вывод данных на экран и взаимодействие PHP с HTML
Рассмотрим конструкции языка РНР на примере простейшей РНР-программы. Как и HTML-документы, РНР-программы состоят из простого текста, поэтому писать их можно с помощью любого текстового редактора — Блокнота, если вы работаете в Windows, VI или Emacs в системе UNIX. Популярные HTML-редакторы имеют встроенную поддержку для редактирования РНР-текста.

Введите текст из листинга 1.1 и сохраните файл, дав ему имя ls1-1.php.

Листинг 1.1. Наша первая РНР-программа




<?php

print "Hello, Web!";

?>




У этого файла должно быть правильное расширение, потому что на основании этого сервер распознает файл как РНР-программу и запустит интерпретатор. По умолчанию в РНР расширение файлов программ должно быть .php.

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

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

Обрамление блока РНР-команд

При написании РНР-программы вы должны сообщить интерпретатору, как отличить команды, которые он должен обрабатывать, от простого HTML-текста. В противном случае команды будут приняты за HTML-текст и переданы браузеру. В таблице 1.1 перечислены четыре способа обрамления РНР-команд.

Таблица 1.1

Вид тегов

Открывающий тег

Закрывающий тег

Стандартные

<?php

?>

Короткие

<?

?>

ASP

<%

%>

Программные

<SCRIPT LANGUAGE="php">

</SCRIPT>



Из перечисленных в таблице 1.1 тегов только стандартные и программные гарантированно работают в любой конфигурации РНР. Использование коротких тегов и тегов ASP должно быть явно разрешено в файле php.ini.

После того как вы отредактировали файл php.ini, можете пользоваться в своих программах любым из перечисленных видов тегов. Это в значительной степени вопрос вкуса или привычки, но если собираетесь писать свои страницы на языке XML, вам следует запретить использование коротких тегов (<? ?>) и пользоваться стандартными (<?php ?>).

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

<? print "Hello, Web!"; ?>

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

Функция print()

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

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

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

Взаимодействие HTML и РНР

Программа в листинге 1.1 состоит только из команд РНР. Однако можно создать смешанный документ, добавив теги HTML перед открывающим и после закрывающего тегов РНР. Пример этого приведен в листинге 1.2.

Листинг 1.2. Документ, содержащий РНР-команды и HTML-текст




<html> <head>
<title> Листинг 1-2. Документ, содержащий РНР-команды
и HTML-текст </title>
</head> <body>

<p><i>Проверка</i>

<?php
print "<p><font color=\\"blue\\">PHP работает!</font>";
?>

</body> </html>




Интерпретатор игнорирует все, что находится вне тегов РНР. Если вы отобразите этот документ на экране браузера, то увидите слова «Проверка» и «PHP работает!», выделенные, соответственно, курсивом и синим цветом. Обратите внимание на обратную косую черту перед двойными кавычками. Это так называемое экранирование, оно применяется для того, чтобы кавычки, стоящие в HTML-тегах внутри аргумента функции print(), не обрабатывались интерпретатором PHP, а выводились просто как символы. Если вы посмотрите в браузере исходный текст этой страницы, он будет выглядеть точно так же, как обычный HTML-документ, уже без команд PHP.

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

Комментарии в РНР-программе

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

Отдельная строка комментария начинается двумя символами косой черты // или одним символом #. Любой текст от этих знаков до конца строки или до закрывающего тега РНР игнорируется.

// Это комментарий.

# Это тоже комментарий.

Несколько строк комментариев начинаются парой символов /* и заканчиваются парой */.

/*

Это комментарии.
Все эти строки будут проигнорированы интерпретатором.
*/

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


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

$а; $a_long_variable_name; $_2453;

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

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

$num1 = 8; $num2 = 23;

В приведенном примере созданы две переменные, и с помощью оператора присваивания в них записаны значения. Об операторе присваивания мы поговорим ниже. После того как переменной присвоено значение, ею можно пользоваться точно так же, как и самим значением. Другими словами, выражение print($num1) эквивалентно выражению print(8), если значение переменной $num1 равно 8.

Строковое присваивание

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

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

Два следующих присваивания дают одинаковый результат:

$user = "Ник";

$user = \'Ник\';

Однако результаты следующих присваиваний сильно различаются:

$var1 = "Мой друг $user";

$var2 = \'Мой друг $user\';

Переменной $var1 присваивается строка

Мой друг Ник.

Обратите внимание: переменная $user автоматически интерпретируется. С другой стороны, переменной $var2 присваивается строка

Мой друг $user.

В отличие от переменной $var1, в $var2 переменная $user осталась просто как последовательность символов. Эти различия как раз и обусловлены использованием либо кавычек, либо апострофов.

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

Таблица 2.1 — Служебные символы в строках

Последовательность

Описание

\\n

Новая строка

\\r

Перевод строки

\\t

Горизонтальная табуляция

\\\\

Обратная косая черта как символ

\\$

Знак доллара как символ

\\"

Кавычка как символ

\\\'

Апостроф как символ


Служебные символы \\n, \\r и \\t используются лишь для создания удобочитаемого HTML-файла, на вывод текста в браузере они никак не влияют.

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

print "первая строка \\r вторая строка";

print \'первая строка \\r вторая строка\';

Если вывести обе строки в браузере, окажется, что в строке в кавычках, в HTML-файле («Просмотр в виде HTML»), будет выполнен перевод строки, хотя на экране все будет в одной строке: «первая строка вторая строка». А в строке в апострофах последовательность \\r выведется на экран как обычные символы. Помните об этом, выбирая между кавычками и апострофами, и вам удастся избежать многих неожиданностей.

Динамические переменные

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

$client = "user"; $$client = "Nic";

эквивалентны следующей записи

$user = "Nic";

В переменной $client записана строка "user", поэтому можно представить себе, что выражение $$client — это знак $, за которым следует значение переменной $client. Все вместе РНР интерпретирует это как $user.

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

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

$user = "Nic"; print $user;

Это эквивалентно следующему:

$user = "Nic"; $client = "user"; print $$client;

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

$user = "Nic"; $client = "user"; print "$$client";

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

В листинге 2.1 все сказанное объединено в программу, в которой с помощью строки, хранящейся в переменой, создается и инициализируется новая переменная $user.

Листинг 2.1. Создание динамической переменной
и обращение к ней




<html> <head>
<title> Листинг 2-1. Создание динамической переменной
и обращение к ней
</title> </head> <body>

<?php

$client = "user";

$$client = "Nic"; // <=> $user = "Nic";

print "1) $client<br>"; //выводится user
print \'2) $client<br>\'; //выводится $client
print "3) $user<br>"; //выводится Nic
print "4) $$client<br>"; //выводится $user
print "5) "; print $$client; //выводится Nic
?>
</body> </html>




Ссылки на переменные

Обычно переменным присваиваются значения других переменных. Другими словами, если вы присвоите значение переменной $var1 другой переменной, $var2, то копия значения первой переменной будет записана во вторую. В дальнейшем никакие изменения значения первой переменной никак не отразятся на значении второй.

Но в РНР можно сделать по-другому, заставив переменную $var2 постоянно иметь то же самое значение, что и у переменной $var1. Это продемонстрировано в листинге 2.2.

Листинг 2.2. Создание ссылки на переменную




<html> <head>
<title> Листинг 2-2. Создание ссылки на переменную </title> </head> <body>

<?php

$var1 = 1;
$var2 = &$var1;
$var1 = 10;
print $var2; //выводится 10

?>
</body> </html>




Символ & перед именем переменной $var1 говорит о том, что мы создаем ссылку на эту переменную, и теперь все изменения ее значения отразятся на значении переменной $var2. Другими словами, обе эти переменные связаны с одним и тем же значением.

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


1.3. Типы данных
Различные типы данных занимают разный объем памяти и обработка разных типов выполняется по-разному. Поэтому некоторые языки программирования требуют от программиста, чтобы он заранее объявил, для какого типа данных предназначена та или иная переменная. РНР не имеет таких строгих требований по типам данных, т.е. он будет обрабатывать переменную в зависимости от того, какого типа значение в нее записано. Такой подход имеет как достоинства, так и недостатки. С одной стороны, программист может использовать переменные гибко, храня в них данные, необходимые в настоящий момент. Но, с другой стороны, такая свобода действий может привести к появлению ошибок, которые трудно обнаружить, особенно в больших программах, когда в переменной записано совсем не то, что ожидает там найти программист.

В таблице 3.1 перечислены шесть типов данных, поддерживаемые в языке РНР.

Таблица 3.1 — Типы данных

Тип

Пример

Описание

Integer

5

Целое число

Double

3.234

Число с плавающей точкой

String

"hello"

Строка символов

Boolean

true

Логический, принимающий значения true
или false

Array

$a[10]

Массив

Object



Объект (элемент ООП)



Проверка и изменение типа переменной

В языке РНР есть функция, с помощью которой можно проверить тип переменной. Если вы вызовете функцию gettype(), передав ей в качестве аргумента имя переменной, то получите строку, описывающую тип этой переменной. Кроме того, существует функция settype(), служащая для изменения типа переменной. Для того чтобы изменить тип переменной, вы должны при вызове этой функции указать переменную, тип которой вы хотите изменить, и новый тип данной переменной. В листинге 3.1 приведен пример того, как с помощью функций gettype() и settype() проверяется и изменяется тип переменной $var поочередно для нескольких рассматриваемых типов.

Листинг 3.1. Проверка и изменение типа переменной




<html> <head>
<title> Листинг 3-1. Проверка и изменение типа переменной
</title> </head> <body>

<?php

$var = 3.14;

print gettype($var); // double
print " - $var<br>"; // 3.14

settype($var, "string");

print gettype($var); // string
print " - $var<br>"; // 3.14

settype($var, "integer");

print gettype($var); // integer
print " - $var<br>"; // 3

settype($var, "double");

print gettype($var); // double
print " - $var<br>"; // 3

settype($var, "boolean");

print gettype($var); // boolean
print " - $var<br>"; // 1

?>
</body> </html>




Каждый раз после изменения типа переменной мы проверяем ее новый тип для того, чтобы убедиться, что все сработало правильно, и выводим значение переменной в окно браузера. Когда мы преобразовали строку "3.14" в целое число, дробная часть числа оказалась отброшенной навсегда, поэтому значение переменной $var осталось равным 3, после того как мы преобразовали ее в действительное число. В конце концов мы преобразуем переменную в тип boolean, и ее значение становится равным 1, так как все значения, отличные от нуля, в таком случае преобразуются в 1. При выводе на печать логической переменной значение true выводится как 1, а значение false — как пустая строка.

Преобразование типа переменной

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

Листинг 3.2. Преобразование типа переменной




<html> <head>
<title> Листинг 3-2. Преобразование типа переменной </title> </head> <body>

<?php

$var = 3.14;

$var2 = (double) $var;
print gettype($var2); // double
print " - $var2<br>"; // 3.14

$var2 = (string) $var;
print gettype($var2); // string
print " - $var2<br> "; // 3.14

$var2 = (integer) $var;
print gettype($var2); // integer
print " - $var2<br>"; // 3

$var2 = (double) $var;
print gettype($var2); // double
print " - $var2<br>"; // 3.14

$var2 = (boolean) $var;
print gettype($var2); // boolean
print " - $var2<br>"; // 1

?>
</body> </html>




В этом примере мы не изменяем тип самой переменной $var — он всегда остается double. На самом деле мы каждый раз создаем временную копию нового типа и ее значение присваиваем переменной $var2. Поскольку мы работаем только с копией переменной $var, ее значение не изменяется, как это происходило в предыдущем примере в листинге 3.1.


1.4. Операторы и выражения
Оператором называют символ или последовательность символов, с помощью которых можно из нескольких переменных получить новое значение. Те значения, к которым применяются операторы для получения новых значений, называются операндами.

Комбинация операндов и операторов, производящая некоторое значение, называется выражением. Однако не обязательно для образования выражения использовать операторы. Выражением в РНР считается все, что имеет некоторое значение. Например, константа 654, или переменная $user, или функция gettype() — все это выражения. Таким образом, выражение (4+5) состоит из двух выражений и одного оператора.

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

Теперь рассмотрим некоторые операторы РНР.

Оператор присваивания

Вы уже встречали оператор присваивания каждый раз, когда мы говорили о создании переменной. Этот оператор состоит из знака «равно» (=). Оператор присваивания записывает значение своего правого операнда в левый операнд:

$name = "Nic";

Теперь в переменной $name записана строка "Nic". Обратите внимание на то, что эта конструкция представляет собой выражение. На первый взгляд может показаться, что оператор присваивания просто записывает значение в переменную, но это не совсем так. На самом деле при выполнении оператора присваивания создается временная копия его правого операнда, и все выражение получает значение этой копии. Таким образом, следующая конструкция не только присваивает значение переменной, но и выводит в окно браузера строку "Nic".

print ($name = "Nic");

Арифметические операторы

Арифметические операторы языка РНР перечислены в таблице 4.1. Оператор «%» вычисляет остаток от целочисленного деления левого операнда на правый.

Таблица. 4.1 — Арифметические операторы

Оператор

Название

Пример

Результат

+

Сложение

10+3

13

-

Вычитание

10-3

7

*

Умножение

10*3

30

/

Деление

10/3

3.333333333

%

Остаток от деления

10%3

1



Оператор конкатенации

Символ оператора конкатенации — простая точка. Этот оператор объединяет две строки, точнее, присоединяет правую строку к левой. Таким образом, выражение

"hello"."world"

имеет значение

"hello world"

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

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

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

Например, пусть требуется переменной $х присвоить значение 7 следующим образом:

$х = 3;
$х = $х+4;

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

$х = 3;
$х +=4;

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

Эти операторы перечислены в таблице 4.2.

Таблица 4.2 — Дополнительные операторы присваивания

Оператор

Пример

Эквивалентная запись

+=

$х += 5

$х = $х + 5

-=

$х -= 5

$х = $х - 5

/=

$х /= 5

$х = $х / 5

*=

$х *= 5

$х = $х * 5

%=

$х %= 5

$х = $х % 5

.=

$х .= "test"

$х = $x."test"



Операторы сравнения

Операторы сравнения возвращают значение true, если сравнение своих операндов успешно, и false — в противном случае. Условные выражения, образуемые с помощью таких операторов, часто применяются в таких командах, как if или while.

Операторы сравнения перечислены в таблице 4.3.

Таблица. 4.3 — Операторы сравнения

Оператор

Название

Условие выполнения

Пример

Результат при $x, равном 3

==

Равенство

Левый операнд равен правому

$х == 5

false

!=

Неравенство

Левый операнд не равен правому

$х != 5

true

===

Идентичность

Операнды равны
и их типы совпадают

$х === 5

false

>

Больше чем

Левый операнд больше правого

$х > 3

false

>=

Больше или равно

Левый операнд больше правого
или равен ему

$х >= 3

true

<

Меньше чем

Левый операнд меньше правого

$х < 3

false

<=

Меньше или равно

Левый операнд меньше правого
или равен ему

$х <= 3

true



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

Логические операторы

Логические операторы предназначены для построения логических выражений. Например, логическое ИЛИ возвращает значение true, если хоть один из его операндов имеет значение true. Таким образом, выражение

true || false

имеет значение true.

Логическое И возвращает true, если оба операнда имеют значение true. Таким образом, выражение

true && false

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

($х > 2) && ($х <15)

имеет значение true, если значение $х <находится в интервале между 2 и 15. Скобки в этом выражении расставлены просто для того, чтобы выражение легче читалось. Логические операторы перечислены в таблице. 4.4.

Таблица 4.4 — Логические операторы

Оператор

Назва-
ние

Условие истинности

Пример

Результат

||

ИЛИ

Хотя бы один из операндов истинен

true || false

true

OR

ИЛИ

Хотя бы один из операндов истинен

true OR false

true

ХОR

Исклю-чающее ИЛИ

Только один из операндов истинен

true XOR true

false

&&

И

Оба операнда истинны

true && false

false

AND

И

Оба операнда истинны

true AND false

false

!

НЕ

Операнд не истинен

!true

false



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

Логические операторы часто используются для проверки результата вызова функций:

file_exists("ris.gif") OR print "Файл не найден!";

Увеличение и уменьшение целой переменной

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

$х = $х + 1; // увеличение $x на 1

То же самое можно сделать с помощью дополнительного оператора присваивания:

$х += 1; // увеличение $х на 1

В обоих случаях переменной $х присваивается новое значение. Выражения такого типа встречаются настолько часто, что в языке РНР предусмотрены специальные операторы для увеличения или уменьшения значения целой переменной на 1. Эти операторы бывают двух типов — префиксные (pre-decrement и pre-increment) и постфиксные (post-decrement и post-increment).

Постфиксный оператор выглядит как два знака «-» или «+» после имени переменной.

$х++; // увеличение $х на 1

$х--; // уменьшение $х на 1

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

$х = 3;

$х++ < 4; // выражение истинно

В этом примере значение переменной $х при ее сравнении с константой 4 равно 3, поэтому условие выполняется, и значение условного выражения равно true. После вычисления выражения значения переменной увеличивается.

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

++$х; // увеличение $х на 1

--$х; // уменьшение $х на 1

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

$х = 3;

++$х < 4; // выражение ложно

В этом случае при сравнении переменной $х с константой 4 значение переменной уже равно 4, т.е. оно не меньше 4, а следовательно, выражение ложно.

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

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

Таблица 4.5 — Порядок вычисления операторов

++ --

/ * %

+ -

< <= => >

== === !=

&&

||

= += -= /= *= %= .=

AND

ХОR

OR



Как видно из этой таблицы, оператор OR имеет более низкий, уровень старшинства, чем ||, а оператор AND — более низкий, чем &&. Таким образом, вы можете пользоваться этим для изменения порядка вычисления своих выражений. Однако здесь легко запутаться и сделать ошибку. Например, следующие два выражения эквивалентны, но второе гораздо проще для понимания.

$х && $y || $z

($х AND $y) OR $z


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

define("PI", "3.141592");

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

Листинг 5.1. Создание константы




<html> <head>
<title> Листинг 5-1. Создание константы </title>
</head> <body>

<?php

define ("PI", "3.141592");

print "Число Пи равно ".PI."<br>";

$pi2 = PI*PI;

print "Пи в квадрате равно $pi2";
?>
</body> </html>




Обратите внимание на то, что для присоединения константы к строке "Число Пи равно " мы применили оператор конкатенации, а для того, чтобы вычислить значение константы в квадрате пришлось использовать дополнительную переменную.


1.6. Условные операторы
Большинство программ изменяют свое поведение в зависимости от изменяющихся условий, и для этого им приходится вычислять значения некоторых выражений. Как и многие другие языки программирования, РНР осуществляет это с помощью оператора if.

Оператор if с блоком else

При выполнении оператора if вычисляется выражение в скобках. Если значение этого выражения равно true, то блок программы выполняется.

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

if (выражение) {
// этот фрагмент выполняется, если выражение истинно
}

else {
// этот фрагмент выполняется, если выражение ложно
}

В листинге 6.1 приведен пример использования условного оператора.


Листинг 6.1. Оператор if с блоком else




<html> <head>
<title> Листинг 6-1. Оператор if с блоком else </title>
</head> <body>

<?php

$var = "плохо";
if ($var == "хорошо")
{print "Я в хорошем настроении!";}
else {print "Мне $var";}

?>
</body> </html>




В переменной $var записана строка "плохо" — она не совпадает со строкой "хорошо", поэтому условие не выполняется. Это означает, что первый блок команд пропускается и выполняется блок команд, следующий за словом else. Соответствующее сообщение выводится на экран браузера.

Блок elseif оператора if

С помощью конструкции if-elseif-else можно проверить несколько условий перед тем, как выполнить фрагмент программы.

if (выражение_1) {
// этот фрагмент выполняется, если выражение истинно
}

elseif (выражение_2) {
// этот фрагмент выполняется, если выражение_1 ложно,
// а выражение_2 истинно
}

else {
// этот фрагмент выполняется во всех остальных случаях
}

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

Пример приведен в листинге 6.2.

Листинг 6.2. Использование блоков else и elseif




<html> <head>
<title> Листинг 6-2. Использование блоков else и elseif </title> </head> <body>

<?php

$var = "плохо";

if ($var == "хорошо") {print "Я в хорошем настроении!";}

elseif ($var == "плохо") {print "He отчаиваться!";}

else {print "Непонятно, просто $var";}

?>
</body> </html>




Как и раньше, в переменной $var записана строка "плохо". Она не совпадает со строкой "хорошо", поэтому первый блок игнорируется. В блоке elseif переменная $var сравнивается со строкой "плохо" и, поскольку это выражение истинно, выполняется блок elseif.

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

$var = "плохо";

то тогда значение этой переменной должно задаваться при вызове скрипта в виде:

ls6-1.php?var=так+себе

т.е. после имени скрипта идет знак вопроса, затем имя переменной, знак «равно» и значение переменной. Причем, если значением переменной является строка, содержащая пробелы, то они должны заменяться на знак «+». Такая замена в скрипте может выполняться с помощью функции urlencode(), которая возвращает строку, в которой все не алфавитно-числовые символы (кроме минуса, подчерка и точки) заменены на знак процентов (%) с последующими двумя 16-ричными цифрами, а пробелы заменены на знаки плюс (+).

Оператор switch

Оператор switch — это еще один способ изменить поток выполнения программы в зависимости от значения некоторого выражения. Между операторами switch и if есть существенная разница. С помощью оператора if и блока elseif вы можете для принятия решения вычислить несколько выражений, а оператор switch вычисляет только одно выражение, но в зависимости от его значения выполняет один из нескольких блоков программы. Выражение в операторе if может быть только истинным или ложным, а выражение оператора switch может принимать много значений, но они должны быть простого типа, т.е. целое, или строка, или булево значение.

switch (выражение) || case выражение of (в Паскале)
{
case значение_1: || значение: оператор; (в Паскале)
// выполняется, если выражение равно значение_1
break;

case значение_2:
// выполняется, если выражение равно значение_2
break;

default: || else оператор (в Паскале)
// выполняется, если выражение не приняло
// ни одного из перечисленных значений
}

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

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

В листинге 6.3 приведен пример использования оператора switch.

Листинг 6.3. Оператор switch




<html> <head>
<title> Листинг 6-3. Оператор switch </title>
</head> <body>

<?php

$var = "плохо";

switch ($var) {

case "хорошо":
print "Я в хорошем настроении!";
break;

case "плохо":
print "He отчаиваться!";
break;

default:
print "Непонятно, просто $var";

}
?>
</body> </html>




Как и раньше, в переменной $var записана строка "плохо". Эта переменная используется в качестве выражения в операторе switch. В первом блоке case проверяется совпадение этой переменной со строкой "хорошо". Совпадения нет, поэтому выполнение программы переходит ко второму блоку case. Здесь значение переменной $var совпадает со строкой "плохо" и, следовательно, выполняются соответствующие команды. Заканчивается все командой break.

Оператор ?

Оператор ? возвращает значение одного из двух выражений, разделенных знаком двоеточия. Какое из двух выражений сформирует возвращаемое значение — зависит от истинности тестового выражения.

(тестовое_выражение) ? выражение_1: выражение_2;

Если тестовое выражение принимает значение true, то возвращается значение первого выражения; в противном случае возвращается значение второго выражения. В листинге 6.4 приведен пример использования оператора ?, возвращаемое значение которого зависит от значения переменной $var.

Листинг 6.4. Оператор ?




<html> <head>
<title> Листинг 6-4. Оператор ? </title>
</head> <body>

<?php

$var = "плохо";

$text = ($var == "хорошо") ? "Хорошо!" : "Мне $var";

print "$text";

?>

</body> </html>




В переменной $var записана строка "плохо". Значение этой переменной сравнивается со строкой "хорошо". Поскольку совпадения не происходит, возвращается второе из значений.

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



1.7. Циклы
Циклы служат для многократного повторения фрагмента программы.

Цикл while

Цикл while работает аналогично оператору while..do языка Паскаль.

while (выражение) {
// тело цикла
}

До тех пор, пока выражение в скобках истинно, тело цикла выполняется. Как правило, при этом некоторым образом изменяется какая-то переменная или переменные от которых зависит значение выражения в скобках. Если такой зависимости нет, то цикл будет выполняться бесконечно. В листинге 7.1 приведен пример цикла, который выводит таблицу умножения на 2.

Листинг 7.1. Цикл while



<html> <head>
<title> Листинг 7-1. Цикл while </title>
</head> <body>

<?php

$count = 1;

while ($count <= 10)
{
print "$count умножить на 2 будет ".($count*2)."<br>";

$count++;
}

?>

</body> </html>



Здесь мы инициализируем переменную $count. В условном выражении цикла проверяется ее значение. До тех пор, пока значение переменной меньше или равно 10, цикл выполняется. В теле цикла переменная $count умножается на 2 и выводится в окно браузера. После этого ее значение увеличивается на 1. Данный момент особенно важен. Если вы забудете это сделать, то условное выражение цикла никогда не станет ложным и цикл будет выполняться бесконечно.

Цикл do..while

Цикл do..while напоминает цикл while, перевернутый с ног на голову. Разница состоит в том, что цикл do..while сначала выполняется, а потом проверяется истинность его условия (совершенно аналогично циклу repeat..until языка Паскаль).

do {
// тело цикла
}
while (выражение);

Тестовое выражение цикла do..while обязательно должно заканчиваться точкой с запятой.

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

Листинг 7.2. Цикл do..while



<html> <head>
<title> Листинг 7-2. Цикл do..while </title>
</head> <body>

<?php

$num = 1;

do
{
print "Номер прохода: $num<br>\\n";
$num++;
}

while ($num > 200 && $num < 400);

?>

</body> </html>



В условии этого цикла проверяется значение переменной $num, а именно — находится ли оно в интервале от 200 до 400. Поскольку мы инициализировали переменную значением 1, условие ложно, но, несмотря на это, цикл выполнится один раз и отправит на браузер одну строку.

Цикл for

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

for (инициализация; условие; приращение)
{
//тело цикла
}

Выражения в скобках должны быть разделены точками с запятой. В первом выражении счетчику цикла присваивается некоторое начальное значение (инициализация), во втором выражении проверяется условие цикла, а в третьем выражении происходит увеличение или уменьшение счетчика. В листинге 7.3 приведен пример использования цикла for, в котором первые 10 натуральных чисел умножаются на 2.

Листинг 7.3. Цикл for



<html> <head>
<title> Листинг 7-3. Цикл for </title>
</head> <body>

<?php

for ($count = 1; $count <=10; $count ++ )
{print "$count умножить на 2 будет ".($count*2)."<br>";
}

?>
</body> </html>



Результат работы программ из листинга 7.1 и 7.3 совершенно одинаков, однако вторая программа выглядит компактнее. Благодаря тому, что счетчик цикла инициализируется и увеличивается в первой строке цикла, логика программы понятнее и проще.

Когда программа доходит до цикла for, инициализируется счетчик цикла и проверяется его условие. Если значение условия равно true, цикл выполняется. После выполнения всего тела цикла его счетчик изменяется и условие проверяется опять. Этот процесс продолжается до тех пор, пока условие не станет ложным.

Прерывание циклов командой break

В циклах for и while присутствует условие, которое определяет продолжительность выполнения цикла. Однако такое выполнение можно прервать досрочно с помощью команды break. Как правило, для этого проверяется некоторое дополнительное условие. Это обычно делается при обнаружении ошибочного состояния. В листинге 7.4 приведен пример программы, в которой одно большое число делится в цикле на другое, постоянно возрастающее, и результат этого деления выводится на экран браузера. В этом примере начальное значение счетчика цикла задано независимо от цикла (до него) и в проверочном выражении цикла for сравнивается с числом 10.

Казалось бы, все в порядке. Однако, поскольку начальное значение пере

Комментарии: 22.04.23 зачет проверено Барахнин В.Б

Размер файла: 11 Кбайт
Фаил: Упакованные файлы (.zip)
-------------------
Обратите внимание, что преподаватели часто переставляют варианты и меняют исходные данные!
Если вы хотите, чтобы работа точно соответствовала, смотрите исходные данные. Если их нет, обратитесь к продавцу или к нам в тех. поддержку.
Имейте ввиду, что согласно гарантии возврата средств, мы не возвращаем деньги если вариант окажется не тот.
-------------------

   Скачать

   Добавить в корзину


    Скачано: 1         Коментариев: 0


Не можешь найти то что нужно? Мы можем помочь сделать! 

От 350 руб. за реферат, низкие цены. Просто заполни форму и всё.

Спеши, предложение ограничено !



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

Страницу Назад

  Cодержание / Базы данных / Лаб№1. « ЯзыкMySQL» Лаб№2. «Основные конструкции языка PHP» Лаб№3. «Обработка форм»
Вход в аккаунт:
Войти

Забыли ваш пароль?

Вы еще не зарегистрированы?

Создать новый Аккаунт


Способы оплаты:
UnionPay СБР Ю-Money qiwi Payeer Крипто-валюты Крипто-валюты


И еще более 50 способов оплаты...
Гарантии возврата денег

Как скачать и покупать?

Как скачивать и покупать в картинках


Сайт помощи студентам, без посредников!