::: PHP.com.ua - учимся вместе. ::: ::: PHP.com.ua - учимся вместе. :::



 
   - header
  - Я канєшно вибачаюся, ну от вирішив навчи...
  - Трудности с включенным safe mode, не вид...
  - Поможіть з установкою локальки
  - Помогите с функцией utf2win1251
  - Вывод окна предупреждения
  - допоможіть нічого не розумію


Главная
Новости
Статьи
Шпаргалки
Файлы
О проекте
Форум
Футболки


FREEhost.com.ua - купил хостинг 10 у.е. на Begun в подарок.

iName.com.ua - регистрация доменных имен и хороший хостинг.

Библиотека программиста - нужный вам исходник или документация по необходимому для вас языку программирования.

Designclub - Клуб дизайнеров Украины.

Регистрация доменов
Хостинг

 HowtoForge.ORG.UA - Это первый Украинский ресурс развития open source программного обеспечения


Путь: Статьи > Базы данных > 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(22) 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]
&lt;?php
$sql=&quot;UPDATE tblpeople SET name='Vasya' WHERE id=-1&quot;
if (mysql_query($sql)){ // хибна конструкція
 echo &quot;Ім'я змінено&quot;;   // буде виводитись завжди, тому що $sql маж правильний синтаксис
}
?&gt;[

/php][/nb]
Для того, щоб взнати скільки насправді рядків було задіяно, потрібно використовувати одну з наступних функцій:

  1. mysql_num_rows($result) для запитів, що повертають ідентифікатор результату
  2. mysql_affected_rows([$link]) для всіх інших запитів н.: INSERT, UPDATE, DELETE, REPLACE.

Правильним буде
[php]
<?php
include('config.php');
$cn=conn(22) 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(22) 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) очищує буфер запиту і вивільняє пам'ять.

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

  1. Закрити mysql_pconnect() підключення можна лише через mysql_close()
  2. mysql_free_result($result) зменшує використання пам'яті, якщо Ваш скрипт недноразово виконує mysql_query(), що повертає значні об'єми даних.
    [nb]Я настійливо рекомендую Вам використовувати <b>mysql_free_result($result)</b> відразу після того, як буфер Вам більше не потрібен, тому що на великих або складних або ООП скриптах це різко зменшує можливість допустити помилку написання скрипта і скорочує час відладки. Справа в тому, що Ви можете довгий час бити голову чому неправильно працює той чи інший блок програми, а все тому, що ви використовуєте якийсь старий $result (який може містити правильні, але неактуальні дані). Звертання ж до явно знищеного $result викличе помилку, яку легко виявити[/nb]


//To be continued



Обсудить в ФОРУМе - комментариев ()


Путь: Статьи > Базы данных > Mysql

Если вы заметили орфографическую, стилистическую или другую ошибку на этой странице, просто выделите ошибку мышью и нажмите Ctrl+Enter.
Контакты Design by webFaction Ukrainian PHP Group 2004-2005