|
 |
Путь: >
>
Mysql
Mysql
Автор: - Yurik
Дата публикации - 11.05.2005
Просмотров: - 1822
Основи роботи з MySQL
PHP має дуже зручну підтримку СУБД МуСКЛ. Знаючи всього лиш декілька функцій можна ефективно працювати з базами даних. Але про все по порядку.
[p]Підключення до бази[/p]
Перед тим як проводити будь-які дії з базою даних, потрібно підключитися до сервера МуСКЛ. Для цього потрібно знати 4 речі: хост сервера, порт або сокет, користувач і пароль. Як правило використовується 'localhost' на порту 3306 або на Unix сокеті /tmp/mysql.sock (або інший шлях). Підключення можна зробити однією з наступних функцій mysql_connect() або mysql_pconnect(). У другому разі буде відкрите постійне підключення і, у більшості випадків, його не рекомендовано використовувати. Оскільки підключатися вам потрібно буде часто, параметри хоста, порта, користувача і пароль краще тримати в одному файлі і включати їх у різні сторінки. А ще краще всю процедуру підключення виокремити у функцію у конфігураційному файлі. Тоді якщо ви схочете змінити тип підключення, прийдеться міняти менше коду.
[php]
<?php
//config.php
function conn() {
$host="localhost:/var/lib/mysql.sock";
$user="mummy";
$pass="nui098QAh";
mysql_connect($host, $user, $pass) or return false;
return true;
}
?>[
/php]
Як бачите, функція повертає значення true або false, залежно від того, чи було під'єднання успішним. Якщо ви маєте декілька серверів, функцію можна викликати з параметрами.
[php]
<?php
//config.php
function conn($server) {
$host[1]="localhost:/var/lib/mysql.sock";
$user[1]="mummy";
$pass[1]="nui098QAh";
$host[2]="192.168.1.3";
$user[2]="mummy2";
$pass[2]="Tri76hKl";
$link=mysql_connect($host[$server], $user[$server], $pass[$server]) or return false;
return $link;
}
?>[
/php]
і викликати підключення так:
[php]
<?php
include('config.php');
$cn=conn(2) or die('Could not establish connection to MySQL server');
}
?>[
/php]
Як бачимо, ми присвоїли змінній $cn ($link) якесь значення. Навіщо ж воно нам? Це є ідентифікатор підключення до сервера. Це є ціле число, яке присвоює сервер для вашого підключення і ви повинні його пам'ятати, щоб проводити операції з базою. Якщо у скрипті всього одне підключення до сервера, це значення можна опустити, ПХП пам'ятає ідентифікатор останього підключення без явного вказання.
[p]Вибір бази даних[/p]
Перед тим як виконувати будь-які запити, потрібно вибрати базу даних, до якої будуть стосуватися ці зміни. Здійснюється це функцією mysql_select_db().
[nb]Типова помилка початківців - робити запити (query) до сервера, не вибравши базу даних якої вони стосуються функціює <b>mysql_select_db()</b>[/nb]
Функція має додатковий необов'язковий параметр ідентифікатора підключення. Якщо його не вказати, PHP використає ідентифікатор останнього підключення. Якщо до виклику функції не було зроблено mysql_connect(), він викличеться атоматично, але без жодних параметрів, тобто будуть використані параметри по змовчуванню і, якщо ви не виставляли їх у php.ini (а ви не такі дурні, щоб це робити), під'єднання не відбудеться. Уважно пишіть складні за структурою та ООП скрипти, щоб не допускати таких помилок.
[php]
<?php
//config.php
function conn($server, $base) {
$host[1]="localhost:/var/lib/mysql.sock";
$user[1]="mummy";
$pass[1]="nui098QAh";
$db[1][1]="employee"
$host[2]="192.168.1.3";
$user[2]="mummy2";
$pass[2]="Tri76hKl";
$db[2][1]="forum"
$db[2][2]="faq"
$link=mysql_connect($host[$server], $user[$server], $pass[$server]) or return false;
mysql_select_db($db[$server][$base], $link) or return false;
return $link;
}
?>[
/php]
і вибирати базу так:
[php]
<?php
include('config.php');
$cn=conn(2, 2) or die('Could not open MySQL database. Reason:'.mysql_errno().": ".mysql_error();
}
?>[
/php]
[nb]Функції <b>mysql_errno()</b> та <b>mysql_error()</b> корисні для відладки скриптів, вони деталізують останню помилку роботи з сервером MySQL (або останню для того підключення, яке вказане в параметрах <b>mysql_error($link)</b>)[/nb]
[p]Виконання запитів[/p]
Виконання запитів здійснюється функцією mysql_query(). Вона має один обовязковий і два додаткових параметри виклику. Обов'язково потрібно вказати правильний SQL запит.
[nb]Ні відміну від mysql клієнта, де всі запити закінчуються на крапку з комою, написання SQL запиту у PHP не допускає ";" у кінці[/nb]
[php]
<?php
include('config.php');
$sql="SHOW COLUMNS FROM tblpeople";
$result=mysql_query($sql);
?>
[
/php]
Як бачимо, ми не просто виконали SQL запит, вказаний у $sql а й прсвоїли $result результат роботи функції mysql_query(). Що ж це за результат? Якщо ваш запит починався на "SELECT, SHOW, EXPLAIN або DESCRIBE", то $result буде містити щось типу
[quote]Resource id #4[/quote] тобто вказівник на ресурс номер 4. Цей ресурс насправді - це буфер результату запиту на MySQL сервері. Щоб далі працювати з цим буфером, потрібно пам'ятати цей ідентифікатор. Для всіх інших типів SQL запитів $result буде містити TRUE, якщо запит синтаксично правильний. Незалежно від типу запиту $result буде містити FALSE тоді, і тільки тоді, коли запит мє неправильний синтаксис.
[nb]Типовою є помилка вважати, що запит на зміну бази даних (INSERT, UPDATE, DELETE) повертає TRUE, якщо відповідні дані буде змінено. Синтаксично правильний запит може нічого не змінити у базі даних, але $result буде TRUE.[php]
<?php
$sql="UPDATE tblpeople SET name='Vasya' WHERE id=-1"
if (mysql_query($sql)){ // хибна конструкція
echo "Ім'я змінено"; // буде виводитись завжди, тому що $sql маж правильний синтаксис
}
?>[
/php][/nb]
Для того, щоб взнати скільки насправді рядків було задіяно, потрібно використовувати одну з наступних функцій:
- mysql_num_rows($result) для запитів, що повертають ідентифікатор результату
- mysql_affected_rows([$link]) для всіх інших запитів н.: INSERT, UPDATE, DELETE, REPLACE.
Правильним буде
[php]
<?php
include('config.php');
$cn=conn(2, 2) or die('Could not open MySQL database. Reason:'.mysql_errno().": ".mysql_error();
$sql="UPDATE tblpeople SET name='Vasya' WHERE id>10";
mysql_query($sql);
// правильна конструкція
echo "Ім'я змінено для ".mysql_affected_rows($cn)." рядків";
?>[
/php]
[p]Що можна робити з ідентифікатором ресурсу $result?[/p]
Коли ви виконали "SELECT, SHOW, EXPLAIN або DESCRIBE" запит, вам потрібно працювати з тим буфером, на який посилається $result. Основна функція по роботі з ресурсом - mysql_fetch_array($result) та її одноногий брат mysql_fetch_row($result). Після кожного виклику mysql_fetch_array($result) повертає наступний рядок з ресурсу $result у вигляді масиву, де кожній колонці запиту присвоєно її ім'я та порядковий номер у таблиці. mysql_fetch_row($result) повертає ЛИШЕ порядковий номер і тому є вкрай незручною у користуванні і неозброєним оком не видно переваги у швидкості її роботи. Коли mysql_fetch_array($result) досягне останнього рядка буфера, вона поверне FALSE. Цю властивість використовують для виводу результату роботи у циклі:
[php]
<?php
include('config.php');
$cn=conn(2, 2) or die('Could not open MySQL database. Reason:'.mysql_errno().": ".mysql_error();
$sql="SELECT * FROM tblpeople WHERE name LIKE '%vasya%'";
$result=mysql_query($sql) or die("Check syntaxys of '$sql'");
if (!mysql_num_rows($result)){
echo "Вась не виявлено";
} else {
while ($row=mysql_fetch_array($result)){ //після останньої стрічки $row стане FALSE і цикл припиниться
echo $row['name']."<br>";
}
}
?>[
/php]
[p]Як працює механізм роботи з буфером запиту[/p]
Як було сказано, результат виконання SELECT запиту зберігається у буфері і це означає, що поки весь запит не виконається, буфер буде пустим і ви не зможете продовжувати виконувати скрипт. У більшості випадків це не відіграє ніякої ролі, але якщо вам потрібно обробити великий запит, то уникнувши буферизації, ви збережете пам'ять сервера і зможете не дочекавшись виконання mysql_query продовжити виконання скрипта. Якщо повернуті дані перевищують 7-8Mb (memory_limit=8M у php.ini) це єдиний спосіб роботи з ними. Для цього викориcтовується функція mysql_unbuffered_query() з єдиною різницею від mysql_query() що не можна використовувати mysql_num_rows() і викликавши інший запит, ви втратите дані попереднього.
[p]Як пересуватися по буферу[/p]
Як було сказано, mysql_fetch_array($result) повертає масив завжди наступного рядка. Якщо Вам потрібно отримати дані з довільного рядка у буфері, можна використовувати mysql_data_seek($result, $offset). Це переведе поточний вказівник буфера на рядок який є $offset-1 рядком у буфері (нумерація починається з нуля) таким чином, що далі виклик mysql_fetch_array($result) поверне цей рядок.
[p]Як закривати підключення і чи потрібно це робити[/p]
mysql_close() або mysql_close($link) закриває підключення до бази даних.
mysql_free_result($result) очищує буфер запиту і вивільняє пам'ять.
Згадані функції викликаються автоматично після закінчення роботи скрипта і, у більшості випадків, їх використання не відіграє ніякої ролі. Але є декілька випадків, коли викликати ці функції необхідно.
- Закрити mysql_pconnect() підключення можна лише через mysql_close()
- mysql_free_result($result) зменшує використання пам'яті, якщо Ваш скрипт недноразово виконує mysql_query(), що повертає значні об'єми даних.
[nb]Я настійливо рекомендую Вам використовувати <b>mysql_free_result($result)</b> відразу після того, як буфер Вам більше не потрібен, тому що на великих або складних або ООП скриптах це різко зменшує можливість допустити помилку написання скрипта і скорочує час відладки. Справа в тому, що Ви можете довгий час бити голову чому неправильно працює той чи інший блок програми, а все тому, що ви використовуєте якийсь старий $result (який може містити правильні, але неактуальні дані). Звертання ж до явно знищеного $result викличе помилку, яку легко виявити[/nb]
//To be continued
Обсудить в ФОРУМе - комментариев ()
Путь: >
>
Mysql
Если вы заметили орфографическую, стилистическую или другую ошибку на этой странице, просто выделите ошибку мышью и нажмите Ctrl+Enter.
|
|