- •1. Основні технології розробки web-додатків
- •1.1 Протокол http
- •Основні технології розробки web-додатків
- •1.3 Короткі підсумки
- •2 Структура html-документа
- •2.1. Елементи мови html
- •2.2 Структура html-документа
- •2.2.1.Початок
- •2.2.2 Тіло документа
- •Заголовки
- •Нижче на малюнку показаний результат використання наступних заголовків:
- •Списки в html
- •2.3 Використання графіки в html
- •2.4 Таблиці
- •Атрибут border. Значення цього атрибута визначає як будуть виглядати рамки таблиці. Якщо атрибут не заданий або його значення дорівнює нулю, то таблиця не матиме рамок.
- •2.5 Html-форми Форми використовуються в www для передачі інформації від клієнта до сервера.
- •3 Каскадні таблиці стилів css
- •3.1 Загальні відомості про css
- •3.2 Додавання стилю на веб-сторінку
- •3.2.1. Таблиця пов'язаних стилів
- •3.2.2 Таблиця глобальних стилів
- •3.2.3 Внутрішні стилі
- •3.3 Синтаксис css
- •3.3.1 Властивості css
- •3.3.2 Селектори тегів
- •3.3.3 Селектори класів
- •3.3.4 Селектори-ідентифікатори
- •3.3.5 Контекстні селектори
- •3.3.6 Сусідні селектори
- •3.3.7 Дочірні селектори
- •Селектор зі значенням атрибута – встановлює стиль елемента в тому випадку, якщо задано певне значення зазначеного атрибута. Синтаксис застосування наступний.
- •Наприклад:
- •3.3.9 Універсальний селектор
- •3.4 Псевдокласи
- •3.4.2 Короткі підсумки
- •4 Типи і структури даних в javascript
- •Скрипт в html документі
- •4.2 Змінні та літерали
- •4.2.1 Літерали
- •4.3 Оператори JavaSscript
- •4.3.2 Оператор обробки рядків
- •4.3.3 Оператор typeof Аргументом оператора є змінна або вираз. Оператор повертає рядок, що описує тип аргументу(див. Табл. 4.4).
- •4.3.4 Умовний оператор (Оператор If)
- •4.3.5 Оператор перемикання (switch)
- •4.3.6 Оператори циклу
- •4.4 Масиви
- •Метод reverse () – застосовується для зміни на протилежний порядок елементів масиву всередині масиву. Припустимо, масив натуральних чисел впорядкований по зростанню:
- •Впорядкуємо його по спаданню:
- •4.5.2 Інструкція return
- •4.5.3 Виклик функції
- •4.6.2 Константи
- •4.6.3 Математичні функції.
- •4.6.4 Приклад. Генератор випадкових чисел
- •4.7 Контрольні питання
- •Події та обробники подій
- •5.1.1 Спливання подій в dhtml
- •5.1.2 Стандартні події dhtml.
- •Способи зв'язування подій
- •5.2.1 Введення подій в якості атрибутів.
- •5.2.2 Обробники подій як функції.
- •5.2.3 Динамічне зв'язування подій у сценарії.
- •5.2.5 Атрибути for і event.
- •Об'єкти браузера
- •Об'єктна модель браузера
- •Об'єкт window (Операції з вікнами)
- •Об'єкт navigator (властивості браузера)
- •Об'єкт location (Інформація про документ і вікна браузера)
- •Об'єкт history (Переходи між Web-сторінками )
- •Робота з діалоговими вікнами
- •Управління документом
- •Об'єктна модель документа
- •7.1.1 Сімейства, властивості і методи
- •Дерево документа (Document Tree)
- •Переміщення по Дереву Документа.
- •Динамічний вміст
- •8.1.1 Найбільш популярні моделі даних
- •9.3.1 Поділ інструкцій.
- •9.3.2 Коментарі.
- •9.3.3 Змінні, константи й оператори
- •9.3.6 Типи даних
- •Висновок
- •Керуючі конструкції рнр
- •Умовні оператори
- •// Ця програма надрукує всі парні цифри
- •{// Друкуємо цифру, якщо вона парна
- •Оператори передачі управління
- •Оператори включення
- •10.5 Висновок
- •Функції і масиви в php
- •Функції, визначені користувачем
- •11.1.1 Повернення значень функцією.
- •Рекурсивні функції.
- •11.1.3 Функції-змінні.
- •11.1.4 Побудова бібліотек функцій.
- •11.2.1 Операції з масивами.
- •11.2.2 Сортування масивів.
- •Sort_regular – порівнювати елементи масиву звичайним чином; sort_numeric – порівнювати елементи масиву як числа; sort_string – порівнювати елементи масиву як рядки.
- •11.2.3 Сортування масиву за ключами.
- •11.2.4 Сортування за допомогою функції, заданої користувачем.
- •Ми застосували нашу власну функцію сортування до всіх елементів масиву.
- •11.2.5 Застосування функції до всіх елементів массиву.
- •11.2.6 Виділення підмасива
- •Висновок
- •12 Строкові функції php
- •12.1 Функції пошуку в тексті (substr(), strpos(), strrpos(), strstr(), strchr(), stristr(), strrchr(), substr_count(), strspn(), strcspn())
- •12.2 Функції strlen(), chr() і ord()
- •12.3 Trim-функції (функції видалення символів відступу) trim (), ltrim (), rtrim (), chop ()
- •12.4 Функції форматного виведення. Специфікатори перетворення printf (), sprintf (), sscanf ().
- •12.5 Функції перетворення кодування
- •12.6 Функції роботи з бінарними даними pack () unpack ()
- •12.7 Функції роботи з блоками тексту (wordwrap (), str_replace (), substr_replace (), strtr (), stripslashes (), stripcslashes (), addslashes (), addcslashes (), quotemeta (), strrev ())
- •12.8 Функції об'єднання / поділу рядків (str_repeat (), str_pad (), chunk_split (), strtok (), explode (), implode (), join ())
- •12.9 Функции сравнения строк (strcmp(), strncmp(), strcasecmp(), strncasecmp(), strnatcmp(), strnatcasecmp(), similar_text(), levenshtein())
- •12.10 Функції роботи з url (parse_url (), parse_str (), rawurlencode (), rawurldecode (), base64_encode (), base64_decode ())
- •12.11 Функції перетворення регістру (strtolower (), strtoupper (), ucfirst (), ucwords ())
- •12.13 Функція htmlspecialchars
- •13 Робота з файлами
- •13.1 Відкриття і закриття файлів
- •13.2 Читання з файлів і запис у файли
- •13.2.1 Читання з файлів.
- •13.2.2 Запис в файли
- •13.5 Переміщення по файлам
- •13.6 Робота з каталогами
- •13.7 Завантаження файлу на сервер
- •14.1 Авторизація доступу
- •14.2 Механізм сесій
- •14.3 Налаштування сесій
- •14.4.1 Відкриття сесії
- •14.4.2 Створення сесії
- •14.4.3 Реєстрація змінних сесії
- •14.4.4 Видалення змінних сесії
- •14.5 Безпека
- •14.6 Висновок
- •15.1 Проектування
- •15.2 Система адміністрування контенту
- •15.2.1 Вимоги до системи адміністрування контенту (cms).
- •15.2.2 Адміністрування списку користувачів.
- •15.2.3 Вхід на сторінку адміністрування
- •15.2.4 Відкриття списку користувачів.
- •15.2.5 Редагування запису користувача.
- •15.2.6 Видалення користувача
8.1.1 Найбільш популярні моделі даних
Реляційна база даних являє собою набір таблиць, пов'язаних між собою. Рядок в таблиці відповідає сутності реального світу. Приклади реляційних СУБД: MySql, PostgreSql.
В основу об'єктної моделі покладена концепція об'єктно-орієнтованого програмування, в якій дані подаються у вигляді набору об'єктів і класів, пов'язаних між собою родинними відносинами, а робота з об'єктами здійснюється за допомогою прихованих (інкапсульованих) в них методів.
Приклади об'єктних СУБД: Cache, GemStone (від Servio Corporation), ONTOS (ONTOS). Останнім часом виробники СУБД прагнуть з'єднати два ці підходи і проповідують об'єктно-реляційну модель представлення даних. Приклади таких СУБД - IBM DB2 for Common Servers, Oracle8. Оскільки ми збираємося працювати з Mysql, то будемо обговорювати аспекти роботи тільки з базами даних.
8.1.2 Ключі. Для початку давайте подумаємо над таким питанням: яку інформацію треба дати про людину, щоб співрозмовник точно сказав, що це саме та людина, сумнівів бути не може, другої такої немає? Повідомити прізвище, очевидно, недостатньо, оскільки існують однофамільці. Якщо співрозмовник людина, то ми можемо приблизно пояснити, про кого йдеться, наприклад згадати вчинок, який зробила та людина, або ще якось. Комп'ютер же такого пояснення не зрозуміє, йому потрібні чіткі правила, як визначити, про кого йде мова. У системах управління базами даних для вирішення такого завдання ввели поняття первинного ключа.
Первинний ключ (primary key, PK) – мінімальний набір полів, унікально ідентифікує запис у таблиці. Значить, первинний ключ – це в першу чергу набір полів таблиці, по-друге, кожен набір значень цих полів повинен визначати єдиний запис (рядок) в таблиці і, по-третє, цей набір полів повинен бути мінімальним з усіх володіючих такою ж властивістю. Оскільки первинний ключ визначає тільки один унікальний запис, то ніякі два записи таблиці не можуть мати однакових значень первинного ключа.
Наприклад, дозволяють однозначно виділити запис про людину. Якщо ж говорити загалом, без зв'язку з розв'язуваним завданням, то такі знання не дозволяють точно вказати на єдину людину, оскільки існують однофамільці, які живуть в різних містах за однією адресою. Вся справа в межах, які ми самі собі ставимо. Якщо вважаємо, що знання ПІБ, телефону та адреси без вказівки міста для наших цілей достатньо, то все чудово, тоді поля ПІБ і адресу можуть утворювати первинний ключ. У будь-якому випадку проблема створення первинного ключа лягає на плечі того, хто проектує базу даних (розробляє структуру зберігання даних). Рішенням цієї проблеми може стати або виділення характеристик, які природним чином визначають запис в таблиці (завдання так званого логічного, або природного, PK), або створення додаткового поля, призначеного саме для однозначної ідентифікації записів в таблиці (завдання так званого сурогатного, або штучного, PK).
Прикладом логічного первинного ключа є номер паспорта в базі даних про паспортні дані мешканців або ПІБ і адресу в телефонній книзі (таблиця вище). Для завдання сурогатного первинного ключа в нашу таблицю можна додати поле id (ідентифікатор), значенням якого буде ціле число, унікальне для кожного рядка таблиці. Використання таких сурогатних ключів має сенс, якщо природний первинний ключ являє собою великий набір полів або його виділення нетривіально.
Крім однозначної ідентифікації запису, первинні ключі використовуються для організації зв'язків з іншими таблицями. Наприклад, у нас є три таблиці: Group (група товарів), Goods (товари), Orders (замовлення)
Рисунок 8.1- Приклад використання первинних ключів для організації зв'язків з іншими таблицями
Первинним ключем у всіх цих таблицях є поле name_id (ідентифікатор). У таблиці Goods є поле group_id, в якому записаний ідентифікатор, присвоєний групі товарів в таблиці Groups. Немає необхідності записувати повторювані назви групи товару і таблицю Goods, досить внести в неї тільки значення group_id відповідної групи. При цьому в таблиці замовлень (при відборі товару) записати тільки good_id товару, його групу і вартість можна буде легко знайти. Таким чином, зовнішні ключі використовуються для організації зв'язків між таблицями бази даних (батьківськими і дочірніми) та для підтримання обмежень посилальної цілісності даних.
8.1.3 Індексування. Одне з основних завдань, що виникають при роботі з базами даних, – це завдання пошуку. При цьому, оскільки інформації в базі даних, як правило, міститься багато, перед програмістами постає завдання не просто пошуку, а ефективного пошуку, тобто пошуку за порівняно невеликий час і з достатньою точністю. Для цього (для оптимізації продуктивності запитів) виробляють індексування деяких полів таблиці.
Використовувати індекси корисно для швидкого пошуку рядків з вказаним значенням одного стовпчика. Без індексу читання таблиці здійснюється по всій таблиці, починаючи з першого запису, поки не будуть знайдені відповідні рядки. Чим більше таблиця, тим більше накладні витрати. Якщо ж таблиця містить індекс щодо запропонованих стовпців, то база даних може швидко визначити позицію для пошуку в середині файлу даних без перегляду всіх даних. Це відбувається тому, що база даних поміщає проіндексовані поля ближче в пам'яті, так, щоб можна було швидше знайти їх значення.
Для таблиці, яка містить 1000 рядків, це буде як мінімум в 100 разів швидше в порівнянні з послідовним перебором всіх записів. Однак в разі, коли необхідний доступ майже до всіх 1000 рядків, швидше буде послідовне читання, так як при цьому не потрібно операцій пошуку по диску. Так що іноді індекси бувають тільки перешкодою. Наприклад, якщо копіюється великий обсяг даних в таблицю, то краще не мати ніяких індексів. Однак в деяких випадках потрібно задіяти одразу кілька індексів (наприклад, для обробки запитів до часто використовуваних таблиць).
Якщо говорити про MySQL, то там існує три види індексів: PRIMARY, UNIQUE, і INDEX, а слово ключ (KEY) використовується як синонім слова індекс (INDEX). Всі індекси зберігаються в пам'яті у вигляді B-дерев.
PRIMARY – унікальний індекс (ключ) з обмеженням, що все індексовані їм поля не можуть мати порожнього значення (тобто вони NOT NULL). Таблиця може мати тільки один первинний індекс, але він може складатися з декількох полів.
UNIQUE – ключ (індекс), що задає поля, які можуть мати тільки унікальні значення.
INDEX – звичайний індекс (як ми описали вище). У MySqL, крім того, можна індексувати рядкові поля по заданому числу символів від початку рядка.
СУБД MySQL
MySQL (http://www.mysql.com) – надійна СУБД на базі SQL, розроблена і супроводжувана фірмою Т.с.Х DataKonsultAB (Стокгольм, Швеція). Починаючи з 1995 року, MySQL стала однією з найпоширеніших СУБД в світі, що частково обумовлено її швидкістю, надійністю і гнучкою ліцензійної політикою.
Завдяки хорошим характеристикам і великому набору стандартних інтерфейсних функцій, дуже простих у використанні, MySQL стала найпопулярнішим засобом для роботи з базами даних в PHP.
Одна з причин популярності MySQL серед користувачів PHP полягає в тому, що підтримка цього сервера автоматично включається в поставку PHP. Таким чином, вам залишається лише простежити за правильною установкою пакета MySQL СУБД MySQL сумісна практично з будь-якої серйозної операційною системою, включаючи FreeBSD, Solaris, UNIX, Linux і різні Берії Windows.
Поля і їх типи в MySQL. База даних з точки зору MySQL (і деяких інших СУБД) – це звичайний каталог, що містить виконавчі файли певного формату - таблиці. Таблиці складаються із записів, а записи, в свою чергу, складаються з полів. Поле має два атрибути - ім'я і тип.
Тип поля може бути:
Цілим;
Речовинним;
Рядковим;
Бінарним;
Дата та час;
Перерахування і множини.
Можливі типи даних, діапазони і опис представлені в наступних таблицях:
Таблиця 8.1 - Цілочисельні типи даних
Тип |
Діапазон |
TINYINT |
-128... +127 |
SMALLINT |
-32768...+32767 |
MEDIUMINT |
-8 388 608...+8 388 607 |
INT |
-2 147 483 648...+2 147 483 647 |
BIGINT |
-9 223 372 036 854 775 808...+9 223 372 036 854 775 807 |
Речові типи записуються у вигляді:
ТИП (ДОВЖИНА, ЗНАКИ) [UNSIGNED]
Довжина – це кількість знакомісць, в яких буде розміщено все число при його передачі, а знаки – це кількість знаків після десяткової точки, які будуть враховуватися. Якщо зазначений модифікатор UNSIGNED, знак числа враховуватися не буде.
Таблиця 8.2 - Рядкові числа
Тип |
Опис |
FLOAT |
Невелика точність |
DOUBLE |
Подвійна точність |
REAL |
Те ж, що і DOUBLE |
DECIMAL |
Дробове число, яке зберігається у вигляді рядка |
NUMERIC |
Те ж, що і DECIMAL |
Рядки. Будь-який рядок – це масив символів. При пошуку за допомогою оператора SELECT не враховується регістр символів: рядки "HELLO" і "Hello" вважаються однаковими.
Можна налаштувати MySQL на автоматичне перекодування символів – в цьому випадку в базі даних рядка будуть зберігатися в одному кодуванні, а виводитися – в інший.
У більшості випадків застосовується тип VARCHAR або просто CHAR, що дозволяє зберігати рядки, що містять до 255 символів. У дужках після типу вказується довжина рядка:
VARCHAR (48);
CHAR (73);
Якщо 255 символів для вашого завдання недостатньо, можна використовувати інші типи, наприклад, TEXT
Таблиця 8.3 - Рядки
Тип |
Опис |
TINYTEXT |
Максимальна довжина 255 символів |
TEXT |
Максимальна довжина 65535 символів (64 Кб) |
MEDIUMTEXT |
Максимальна довжина 16 777 215 символів |
LONGTEXT |
Максимальная довжина 4 294 967 295 символів |
Бінарні типи даних також можна використовувати для зберігання тексту, але при пошуку буде враховуватися регістр символів. До того ж, будь-який текстовий тип можна перетворити в бінарний, вказавши модифікатор BINARY:
VARCHAR (30) BINARY;
Таблиця 8.4 - Бінарні типи даних
Тип |
Опис |
TINYBLOB |
Максимум 255 символів |
BLOB |
Максимум 255 65535 символів |
MEDIUMBLOB |
Максимум 16 777 215 символів |
LONGBLOB |
Максимум 4 294 967 295 символів |
Таблиця 8.5 - Дата та час
Тип |
Опис |
DATE |
Дата в форматі РРРР-ММ-ДД |
TIME |
Час в форматі ГГ: ХХ: СС |
TIMESTAMP |
Дата і час в форматі timestamp, виводиться у вигляді ГГГГММДДЧЧММСС |
DATETIME |
Дата і час в формате ГГГГ-ММ-ДД ЧЧ:ММ:СС |
Інші типи даних MySQL розглядати немає сенсу, оскільки застосування їх в PHP недоцільно.
Оператори і команди MySQL
Структурована мова запитів SQL дозволяє робити різні операції з базами даних: створювати і видаляти таблиці, вставляти, оновлювати, відбирати і видаляти з таблиць дані. Ці операції проводяться за допомогою команд і запитів.Команди SQL не чутливі до регістру, але традиційно вони набираються прописними літерами.
8.3.1 Створення таблиць. Оператор CREATE
Створити таблицю через SQL-запит дозволяє оператор CREATE. Його синтаксис:
CREATE TABLEІм'я_таблиці
(
Імя_поля1 Тип Модифікатор
...
Імя_поляN Тип Модифікатор
)
Взагалі, за допомогою оператора CREATE можна створювати і інші об'єкти, але ми їх розглядати не будемо, оскільки їх застосування досить обмежена.
В якості модифікаторів можна використовувати наступні значення:
NOT NULL – поле не може містити невизначеного значення (NULL), тобто поле повинно бути явно ініціалізовано.
PRIMARY KEY – поле буде первинним ключем (ідентифікатором запису), за яким можна однозначно ідентифікувати запис.
AUTO_INCREMENT – при вставці нового запису значення цього поля буде автоматично збільшено на одиницю, тому в таблиці не буде двох записів з однаковим значенням цього поля.
DEFAULT – задає значення, яке буде використано за замовчуванням, якщо при вставці запису поле не буде ініціалізовано явно. Значення за замовчуванням задається так: Ім'я_поля Тип DEFAULT Значення. Приклад:
NO INT DEFAULT 0
NAME INT DEFAULT 'Петров'
Тепер створимо таблиці - "Товар", "Клієнти", "Замовлення":
CREATE TABLE CLIENTS
(
CLIENT_ID int AUTO_INCREMENT,
FIO char(40) NOT NULL,
ADDR char(30) NOT NULL,
CITY char(15) NOT NULL,
PHONE char(11) NOT NULL
);
Таблиця CLIENTS містить поля CLIENT_ID (номер клієнта), FIO (Прізвище, Ім'я, По батькові), ADDR (Адреса), CITY (Місто) і PHONE (Телефон). Всі ці поля не можуть містити порожнього значення (NOT NULL). Приклад:
CREATE TABLE GOODS
(
GOOD_ID int AUTO_INCREMENT,
GOOD_NAME char(40) NOT NULL,
GOOD_PRICE double(9,2) NOT NULL,
GROUP_ID int NOT NULL
);
Дана таблиця буде містити дані про товари. Тип double (9,2) означає, що 9 знаків відносимо під цілу чаcть, і два – під дробову. Приклад:
CREATE TABLE INDENTS
(
INDENT_ID int AUTO_INCREMENT,
DATE date NOT NULL,
CLIENT_ID int NOT NULL,
GOOD_ID int NOT NULL,
QUANTITY double(9,2) NOT NULL,
);
Ця таблиця містить відомості про замовлення – номер замовлення (INDENT_ID), дату замовлення (DATE), номер клієнта (CLIENT_ID), номер товару (GOOD_ID), кількість (QUANTITY).
8.3.2 Додавання даних в таблицю. Оператор INSERT. Для додавання записів використовується оператор INSERT:
INSERT INTO Ім'я_таблиці [(Список полів)]
VALUES (Список констант);
Після виконання оператора INSERT буде створена новий запис, в якості значень полів будуть використані відповідні константи, зазначені в списку VALUES.
Тепер додамо дані в наші таблиці. Додати дані можна за допомогою оператора INSERT. Розглянемо приклад використання оператора INSERT:
INSERT INTO CLIENTS
VALUES (1, 'Іванов В. І.', 'пр. Гагаріна, 25', 'Одеса', '0661234567');
Значення, які додаються повинні відповідати тому порядку, в якому поля перераховані в операторі CREATE. Якщо ви хочете додавати інформацію в іншому порядку, то ви повинні вказати цей порядок в операторі INSERT, наприклад:
INSERT INTO CLIENTS (FIO, ADDRESS, CLIENT_ID PHONE, CITY)
VALUES ('Петров', 'пр.Шевченка, 2', '0678965432', 'Одеса');
Як приклад, додамо дані в таблицю GOODS:
INSERT INTO GOODS
VALUES (0, 'Клавіатура ABC', 40.98, 5);
Зверніть увагу, що ми поки не вказали первинні ключі таблиці, тому нам ніхто не заважає додати в таблицю однакові записи. Додати дату в поле DATE можна за допомогою функції TO_DATE:
INSERT INTO ORDERS
VALUES (0, TO_DATE('13/10/10, 'DD/MM/YY'),1,1,5);
Даний запис означає, що 13 жовтня 2010 року Іванов І.І. (CLIENT_ID = 1) замовив п'ять (QUANTITY = 1) клавіатур ABC (GOOD_ID = 1).
8.3.3 Оновлення записів.Оператор UPDATE.
Синтаксис цього оператора:
UPDATE Ім'я_таблиці
SET Поле1 = Значення1, ..., ПолеN = ЗначеніеN
[WHERE Умова];
Якщо не задана умова WHERE, буде модифікована вся таблиця, а це може призвести до непередбачуваних наслідків, оскільки для всіх записів будуть встановлені однакові значення полів, тому завжди вказуйте умову WHERE.
Припустимо, нам необхідно оновити запис, якщо, наприклад, клієнт Іванов переїхав в інше місто і нам потрібно відзначити цю подію в базі даних. Зробимо наступне:
update clients
set city = 'псков'
where client_id = 1;
Даний запит потрібно розуміти так: знайти запис, поле CLIENT_ID якої = 1 (це код клієнта Іванова), і встановити значення CITY рівним "Псков".
8.3.4 Видалення записів. Оператор DELETE
Якщо нам необхідно видалити всіх клієнтів, номери яких перевищують 5, то ми зробимо так:
delete from clients
where client_id > 5;
За допомогою оператора DELETE можна видалити всі записи таблиці, вказавши умову, яка підійде для всіх записів, наприклад:
delete from clients;
Якщо друга частина оператора DELETE-WHERE не вказана, значить, дія оператора поширюється на всі записи відразу.
8.3.5 Вибір записів. Оператор SELECT.
Додавання, зміна та видалення записів – це, звичайно, дуже важливі команди, але набагато частіше використовується оператор SELECT, який вибирає дані з таблиці. Синтаксис цього оператора більш складний:
select [distinct|all] {*| [поле1 as псевдонім] [,..., полеn as псевдонім]}
from ім'я_таблиці1 [,..., ім'я_таблиціn]
[where умова]
[group by список полів] [having умова]
[order by список полів]
Ми повністю не будемо розглядати оператор SELECT, краще це робити на конкретному прикладі. Зараз ми розглянемо оператор SELECT в загальних рисах. Наприклад, для виведення всіх записів з таблиці CLIENTS зробіть наступне:
select * from clients;
В результаті ви отримаєте таку відповідь сервера:
CLIENT_ID |
FIO |
ADDR |
CITY |
PHONE |
1 |
Іванов І. І. |
пр. Гагаріна, 25 |
Одеса |
0661234567 |
2 |
Петров П.П. |
пр.Шевченко, 2 |
Одеса |
0678965432 |
Зверніть увагу на перші два записи – вони однакові. Якщо ви хочете виключити однакові записи з відповіді сервера (але не з таблиці), використовуйте запит:
select distinct *
from clients;
Припустимо, ви хочете вивести тільки прізвище і номер телефону клієнта, тоді використовуйте наступний запит:
select distinct fio, phone
from clients;
Якщо вам потрібно вивести всі товари, ціна на які перевищує 800, то скористайтеся таким запитом:
select *
from tools
where price > 800;
Ви можете використовувати наступні оператори відносин: <, >, =, <>, <=, >=.
Якщо у вашій таблиці присутні кілька однофамільців, то для виведення інформації про всіх з них, використовуйте модифікатор LIKE, наприклад:
select *
from clients
where fio like '%иванов%';
Наведений запит можна коментувати так: вивести інформацію про клієнтів, прізвище яких схожа на 'Іванов'.
Якщо вам необхідно вибрати дані з різних таблиць, то перед іменем поля потрібно ввести ім'я таблиці. Ось запит, який дозволяє вивести імена всіх клієнтів, які хоча б один раз купували товар:
select distinct clients.fio
from clients, indents
where clients.client-id = orders.client_id;
Оператор SELECT дозволяє використовувати вкладені запити, однак MySQL їх не підтримує.
8.3.6 Внутрішні функції MIN, MAX, AVG, SUM. При роботі з оператором SELECT доступні кілька дуже корисних внутрішніх функцій MySQL, що обчислюють кількість елементів (COUNT), суму елементів (SUM), максимальне і мінімальне значення (MAX і MIN), а також середнє значення (AVG). Наступні оператори виведуть, відповідно, кількість записів в таблиці CLIENTS, найдорожчий товар і суму цін усіх товарів:
select count(*)
from clients;
select max(price)
from tools;
select sum(price)
from tools;
8.3.7 Угруповання записів.
Оператор SELECT дозволяє групувати повернені значення. Наприклад, клієнт Іванов (CLIENT_ID = 1) кілька разів замовляв якийсь товар. Значить, його номер зустрічається в таблиці INDENTS кілька разів. Інший клієнт також міг зробити кілька замовлень. Ми можемо згрупувати всі записи по полю CLIENT_ID (номер клієнта), а потім вивести суму замовлення кожного клієнта.
select clients.fio, count(indents.client_id) as totalcount
from clients, indents
where clients.client_id = indents.client_id
group by indents.client_id;
Групування виконує оператор GROUP BY, який є частиною оператора SELECT. Оператор GROUP BY можна обмежити за допомогою HAVING. Цей оператор використовується для відбору рядків, які GROUP BY. HAVING можна вважати аналогом WHERE, але тільки для GROUP BY:
HAVING <умова>
Наприклад, нас цікавлять тільки клієнти, які замовили кількість товарів більш 10:
select clients.fio, sum(indents.quantity) as totalquantity
from clients, indents
where clients.client_id = orders.client_id
group by indents.client_id
having totalquantity> 10;
В цьому запиті ми використовували псевдонім стовпця TOTAL QUANTITY.
8.3.8 Сортування записів.
Поки ми не встановили первинний ключ, сортування таблиці не виконується. Дані будуть відображені в порядку їх занесення в таблицю. Для сортування по полю CLIENT_ID результату виведення таблиці CLIENTS використовується наступний оператор (сама таблиця при цьому не сортується):
select *
from clients
order by client_id;
Ключі. Припустимо, що хтось додав до таблиці CLIENTS запис:
1 Сідоров Свободи 7 Калінінград 0113452103
У той же час, цей номер 1 був закріплений за Івановим. У нас вийшло, що один і той же номер зіставлений різним клієнтам. Щоб уникнути такої плутанини, необхідно використовувати первинні ключі:
alter table customer
add primary key (c_no);
Після цього запиту поле C_NO може містити тільки унікальні значення. В якості первинного ключа не можна використовувати поле, що містить значення NULL. Створити первинний ключ можна і простіше – при створенні таблиці наступним чином:
create table clients
(
client_id int not null,
fio char(50) not null,
addr char(55) not null,
city char(20) not null,
phone char(8) not null,
primary key (client_id);
);
Таблиця orders містить відомості про замовлення. по полю client_id цієї таблиці ідентифікується замовник. припустимо, що в таблицю orders хтось ввів значення, якого немає в таблиці clients. хто замовив товар? Нам потрібно не допустити такої ситуації, тому слід використовувати такий запит:
alter table orders
add foreign key(client_id) references clients;
Введені в таблицю orders номери клієнтів client_id повинні існувати в таблиці clients. ця можливість називається декларативною цілісністю.
команда alter використовується не тільки для додавання ключів. Вона призначена для організації таблиці в цілому. Ви бажаєте додати ще одне поле? Або встановити список допустимих значень для кожного з полів. Все це можна зробити за допомогою команди ALTER:
alter table clients
add zip char(7) null;
Цей оператор додає до таблиці CLIENTS нове поле ZIP типу char. Зверніть увагу, що ви не можете додати нове поле зі значенням NOT NULL в таблицю, в якій вже є дані. Наприклад, якщо компанія працює тільки з клієнтами Москви і Єкатеринбурга, то доцільно ввести список допустимих значень для таблиці CLIENTS:
alter table clients
add constraint invalid_state sheck (city in ('москва', 'екатеринбург'));
8.3.9 Видалення полів та таблиць. Оператор DROP. Стандартом SQL не передбачено видалення стовпців, проте в MySQL ми це можемо зробити:
ALTER TABLE CLIENTS
DROP ZIP;
А видалити таблицю ще простіше:
DROP ORDERS;
Стандартні функції PHP для работи з MySQL
Загальна послідовність дій при взаємодії з сервером MySQL виглядає так:
Встановити з'єднання з сервером MySQL. Якщо спроба завершується невдачею, вивести відповідне повідомлення і завершити процес.
Вибрати базу даних сервера MySQL. Якщо спроба вибору завершується невдачею, вивести відповідне повідомлення і завершити процес. Допускається одночасне відкриття декількох баз даних для обробки запитів.
Опрацювати запити до обраної бази (або баз).
Після завершення обробки запитів закрити з'єднання з сервером баз даних.
Отже, почнемо з самого початку – тобто з підключення до сервера MySQL:
mysql_connect ()
Функція mysql_connect () встановлює зв'язок з сервером MySQL. Після успішного підключення до MySQL можна переходити до вибору баз даних, що обслуговуються цим сервером.
Приклад використання функції mysql_connect (): В даному прикладі localhost – ім'я комп'ютера, dbuser – ім'я користувача, а 2233 - пароль. Знак @ перед викликом функції mysql_connect () пригнічує всі повідомлення про помилки, що видаються при невдалій спробі підключення, - вони замінюються повідомленням, виведеним на сторінку функцією echo. Приклад:
$dblocation = "localhost";
$dbname = "myshop";
$dbuser = "admin";
$dbpasswd = "2233";
// встановлюємо з'єднання з базою даних
$dbcnt = @mysql_connect($dblocation,$dbuser,$dbpasswd);
if (!$dbcnt)
{
echo( "<p>в зараз сервер бази даних не доступний, тому коректне відображення сторінки неможливо.</p>" );
exit();
}
mysql_select_db( )
Після успішного з'єднання з MySQL необхідно вибрати базу даних, що знаходиться на сервері. Для цього використовується функція mysql_select_db ().
Приклад використання функції mysql_select_db (): Якщо в програмі вибирається тільки одна база даних, зберігати її ідентифікатор не обов'язково. Однак при виборі декількох баз даних ідентифікатори, що повертаються зберігаються, щоб ви могли послатися на потрібну базу при обробці запиту. Якщо ідентифікатор не вказано, використовується остання обрана база даних. Приклад:
if (! @mysql_select_db($dbname,$dbcnt) )
{
echo( "<p> на даний момент база даних недоступна, тому коректне відображення сторінки неможливо.</p>" );
exit();
}
mysql_close( )
Після завершення роботи з сервером MySQL з'єднання необхідно закрити. Функція mysql_close () закриває з'єднання, яке визначається необов'язковим параметром. Якщо параметр не заданий, функція mysql_close () закриває останнє відкрите з'єднання. Синтаксис функції mysql_close ():
int mysql_close ([int ідентіфікатор_ з'єднання])
У цьому прикладі вказувати ідентифікатор з'єднання не потрібно, оскільки на момент виклику mysql_close () існує лише одне відкрите з'єднання з сервером.
mysql_query( )
Функція mysql_query () забезпечує інтерфейс для звернення із запитами до базданих.Синтаксис функції mysql_query ():
int mysql_query (string запит [, int ідентіфікатор_з'єднання])
Параметр запит містить текст запиту на мові SQL. Запит передається або з'єднанню, що визначається необов'язковим параметром ідентіфікатор_з'єднання, або, за відсутності параметра, останньому відкритому з'єднанню.
Недосвідчені програмісти часто помилково думають, що функція mysql_query () повертає результати обробки запиту. Це не так – в залежності від типу запиту виклик mysql_query () може призводити до різних наслідків. При успішному виконанні команди SQL SELECT повертається ідентифікатор результату, який згодом передається функції mysql_result () для подальшого форматування і відображення результатів запиту. Якщо обробка запиту завершилася невдачею, функція повертає FALSE.
mysql_affected_rows ( )
У багатьох ситуаціях потрібно дізнатися кількість записів, які беруть участь в запиті SQL з командами INSERT, UPDATE, REPLACE або DELETE. Завдання вирішується функцією mysql_affected_rows (). Синтаксис функції:
int mysql_affected_rows ([int ідентіфікатор_з'єднання])
Зверніть увагу: параметр ідентіфікатор_з'єднання не є обов'язковим. Якщо він не вказується, mysql_affected_rqws () намагається використовувати останнє відкрите з'єднання. Приклад:
<?
// створити запит
$ query = "update goods set good_name =" зошит "
where group_id = 123;
$ result = mysql_query ($ query); // виконати запит
print "оновлено записів;" .mysql_affected_rows (); // визначити кількість оновлених записів
mysql_close ();
?>
Функція mysql_affected_rows () не працює з запитами, заснованими на команді SELECT. Для визначення кількості записів, повернутих при виклику SELECT, використовується функція mysql_num_rows ().
В одній специфічній ситуації функція mysql_affected_rows () працює з помилкою. При виконанні команди DELETE без секції WHERE mysql_affected_rows () завжди повертає 0.
mysql_num_rows( )
Функція mysql_num_rows () визначає кількість записів, що повертаються командою SELECT. Синтаксис функції mysql_num_rows ():
int mysql_num_rows (int результат)
Приклад використання mysql_num_rows ():
<?
$ query = "select good_name from goods where good_name like" т * ";
// виконати запит $ result = mysql_query ($ query);
print "всього відібрано рядків:" .mysql_num_rows ($ result);
mysql_close ();
?>
mysql_result( )
Функція mysql_result () використовується в поєднанні з mysql_query () (при виконанні запиту з командою SELECT) для отримання набору даних. Синтаксис функції mysql_resu1t ():
int mysql_result (int ідентіфікатор_результата, int запис [. mixed поле "] ')
У параметрі ідентіфікатор_результата передається значення, повернуте функцією mysql_query (). Параметр запис посилається на певний запис набору даних, що визначається параметром ідентифікатор результату.
Нарешті, в необов'язковий параметр поле можуть передаватися:
зміщення поля в таблиці;
ім'я поля;
ім'я поля в форматі імя_поля_імя_тaблиці.
У Прикладі 1 використовується база даних.
Приклад 1. Вибірка і форматування даних в базі даних MySQL
<?
$query = "select * from goods";
$result = mysql_query($query);
$x = 0;
print "<table>\n";
print "<tr>\n<th>goodid</th><th>googname</th><th>goodprice</th>\n</tr>\n";
while ($x < mysql_numrows($result))
{
$id = mysql_result($result. $x. 'good_id');
$name = mysql_result($result, $x, 'good_name');
$price = mysql_result($result. $x, 'good_price');
print "<tr>\n";
print "<td>$id</td>\n<td>$name</td>\n<td>$price</td>\n";
print "</tr>\n";
$x++;
}
print "</table>";
mysql_close(); ?>
Приклад 2. Результат виконання прикладу 1:
<table>
<tr>
<th>goodid</th><th>goodname</th><th>goodprice</th>
</tr>
<tr>
<td>1</td>
<td>тетрадь</td>
<td>1.23</td>
</tr>
<tr>
<td>2</td>
<td>блокнот</td>
<td>2.34</td>
</tr>
<tr>
<td>3</td>
<td>глобус</td>
<td>3.45</td>
</tr>
</table>
Функція mysql_result () зручна для роботи з відносно невеликими наборами даних, однак існують і інші функції, що працюють набагато ефективніше, - а саме, функції mysql_fetch_row () і mysql_fetch_array ().
mysql_fetch_row()
Зазвичай набагато зручніше відразу присвоїти значення всіх полів запису елементів індексуємого масиву (починаючи з індексу 0), ніж багаторазово викликати mysql_result( ) для отримання окремих полів. Завдання вирішується функцією mysql_fetch_row( ), що має наступний синтаксис:
array mysql_fetch_row (int результат)
Використання функції list( ) в поєднанні з mysql_fetch_row( ) дозволяє заощадити кілька команд, необхідних при використанні mysql_result( ). У прикладі 3 наведено код прикладу 1, переписаний з використанням list( ) і mysql_fetch_row( ).
Приклад 3. Вибірка даних функцією mysql_fetch_row( ):
<?
$query = "select * from goods";
$result = mysql_query($query);
print "<table>\n";
print "<tr>\n<th>goodid</th><th>goodname</th><th>
goodprice</th>\n</tr>\n";
while ($row = mysql_fetch_row($result))
{
print "<tr>\n":
print "<td>".$row[0]."</td>\n<td>".$row[1]."
</td>\n<td>" .$row[2]. "</td>\n";
print "</tr>\n";
}
print "</table>";
mysql_close();
?>
Приклад 3 видає той же результат, що і приклад 1, але використовує при цьому меншу кількість команд.
mysql_fetch_array ( )
Функція mysql_fetch_array( ) аналогічна mysql_fetch_row( ), однак за замовчуванням значення полів запису зберігаються в асоціативному масиві. Втім, ви можете вибрати тип індексації (асоціативна, числова або комбінована). Синтаксис функції mysql_fetch_array( ):
array mysql_fetch_array (int ідентифікатор результату [, тип_індексації])
У параметрі ідентифікатор_результата передається значення, повернуте функцією mysql_query( ).
Необов'язковий параметр тип_індексації приймає одне з наступних значень:
MYSQL_ASSOC – функція mysql_fetch_array( ) повертає асоціативний масив. Якщо параметр не вказано, це значення використовується за замовчуванням;
MYSQL_NUM – функція mysql_fetch_array( ) повертає масив з числовою індексацією;
MYSQL_BOTH – до полів повертаючого запису можна звертатися як по числовим, так і за асоціативним індексам.
Приклад 4 містить черговий варіант коду прикладу 1 і 3. На цей раз використовується функція mysql_fetch_array( ), яка повертає асоціативний масив полів.
Приклад 4. Вибірка даних функцією mysql_fetch_array( ):
<?
$query = "select * from goods";
$result = mysql_query($query);
"<table>\n";
print "<tr>\n<th>product id</th><th>product name</th> <th>product price</th>\n</tr>\n";
while ($row = mysql_fetch_array($result))
{
print "<tr>\n";
print "<td>".$row["prod_id"]."</td>\n <td>".$row["prod_name"]."</td>\n <td>" . $row["prod_price"] . "</td>\n" ;
print "</tr>\n";
}
print "</table>";
mysql_close();
?>
Цей приклад видає той же результат, що і приклад 1 і 3.
ВВЕДЕННЯ В PHP
Питання для вивчення
Можливості РНР і області його застосування
Перша РНР програма
Основи синтаксису PHP
Можливості РНР і області його застосування
«PHP може все», – заявляють його творці. В першу чергу PHP використовується для створення скриптів, які працюють на стороні сервера, для цього його, власне, і придумали. PHP здатний вирішувати ті ж задачі, що і будь-які інші CGI-скрипти, в тому числі обробляти дані html-форм, динамічно генерувати html сторінки і т. п. Але є й інші області, де може використовуватися PHP. Всього виділяють три основні області застосування PHP:
Створення додатків (скриптів), які виконуються на стороні сервера. PHP найбільш широко використовується саме для створення такого роду скриптів. Для того щоб працювати таким чином, знадобиться PHP-парсер (тобто обробник php-скриптів) і web-сервер для обробки скрипта, браузер для перегляду результатів роботи скрипта, ну, і, звичайно, будь-який текстовий редактор для написання самого php-коду. Парсер PHP поширюється у вигляді CGI-програми або серверного модуля. У цьому курсі ми будемо обговорювати, як правило, створення саме серверних додатків, як приклад використання мови PHP.
Створення скриптів, що виконуються в командному рядку. Тобто за допомогою PHP можна створювати такі скрипти, які будуть виконуватися, незалежно від web-сервера і браузера, на конкретній машині. Для такої роботи потрібно лише парсер PHP (в цьому випадку його називають інтерпретатором командного рядка (cli, command line interpreter). Цей спосіб роботи підходить, наприклад, для скриптів, які повинні виконуватися регулярно за допомогою різних планувальників завдань або для вирішення завдань простої обробки тексту.
Створення GUI-додатків (графічних інтерфейсів), що виконуються на стороні клієнта. В принципі це не найкращий спосіб використовувати PHP, особливо для початківців, але якщо ви вже досконально вивчили PHP, то такі можливості мови можуть виявитися вельми корисні. Для застосування PHP в цій області буде потрібно спеціальний інструмент - PHP-GTK, який є розширенням PHP.
Отже, область застосування PHP досить обширна і різноманітна. Тим не менш, існує безліч інших мов програмування, здатних вирішувати схожі завдання. Чому варто вивчати PHP? Що це нам дає?
PHP дуже простий у вивченні. Досить ознайомитися лише з основними правилами синтаксису і принципами його роботи, і можна починати писати власні програми, причому братися за такі завдання, вирішення яких іншою мовою вимагала серйозної підготовки.
PHP підтримується майже на всіх відомих платформах, майже у всіх операційних системах і на різних серверах. Це теж дуже важливо. Навряд чи комусь захочеться переходити, наприклад, від роботи під Windows роботі під Linux або від сервера IIS до сервера Apache тільки для того, щоб вивчити ще одну мову програмування.
У PHP поєднуються дві найпопулярніші парадигми програмування - об'єктна і процедурна. В PHP4 більш повно підтримується процедурне програмування, але є можливість писати програми і в об'єктному стилі. Уже в перших пробних версіях PHP5 більшість недоліків в реалізації об'єктно-орієнтованої моделі мови, існуючих в PHP4, усунені. Таким чином, можна вибрати найбільш звичний стиль роботи.
Якщо говорити про можливості сьогоднішнього PHP, то вони виходять далеко за рамки тих, що були реалізовані в його перших версіях. За допомогою PHP можна створювати зображення, PDF-файли, флеш-ролики, в нього включена підтримка великого числа сучасних баз даних, вбудовані функції для роботи з текстовими даними будь-яких форматів, включаючи XML, і функції для роботи з файловою системою. PHP підтримує взаємодію з різними сервісами за допомогою відповідних протоколів, таких як протокол керування доступом до директорій LDAP, протокол роботи з мережевим обладнанням SNMP, протоколи передачі повідомлень IMAP, NNTP і POP3, протокол передачі гіпертексту HTTP і т. д.
Звертаючи увагу на взаємодію між різними мовами, слід згадати про підтримку об'єктів Java і можливості їх використання в якості об'єктів PHP. Для доступу до віддалених об'єктів можна використовувати розширення CORBA.
Для роботи з текстовою інформацією PHP успадкував (з невеликими змінами) механізми роботи з регулярними виразами з мови Perl і UNIX-систем. Для обробки XML-документів можна використовувати як стандарти DOM і SAX, так і API для XSLT-трансформацій.
Для створення додатків електронної комерції існує ряд корисних функцій, таких як функції здійснення платежів Cybercash, CyberMUT, VeriSign Payflow Pro і CCVS. Популярність в області побудови веб-сайтів визначається наявністю великого набору вбудованих засобів для розробки веб-додатків.
Основні з них:
автоматичне вилучення POST і GET-параметрів, а також змінних оточення веб-сервера в зумовлені масиви;
взаємодія з великою кількістю різних систем управління базами даних (MySQL, MySQLi, SQLite, PostgreSQL, Oracle (OCI8), Oracle, Microsoft SQL Server, Sybase, ODBC, mSQL, IBM DB2, Cloudscape і Apache Derby, Informix, Ovrimos SQL, Lotus Notes, DB ++, DBM, dBase, DBX, FrontBase, FilePro, Ingres II, SESAM, Firebird / InterBase, Paradox File Access, MaxDB, Інтерфейс PDO);
автоматизована відправка HTTP-заголовків;
робота з HTTP-авторизацією;
робота з cookies і сесіями;
робота з локальними і віддаленими файлами, сокетами;
обробка файлів, що завантажуються на сервер;
робота з XForms.
Перша PHP-програма
Розглянемо приклад:
<html>
<head>
<title>приклад</title>
</head>
<body>
<?php echo "<p>привіт, я - скрипт php!</p>"; ?>
</body>
</html>
Це простий HTML-файл, в який вбудованно за допомогою спеціальних тегів код, написаний на мові PHP.Тут не потрібно писати купу спеціальних команд для виведення HTML. Пишеться безпосередньо HTML-скрипт, в який можна вбудовувати PHP-код, який здійснює будь-які дії (наприклад, виводить текст на екран, як в нашому прикладі). Недоліком PHP в порівнянні з Сі і Perl, незважаючи на всі зусилля розробників, все ще є недостатня швидкість виконання складних скриптів.
PHP-скрипти – це програми, які виконуються і обробляються сервером. Так що порівнювати його з скриптовими мовами типу JavaScript неможливо, тому що написані на них скрипти виконуються на машині клієнта. У чому відмінність скриптів, що виконуються на сервері і на клієнті? Якщо скрипт обробляється сервером, клієнту посилаються тільки результати роботи скрипта. Наприклад, якщо на сервері виконувався скрипт, подібний до наведеного вище, клієнт отримає згенеровану HTML-сторінку вигляду:
<html>
<head>
<title>приклад</title>
</head>
<body>
<p> привіт, я - скрипт php!</p>
</body>
</html>
У цьому випадку клієнт не знає, який код виконується. Можна навіть настроїти свій сервер таким чином, щоб HTML-файли оброблялися процесором PHP, так що клієнти навіть не зможуть дізнатися, чи отримують вони звичайний HTML-файл або результат виконання скрипта. Якщо ж скрипт обробляється клієнтом (наприклад, це програма на мові JavaScript), то клієнт отримує сторінку, яка містить код скрипта.
Коли PHP обробляє файл, він просто передає його текст, поки не зустріне один з перерахованих спеціальних тегів, який повідомляє йому про необхідність почати інтерпретацію тексту як коду PHP. Потім він виконує весь знайдений код до закриваючого тега, що говорить інтерпретатору, що далі знову йде просто текст. Цей механізм дозволяє впроваджувати PHP-код в HTML - все за межами тегів PHP залишається незмінним, тоді як всередині інтерпретується як код. Зауважимо також, що php-файл не схожий на CGI-скрипт. Php файл не повинен бути виконуваним або ще якимось чином поміченим.
Для того щоб відправити php-файл на обробку серверу, потрібно в рядку браузера набрати шлях до цього файлу на сервері. Скрипти php повинні розташовуватися там, де дозволений доступ через www, наприклад там же, де лежить домашня сторінка. Якщо php-файл лежить на локальній машині, то його можна обробити за допомогою інтерпретатора командного рядка.
Основи синтаксису
