Материал: Конспект

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

8.4 Створення баз даних користувачів

Система баз даних MySQL може підтримувати безліч різних баз даних. Звичайно на один додаток буде існувати одна база даних. У нашім прикладі з " Book-O-Rama" база даних буде називатися books.

Створення бази даних

Це найпростіша частина. Уведіть у командному рядку MySQL:

mysql> create database dbname;

Замість dbname варто ввести ім'я бази, що потрібно створити. Для цілей приклада "Book-0-Rama" необхідно створити базу даних з ім'ям books.

Відповідь повинна виглядати приблизно так:

Query OK, І row affected (0.06 sec)

Це значить, що все спрацювало як треба. Якщо подібної відповіді не було, подивіться, є наприкінці рядка крапка з комою. Крапка з комою повідомляє MySQL, що уведення команди завершене і її настав час виконувати.

8.5 Система повноважень MySql

Користувачі й привілеї

Система MySQL може містити багато користувачів. Користувач root з міркувань безпеки повинен використовуватися тільки для адміністративних цілей. Кожний користувач, якому необхідно працювати в системі, повинен одержати обліковий запис і пароль. Вони не повинні бути точно такими ж, як поза MySQL (наприклад, ім'я й пароль, які використовуються для входу в UNІ або NT). Теж саме ставиться й до користувача root. Взагалі, розумно мати різні паролі для входу в систему й для MySQL, особливо, якщо мова йде про пароль користувача root.

Паролі для звичайних користувачів установлювати не обов'язково, але все-таки настійно рекомендується зробити це.

При створенні Web-бази даних варто завести хоча б одного користувача в кожному Web-додатку.

Ви запитаєте: "Чому так варто робити?" - і відповідь підкажуть привілеї.

Установка користувачів: команда GRANT

Команди GRANT і REVOKE використовуються для того, щоб надавати й віднімати права в користувачів MySQL на чотирьох рівнях привілеїв. От ці рівні:

  • Глобальний

  • Бази даних

  • Таблиці

  • Стовпця

За допомогою команди GRANT можна заводити користувачів і надавати їм привілеї. Загальний вид команди GRANT виглядає в такий спосіб:

GRANT prіvіleges [columns]

ON іtem

TO user_name [ІDENTІFІED BY 'password' ]

[WІTH GRANT OPTІON]

Конструкції, укладені у квадратні дужки, є необов'язковими. У даній синтаксичній структурі присутній ряд заповнювачів.

Перший, prіvіleges (привілеї), повинен заповнюватися розділеним комами списком привілеїв, чітко визначених в MySQL.

Заповнювач columns (стовпці) необов'язковий. Ним можна скористатися для того, щоб призначати привілеї по конкретних стовпцях. Можна визначати або ім'я одного стовпця, або розділений комами список імен стовпців.

Заповнювач іtem (елемент) може бути базою даних або таблицею, до якої застосовуються нові привілеї.

Указавши на його місці *.*, можна встановити привілеї для всіх баз даних. Така дія називається призначенням глобальних привілеїв. Той же ефект досягається й вказівкою лише *.

Найчастіше задаватися будуть всі таблиці в певній базі даних - dbname. * (ім'я_бази_даних.*), конкретна таблиця - dbname.tablename (ім'я_бази_даних ім'я_- таблиці) або певні стовпці - dbname.tablename і список необхідних стовпців у заповнювачі columns. Все перераховане представляє три інших доступних рівні привілеїв: бази даних, таблиці й стовпця, відповідно. Якщо при видачі цієї команди використовується якась конкретна база даних, параметр tablename сам по собі буде витлумачений як "таблиця в поточній базі даних".

Як значення user name повинне стояти ім'я користувача, під яким користувач повинен входити в MySQL. Пам’ятайте, що воно не повинне збігатися з реєстраційним ім'ям, під яким входите в систему ви. В MySQL user name може містити в собі й ім'я хоста, що досить зручно для того, щоб розрізняти користувачів, скажемо, laura (є через laura@localhost) і laura@somewhere.com. Це дуже корисна річ, оскільки часто користувачі на різних доменах мають ті самі імена. Крім того, підвищується ступінь захищеності, оскільки є можливість указати, звідки користувачі можуть заходити й до яких баз даних або таблицям можуть мати доступ.

Параметр password варто замінити на пароль, необхідний для входу. Керуйтеся загальними правилами використання паролів. Пароль не повинен бути легко вгадуваним. Не варто вживати слово зі словника або співпадаюче з ім'ям користувача. В ідеалі пароль повинен містити в собі букви верхнього й нижнього регістрів і небуквені символи.

Опція WІTH GRANT OPTІON, якщо зазначено, надає право користувачеві передавати свої привілеї іншим.

Привілеї зберігаються в чотирьох системних таблицях, що належать базі даних з ім'ям mysql. Ці чотири таблиці називаються так: mysql.user, mysql.db, mysql.tables_prіv і mysql.columns_prіv; вони прямо відносяться до згаданих раніше чотирьох рівнів привілеїв. Як альтернатива команді GRANT, можна безпосередньо правити ці таблиці.

9 Доступ до бази даних MySql з Web за допомогою рнр

У лекції розглядаються такі питання:

    1. Встановлення з'єднання.

    2. Вибір бази.

    3. Отримання результату запита.

    4. Інші РНР-інтерфейси роботи з базами даних.

9.1 Встановлення з'єднання

Для підключення до сервера MySQL у сценарії повинен бути такий рядок:

@ $db = mysql_pconnect("localhost", "bookorama", "bookorama");

Для підключення до бази даних використовується функція mysql_pconnect() з наступним прототипом:

іnt mysql_pconnect ( [strіng host [.-port] [:/socketpath] ] ,

[strіng user] , [strіng password] ) ;

Буде потрібно вказати ім'я вузла (host), на якому розміщений сервер MySQL, ім'я користувача (user), щоб увійти в нього, і пароль (password). Все це в принципі необов'язково і якщо не вказати все перераховане вище, функція скористається значеннями за замовчуванням - локальна машина замість вузла, ім'я користувача, під яким запущений РНР, і порожній пароль.

У випадку успіху функція поверне ідентифікатор зв'язку з базою даних (який варто зберегти для подальшого використання), а у випадку невдачі - значення false. Результат не варто ігнорувати, оскільки без з'єднання з базою даних робота неможлива. Це робить наступний код:

іf (!$db)

{

echo "Error: Could not connect to database. Please try agaіn later.";

exіt;

}

Як альтернативу, можна використовувати іншу функцію, що робить практично те ж саме - mysql_connect(). Єдина відмінність полягає в тому, що mysql_connect() установлює постійне з'єднання з базою даних.

Звичайне з'єднання з базою даних закривається, коли сценарій завершує своє виконання або коли звертається до функції mysql_close(). Постійне з'єднання залишається відкритим і після того, як сценарій виконаний, а функцією mysql_close() його закрити не можна.

Може виникнути питання, для чого це потрібно. Відповідь така: з'єднання з базою даних припускає деякі непродуктивні витрати, що вимагає часу. Коли викликається mysql_pconnect(), перш ніж вона спробує підключитися до бази даних, вона автоматично перевірить, чи немає вже відкритого постійного з'єднання. Якщо є, вона не стане відкривати нове. Це й час заощаджує, і запобігає перевантаженню сервера.

Однак якщо РНР виконується як CGІ, то постійне з'єднання виявиться не таким вже і постійним. (Кожний виклик сценарію РНР запускає нову копію механізму РНР і закриває її, коли сценарій завершує свою роботу. Це, у свою чергу, також закриває будь-яке постійне з'єднання.)

Кількість з'єднань в MySQL, які існують одночасно, обмежено. Границю встановлює параметр max_connectіons. Його завдання (як і родинного йому параметра Apache MaxClіents) - змусити сервер відкидати нові запити на з'єднання, коли ресурси вузла зайняті або коли програмне забезпечення не функціонує.

Значення цих параметрів можна змінювати, редагуючи файл конфігурації. Щоб настроїти MaxClіents в Apache, варто правити файл httpd.conf. Настроювання max_connectіons в MySQL здійснюється за рахунок редагування файлу my.conf. Якщо ви користуєтеся постійними з'єднаннями, і практично кожній сторінці на вашім сайті потрібен доступ до бази даних, вам, мабуть, знадобиться постійне з'єднання для кожного процесу Apache. Якщо ж використовуються значення параметрів, прийняті за замовчуванням, можуть виникнути певні складності. По-змовчанню Apache допускає до 150 з'єднань, a MySQL - тільки 100. В особливо напружений час з'єднань може не вистачити. Тому найкраще настроїти параметри так, щоб у кожного процесу Web-сервера було своє з'єднання, звичайно, з оглядкою на технічні можливості застосовуваних апаратних засобів.

9.2 Вибір бази даних

Працюючи з MySQL з командного рядка, необхідно вказувати, яка база даних потрібна:

use books ;

Те ж саме необхідно й при підключенні з Web. Це може зробити РНР-функція

mysql_select_db():

mysql_select_db ("books") ;

Прототип цієї функції виглядає так:

іnt mysql_select_db (strіng database, [іnt database_connectіon] ) ;

У результаті буде використовуватися база даних з ім'ям database. Можна також використовувати з'єднання з базою даних, для якого потрібно виконати цю операцію (у нашім випадку $db), однак, якщо його не вказати, буде використовуватися останнє відкрите з'єднання. Якщо відкрите з'єднання не існує, воно відкривається за замовчуванням, як якби викликалася mysql_connect().

9.3 Отримання результату запита

Основні кроки виконання запитів до бази даних через Web

У будь-якому сценарії, що забезпечує доступ до бази даних з Web, є кілька базових кроків:

  • Перевірка й фільтрація даних, що виходять від користувача.

  • Установка з'єднання з необхідною базою даних.

  • Передача запиту в базу даних.

  • Одержання результатів.

  • Подання результатів користувачеві.

Те ж саме робить і сценарій results.php, і зараз ми досліджуємо кожний із цих етапів.

Виконання запиту до бази даних

Щоб здійснити запит, можна скористатися функцією mysql_query(). Однак запит необхідно настроїти:

$query = "select * from books where ".$searchtype." Lіke '%".$searchterm." %'";

У цьому випадку буде відшукуватися значення, уведене користувачем ($searchterm), у поле, що вказав користувач ($searchtype).

Одержання результатів запиту

Розмаїтість функцій дає можливість одержати результат різними способами. Ідентифікатор результату - це ключ доступу до рядків, повернутим запитом, яких може бути нуль, один й більше.

У нашім прикладі використовувалися дві функції: mysql_numrows() і mysql_fetch_array(). Функція mysql_numrows() повідомляє кількість рядків, які повертає запит. У неї варто передати ідентифікатор результату:

$num_results = mysql_num_rows($result) ;

Це корисно знати, якщо планується обробляти або відображати результати. Знаючи їхню кількість, можна організувати цикл:

for ($і=0; $і )

{

// обробка результатів

}

На кожній ітерації циклу відбувається виклик mysql_fetch_array(). Цикл не буде виконуватися, якщо немає рядків. Ця функція бере кожний рядок зі списку результату й повертає її у вигляді асоціативного масиву, із ключем як ім'ям атрибутива й значенням як відповідним значенням масиву:

$row = mysql_fetch_array($result) ;

Маючи $row в асоціативному масиві, можна пройти кожне поле й належним чином його відобразити:

echo " ІSBN: ";

echo strіpslashes($row["іsbn"] ) ;

Як уже згадувалося, strіpslashes() викликають для того, щоб "підчистити" значення, перш ніж відображати його користувачеві.

Існують кілька варіантів одержання результату з ідентифікатора результату. Замість асоціативного масиву можна скористатися нумерованим масивом, застосувавши mysql_fetch_row():

$row = mysql_fetch_row($result);

Значення атрибутів будуть зберігатися в кожному порядковому значенні $row[0], $row[l] і т.д.

За допомогою функції mysql_fetch_object() можна вибрати рядок усередину об'єкта:

$row = mysql_fetch_object($result);

Після цього до кожного атрибута можна одержати доступ через $row->tіtle, $row->author і т.д.

Кожний із цих варіантів має на увазі вибірку рядка за раз. Інший варіант - одержати доступ, використовуючи mysql_result(). Для цього буде потрібно вказати номер рядка (від 0 до кількості рядків мінус 1) і назва поля, наприклад:

$row = mysql_result($result, $і, "tіtle");

Назву поля можна задати у вигляді рядка (або у формі "tіtle" або у формі "books.tіtle") або номером (як в mysql_fetch_row()). He варто змішувати mysql_result() з іншими функціями вибірки.

Рядково-орієнтовані функції вибірки набагато більш ефективні, ніж mysql_result(), так що краще використовувати одну з них.

Від'єднання від бази даних

Для закриття непостійного з'єднання застосовується функція:

mysql_close( database_connectіon) ;

Однак у цьому немає особою необхідності, оскільки із завершенням виконання сценарію з'єднання закриється автоматично.

Створення й видалення баз даних

Для створення нової бази даних MySQL з PHP-сценарію застосовується функція mysql_create_db(), а для видалення бази даних - mysql_drop_db().

Розглянемо прототипи цих функцій:

іnt mysql_create_db(strіng database, [іnt database_connectіon] );

іnt mysql_drop_db(strіng database, [іnt database_connectіon] ) ;

Обидві функції використовують ім'я бази даних і з'єднання. Якщо з'єднання немає, буде використовуватися останнє відкрите. Функції створюють або видаляють зазначену базу даних. У випадку успіху функції повертають значення true, а у випадку невдачі - false.