PHP MySQL. Базові поняття MySQL і відмінності від текстових файлів.


Список - це текстовий файл. Або, скажімо, список учнів в класному журналі.
щоб отримати впорядкований список, ми повинні, при додаванні будь-якого запису, список переупорядочивать. При додаванні будь-! А якщо ми хочемо мати два і більше видів упорядкування? Наприклад, список учнів у нас складається за алфавітом, але нам цікаво подивитися його по успішності. Заводити два списки? НІ! Завести базу даних.
І зрозуміти перший, самий основний принцип. Порядок у даних буває тільки при вибірці їх з БД! Це дуже важливий факт. Дані в БД зберігаються не як в класному журналі - по порядку. А як у пісковому годиннику - купою. Чи не поставиш порядок виведення - виводитимуться від балди. Сама база не запам'ятовує, яка запис була першою, а яка - останньою. Але зате вона вміє сортувати за ознаками, вказаними користувачем при створенні таблиці.

Перше, що треба запам'ятати. У базі не буває першої і останньої записи. Про порядок можна говорити тільки при виведенні, якщо користувач сам поставив це порядок. наприклад, відсортувавши записи за алфавітом. Ось в такій вибірці є і перша і остання.
Якщо нам потрібно знати порядок занесення записів в базу - додайте поле, за допомогою якого це можна визначити.

Наступне, чим відрізняється БД від файлу - це довільний доступ. У файлі, для того, щоб звернутися до рядка в середині, треба перебрати по черзі всі йдуть до неї. При оновленні - ще гірше. Для того, щоб змінити рядок в строковому файлі - треба переписати його ВЕСЬ! Цілком. З БД же - все просто. Хочемо вибрати одну сходинку - вибираємо! Хочемо змінити один рядок - змінюємо. Хочемо видалити дві - видаляємо!
Примітка: Насправді, БД - це не чарівний ящик, і зберігає вона дані не в нематеріальному ефірі, а в тих же самих файлах. І точно так само їх переписує. Але робить це вона абсолютно прозоро для користувача.

При довільному доступі і відсутності внутрішньої нумерації «перший-другий-третій», перед нами постає проблема ідентифікації рядків. Припустимо, ми вивели рядки з бази на екран, і тепер, клікнувши на посилання, хочемо відредагувати одну з них. Як її запросити? За вмістом одного з полів? А раптом це вміст збігається з ще декількома записами? Нам потрібен унікальний ідентифікатор! В MySQL застосовано дотепне рішення. Одне з полів, що зазвичай називають `id` є Автоінкрементний, тобто, автоматично збільшується. При додаванні кожного нового запису, якщо id й вказати або значення дорівнює нулю, база присвоїть полю id значення, на одиницю більше, ніж у попереднього. Так ми отримали унікальний ідентифікатор - ні у одного рядка в цій таблиці id не співпадатиме. Тепер дуже просто відредагувати або вивести будь-який запис - досить вказати її id.
До речі, у Автоінкрементний id є ще одне побічна властивість. Відсортувавши таблицю по цьому полю, можна отримати ту саму горезвісну першу або останню запис Smile happy

Однак, з цим полем пов'язано безліч помилок і непорозумінь.

FAQ. ID.
По-перше, це поле помилково приймають за нумератор. Як в класному журналі - 1,2,3-й учень ... А якщо учня виключили зі школи? А якщо ми вибираємо не всіх учнів, а тільки хлопчиків?
Правило перше: id до нумерації не має ні найменшого відношення! По-перше, тому, що id можуть йти не по порядку, а по-друге, що все одно у нас порядок буває тільки при вибірці. Яка може бути якою завгодно, id в ній можуть йти зовсім вроздріб! Якщо ми хочемо пронумерувати результати - будь ласка, при виведенні додамо код на PHP, який буде це робити. В ЦІЙ вибірці. Нумерувати треба при виведенні. Саме тому, що варіантів вибірки може бути нескінченна кількість.
Подивимося, для чого ще новачкові може знадобитися нумерація? Для визначення кількості обраних записів. Для цього є функція - mysql_num_rows (). Вона нам допоможе при будь-вибіркою. У той час, як нумерація не допоможе нам зовсім, у випадках, наведених вище.
Правило друге: Міняти id записи не можна ніколи, ні в якому разі. По-перше, це просто ніколи не потрібно. По-друге, це ж у нас УНІКАЛЬНИЙ ідентифікатор. Поле id лише зовні нагадує цифри. Насправді - це спосіб ОДНОЗНАЧНО, і в будь-який час ідентифікувати запис. Припустимо, у нас є сайт з новинами. Хтось поставив посилання на новину з id = 1. Потім ми цей id змінили. В результаті людина прийде по посиланню не туди. Якщо ж вам необхідно id перенумерувати - значить, вам просто не потрібно автоінкрементне поле.

Мова SQL.
Тепер трохи про мову SQL. Це, як я вже говорив - геніальний винахід людства. Практично штучний інтелект. Посудіть самі.
Длял того, щоб вибрати імена всіх учнів школи, учнів в класі 7А, відсортувавши їх за алфавітом, треба написати такий запит:
SELECT lastname FROM school WHERE klass='7A' ORDER BY lastname
Це практично осмислене пропозицію англійською мовою!
Спробуємо зробити підрядковий переклад:
ВЫБРАТЬ фамилии ИЗ школы [такие,] ГДЕ класс равняется 7А, ОТСОРТИРОВАВ ФАМИЛИИ ПО АЛФАВИТУ
Ну як - непогано? Ми практично натуральним мовою говоримо базі, що нам треба - і вона видає нам потрібні рядки в потрібному порядку! І все це одним рядком! При цьому складність вибірки може бути будь-хто. Якби ми вибирали з текстового файлу - нам би довелося написати програму не так на один лист. А тут - одна строчка!
Ну як? Ви ще хочете колупатися з файлами?

FAQ. Перенесення даних між різними серверами.
Перенесення даних за допомогою дампа - файлів, що містять запити INSERT.
Тобто, на тому сервері, з якого ми хочемо перенести базу, ми генеруємо файл із запитами INSERT для кожного рядка кожної таблиці бази даних. А на віддаленому сервері просто виконуємо ці запити.

Найбільш правильний і прямий шлях отримати дамп - це скористатися утилітою командного рядка mysqldump
заходимо в DOS або в shell і пишемо
mysqldump -u<логин> -p<пароль> база > dump.sql
отримуємо файл dump.sql, який слід перенести на віддалений сервер і виконати там.
для цього треба викликати mysql shell таким чином:
mysql -u<логин> -p<пароль> база < dump.sql
все, база перенесена.
при відсутності доступу до Шеллу можна скористатися PHP скриптом Sypex Dumper

Практичне використання.
Дуже хороша підбірка матеріалів, навчальних роботі з БД є на сайті "PHP в деталях".