PHP підтримує роботу з базою даних MySQL. Спеціальні вбудовані функції для роботи з MySQL дають змогу просто й ефективно працювати з цією СУБД: виконувати будь-які запити, читати і записувати дані, обробляти помилки.
Сценарій, який під'єднується до БД, виконує запит і показує результат, складатиметься всього з кількох рядків. Для роботи з MySQL не треба нічого додатково встановлювати та налаштовувати; все необхідне вже доступне разом зі стандартною поставкою PHP.
mysqli (MySQL Improved) - це розширення PHP, яке додає в мову повну підтримку баз даних MySQL. Це розширення підтримує безліч можливостей сучасних версій MySQL.
Типовий процес роботи з СУБД у PHP-сценарії складається з декількох кроків:
Встановити підключення до сервера СУБД, передавши необхідні параметри: адресу, логін, пароль.
Переконатися, що підключення пройшло успішно: сервер СУБД доступний, логін і пароль вірні тощо.
Сформувати правильний SQL запит (наприклад, на читання даних з таблиці).
Переконатися, що запит було виконано успішно.
Отримати результат від СУБД у вигляді масиву із записів.
Використовувати отримані записи у своєму сценарії (наприклад, показати їх у вигляді таблиці).
Перед початком роботи з даними всередині MySQL, потрібно відкрити з'єднання з сервером СУБД. У PHP це робиться за допомогою стандартної функції mysqli_connect(). Функція повертає результат - об'єкт класу mysqli. Цей ресурс використовується для всіх наступних операцій з MySQL.
Тож щоби виконати з'єднання з сервером, необхідно знати як мінімум три параметри:
Адреса сервера СУБД;
Логін;
Пароль.
Якщо ви дотримувалися стандартної процедури встановлення MySQL або використовуєте OpenServer, то адресою сервера буде localhost, логіном - root. У разі використання OpenServer пароль для підключення - це порожній рядок '', а під час самостійного встановлення MySQL пароль ви задавали в одному з кроків майстра встановлення.
Базовий синтаксис функції mysqli_connect():
mysqli_connect(<адреса сервера>, <ім'я користувача>, <пароль>, <ім'я бази даних>);
Перше, що потрібно зробити після з'єднання з СУБД - це виконати перевірку, що воно було успішним. Ця перевірка потрібна, щоб виключити помилку під час підключення до БД. Неправильні параметри підключення, неправильне налаштування або високе навантаження змусить MySQL відкидати нові підключення. Усі ці ситуації призведуть до неможливості з'єднання, тому програміст повинен перевірити успішність підключення до сервера, перш ніж виконувати такі дії.
З'єднання з MySQL встановлюється один раз у сценарії, а потім використовується при всіх запитах до БД.
Результатом виконання функції mysqli_connect() буде значення спеціального типу - об'єкт класу mysqli. Якщо підключення до MySQL не вдалося, то функція mysqli_connect() замість об'єкту поверне логічне значення типу "брехня" - false. Доброю практикою буде завжди перевіряти результат виконання цієї функції і порівнювати його з неправдою.
З'єднання з MySQL і перевірка на помилки:
<?php
$link = mysqli_connect("localhost", "root", "");
if ($link === false){
print("Ошибка: Не вдається підключитися до MySQL: " . mysqli_connect_error());
} else {
print("З'єднання встановлене успішно");
}
Функція mysqli_connect_error() просто повертає текстовий опис останньої помилки MySQL.
Насамперед після встановлення з'єднання вкрай бажано явно задати кодування, яке буде використовуватися під час обміну даними з MySQL. Якщо цього не зробити, то замість записів зі значеннями, написаними кирилицею, можна отримати послідовність зі знаків питання: ?????????????????. Викличте цю функцію відразу після успішного встановлення з'єднання: mysqli_set_charset($con, "utf8");
Встановивши з'єднання і визначивши кодування, ми готові виконати свої перші SQL-запити. Ви вже вмієте складати коректні SQL команди і виконувати їх через консольний або візуальний інтерфейс MySQL-клієнта. Ті ж самі запити можна відправляти без змін і з PHP-сценарію. Допоможуть у цьому кілька вбудованих функцій мови.
Слід розділяти всі SQL-запити на дві групи:
Читання інформації (SELECT).
Модифікація (UPDATE, INSERT, DELETE).
Під час виконання запитів із середовища PHP, запити з другої групи повертають тільки результат їхнього виконання: успіх або помилку.
Запити першої групи в разі успішного виконання повертають спеціальний об'єкт результату класу mysqli_result. Його, своєю чергою, можна перетворити в асоціативний масив (якщо потрібен один запис) або в двовимірний масив (якщо потрібен список записів).
Повернемося до нашого проєкту - щоденника спостережень за погодою. Почнемо практичну роботу із заповнення таблиць даними. Для початку додамо хоча б одне місто в таблицю cities.
Вираз INSERT INTO використовується для додавання нових записів у таблицю бази даних.
Складемо коректний SQL-запит на вставлення запису з ім'ям міста, а потім виконаємо його шляхом передачі цього запиту у функцію mysqli_query(), щоб додати нові дані в таблицю.
<?php
$link = mysqli_connect("localhost", "root", "");
$sql = 'INSERT INTO cities SET name = "Київ"';
$result = mysqli_query($link, $sql);
if ($result === false) {
print("Сталася помилка при виконанні запиту");
}
Зверніть увагу, що першим параметром для функції mysqli_query() передається об'єкт класу mysqli, отриманий від функції mysqli_connect(), другим параметром слідує рядок із SQL-запитом.
У разі запитів на зміну даних (не SELECT) результатом виконання буде логічне значення - true або false, яке означатиме, що запит виконати не вдалося. Для отримання рядка з описом помилки існує функція mysqli_error($link).
Наступним кроком буде додавання погодного запису для нового міста. Погодні записи зберігає таблиця weather_log, але, щоб послатися на місто, необхідно знати ідентифікатор запису з таблиці cities.
Тут стане в пригоді функція mysqli_insert_id(). Вона приймає єдиний аргумент - ресурс з'єднання, а повертає ідентифікатор останнього доданого запису.
Тепер у нас є все необхідне, щоб додати погодний запис. Ось який вигляд матиме комплексний приклад із підключенням до MySQL і додаванням двох нових записів:
<?php
$link = mysqli_connect("localhost", "root", "");
if ($link === false){
print("Помилка: Не вдається підключитися до MySQL " . mysqli_connect_error());
} else {
$sql = 'INSERT INTO cities SET name = "Київ"';
$result = mysqli_query($link, $sql);
if ($result === false) {
print("Сталася помилка при виконанні запиту");
} else {
$city_id = mysqli_insert_id($link);
$sql = 'INSERT INTO weather_log SET city_id = ' . $city_id . ', day = "2017-09-03", temperature = 10, cloud = 1';
$result = mysqli_query($link, $sql);
if ($result === false) {
print("Сталася помилка при виконанні запиту");
}
}
}
Інша часта операція під час роботи з базами даних у PHP - це отримання записів із таблиць (запити типу SELECT). Складемо SQL-запит, який буде використовувати SELECT вираз. Потім виконаємо цей запит за допомогою функції mysqli_query(), щоб отримати дані з таблиці.
У цьому прикладі показано, як вивести всі наявні міста з таблиці cities:
<?php
$sql = 'SELECT id, name FROM cities';
$result = mysqli_query($link, $sql);
while ($row = mysqli_fetch_array($result)) {
print("Місто: " . $row['name'] . "; Ідентифікатор: . " . $row['id'] . "<br />");
}
У прикладі вище результат виконання функції mysqli_query() збережений у змінній $result. У цій змінній знаходяться не дані з таблиці, а спеціальний тип даних - так зване посилання на результати запиту.
Щоб отримати дійсні дані, тобто записи з таблиці, слід використовувати іншу функцію - mysqli_fetch_array() - і передати їй єдиним параметром це саме посилання. Тепер кожен виклик функції mysqli_fetch_array() буде повертати наступний запис з усього результуючого набору записів у вигляді асоціативного масиву.
Цикл while тут використовується для "проходу" по всіх записах з отриманого набору записів. Значення поля кожного запису можна дізнатися просто звернувшись за ключем цього асоціативного масиву.
Іноді буває зручно після запиту на читання не викликати в циклі mysqli_fetch_array для витягання чергового запису за порядком, а отримати їх одразу всі одним викликом. PHP так теж уміє.
Функція mysqli_fetch_all($res, MYSQLI_ASSOC) поверне двовимірний масив з усіма записами з результату останнього запиту. Перепишемо приклад із показом наявних міст із її використанням:
<?php
$sql = 'SELECT id, name FROM cities';
$result = mysqli_query($link, $sql);
$rows = mysqli_fetch_all($result, MYSQLI_ASSOC)
foreach ($rows as $row) {
print("Місто: " . $row['name'] . "; Ідентифікатор: . " . $row['id'] . "<br />");
}
Часто буває необхідно дізнатися, скільки всього записів поверне виконаний SQL запит. Це може допомогти під час організації посторінкової навігації, або просто як інформація. Дізнатися число записів допоможе функція mysqli_num_rows(), якій слід передати посилання на результат запиту.