Зберігання інформації в базах даних
Приклад 8.1. Підключення до програми бази даних за допомогою об'єкта типу PDO
$db = new PDO('mysql:host=localhost;dbname=imcs', 'peturik', 'wazer1');
Символьний рядок, що передається через перший аргумент конструктору класу PDO, називається ім'ям джерела даних (DSN). Він починається з префікса, що визначає тип підключаємої програми бази даних. Потім йде двокрапка (:) і розділені крапкою з комою пари "ключ-значення"; що надають відомості про порядок підключення. Якщо для підключення до бази даних потрібно вказати ім'я користувача та пароль, ці відомості передаються в якості другого і третього аргументів конструктору класу PDO.
При вдалому результаті операції new PDO() повертається об'єкт, застосовуваний для взаємодії з базою даних. А якщо при підключенні до неї виникне проблема, то буде згенеровано виняток типу PDOException. Винятки, які можуть бути згенеровані конструктором класу PDO, слід перехопити, щоб перевірити, чи вдалося підключитися до бази даних, перш ніж продовжити виконання програми.
Приклад 8.2. Перехоплення винятків, що виникають при помилках підключення до бази даних
<?php try { $db = new PDO('mysql:host=localhost;dbname=imcs', 'peturik', 'wazer1'); //зробити щось з об'єктом в змінній $db } catch (PDOException $e) { print "Couln't connect to the database: " . $e->getMessage(); } ?>Couln't connect to the database: SQLSTATE[HY000] [1045] Access denied for user 'peturik'@'localhost' (using password: YES)
- try - спробувати
- catch - виловити, спіймати, перехопити
Код який генерує виняток, повинен бути оточений блоком try, для того, щоб можна було перехопити виняток. Кожен блок try повинен мати як мінімум один відповідний йому блок catch або finally.
Пример 8.3. Создание таблицы
CREATE ТАВLЕ dishes ( dish id INTEGER PRIМARY КЕУ, dish_пame VARCНAR(255), price DECIМAL(4,2), is_spicy INT )
Таблиця 8.2. Типи стовпців, найбільш уживані в таблицях бази даних
Тип поля
Опис
VARCHAR(length)
Символьний рядок змінної довжини, обумовленої параметром length
INT
Ціле число
BLOB1
Строкові або двійкові дані довжиною до 64 Кбайт
DECIMAL(total_digits, decimal_places)
Десятичне число, де загальна кількість цифр визначається параметром total_digits, ф кількість цифр після десятичной крапки - параметром decimal_places
DATETIME2
Дата та час, наприклад 1975-03-10 19:45:03 або 2038-01-18 22:14:07
1 Цей тип поля в PostgreSQL називається BYTEA замість BLOD
2 Цей тип поля в Oracle називається DATE замість DATETIME
Щоб створити конкретну таблицю в базі даних, необхідно надіслати їй запит SQL з командою CREATE ТАВLЕ. З цією метою слід викликати метод ехес() після підключення до бази даних за допомогою операції new PDO()
Приклад 8.4. Відпралення запиту SQL з командою CREATE TABLE програмі бази даних
<?php try { $db = new PDO('mysql:host=localhost;dbname=imcs', 'peturik', 'wazer1'); $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $q = $db->exec("CREATE TABLE dishes ( dish_id INT, dish_name VARCHAR(255), price DECIMAL(4,2), is_spicy INT )"); } catch (PDOException $e) { print "Couldn't create table: " . $e->getMessage(); } ?>
- PDO::setAttribute - Встановлює атрибут об'єкту PDO
- PDO::ATTR_ERRMODE - Режим повідомлень про помилки (має власні атрибути, такі як: PDO::ERRMODE_EXCEPTION)
- PDO::ERRMODE_EXCEPTION - Викидати винятки.
- exec - Виконати зовнішню програму
- Exception::getMessage - Отримує повідомлення винятка
Приклад використання Exception::getMessage <?php try { throw new Exception("Яке небудь повідомлення про помилку"); } catch(Exception $e) { echo $e->getMessage(); } ?>
Результат виконання прикладу:
Яке небудь повідомлення про помилку - Даний оператор (::) дозволяє звернутися до статичних методів або констант класу, без створення об'єкта.
Приклад 8.6. Введення інформації в базу даних за допомогою метода exec()
<?php try { $db = new PDO('mysql:host=localhost;dbname=imcs', 'peturik', 'wazer1'); $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $affectedRows = $db->exec("INSERT INTO dishes (dish_name, price, is_spicy) VALUES ('Sesame Seed Puff', 2.50, 0)"); } catch (PDOException $e) { print "Couldn't insert a row: " . $e->getMessage(); } ?>
Метод exec() повертає кількість рядків таблиці, викликаних в запиті SQL, відправленому серверу бази даних
Приклад 8.7. Перевірка помилок виконання запиту SQL за допомогою метода exec()
<?php try { $db = new PDO($dsn, $un, $pw); $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $affectedRows = $db->exec("INSERT INTO dishes (dish_size, dish_name, price, is_spicy) VALUES ('large', 'Sesame Seed Puff', 2.50, 0)"); } catch (PDOException $e) { print "Couldn't insert a row: " . $e->getMessage(); } ?>(Couldn't insert a row: PDO::__construct(): Argument #1 ($dsn) must be a valid data source name)
$Db->setAttribute() наказує розширенню PDO згенерувати виняток в будь-який момент, коли виникне помилка
У розширенні PDO є три режими видачі помилок: винятки, негласний і попередження.
Приклад 8.8. Робота з базою даних в негласному режимі видачі помилок
<?php //Конструктор завжди генерує виняток, //якщо йому не вдається виконати свою задачу try { $db = new PDO('mysql:host=localhost;dbname=imcs', 'peturik', 'wazer1'); } catch (PDOException $e) { print "Couldn't connect: " . $e->getMessage(); } $result = $db->exec("INSERT INTO dishes (dish_size, dish_name, price, is_spicy) VALUES ('large', 'Sesame Seed Puff', 2.50, 0)"); if (false === $result) { $error = $db->errorInfo(); print "Couldn't insert!\n"; print "SQL Error={$error[0]}, DB Error={$error[1]}, Message={$error[2]}\n"; } ?>Couldn't connect: PDO::__construct(): Argument #1 ($dsn) must be a valid data source name