![]() |
Главная Случайная страница Контакты | Мы поможем в написании вашей работы! | |
|
Назва й альтернативна назва є рядками менш ніж 255 символів довжиною (тобто мають тип VARCHAR(255)), опис - текстове поле (має тип TEXT), а в полях автор і зображення містяться ідентифікатори автора з колекції Persons і зображення експоната з колекції Images відповідно.
Отже, у нас є якась таблиця в базі даних. Щоб побудувати інтерфейс для додавання інформації в цю таблицю, потрібно її структуру (тобто набір її полів) відобразити в html-форму.
Розіб'ємо цю задачу на наступні підзадачі:
· встановлення з'єднання з БД;
· вибір робочої БД;
· одержання списку полів таблиці;
· відображення полів у html-форму.
Після цього дані, введені у форму, потрібно записати в базу даних. Розглянемо всі ці задачі поступово.
2.1. Встановлення з'єднання із БД
Отже, перше, що потрібно зробити, - це встановити з'єднання з базою даних. Скористаємося функцією mysql_connect. Синтаксис mysql_connect:
mysql_connect ([рядок server [, рядок username [, рядок password [, логічне new_link [, ціле client_flags]]]]])
Дана функція встановлює з'єднання із сервером MySQL і повертає вказівник на це з'єднання або FALSE у випадку невдачі. Для відсутніх параметрів встановлюються наступні значення за замовчуванням:
server = 'localhost:3306'
username = ім'я користувача власника процесу сервера
password = порожній пароль
Якщо функція викликається двічі з тими самими параметрами, то нове з'єднання не встановлюється, а повертається посилання на старе з'єднання. Щоб цього уникнути, використовують параметр new_link, що змушує в будь-якому випадку відкрити ще одне з'єднання.
Параметр client_flags - це комбінація наступних констант: MYSQL_CLIENT_COMPRESS (використовувати протокол стиску), MYSQL_CLIENT_IGNORE_SPACE (дозволяє вставляти пробіли після імен функцій), MYSQL_CLIENT_INTERACTIVE (чекати interactive_timeout секунд - замість wait_timeout - до закриття з'єднання).
Параметр new_link з'явився в PHP 4.2.0, а параметр client_flags - у PHP 4.3.0.
З'єднання із сервером закривається при завершенні виконання скрипта, якщо воно до цього не було закрито за допомогою функції mysql_close().
Отже, установлюємо з'єднання з базою даних на локальному сервері для користувача nina з паролем "123":
<?
$conn = mysql_connect("localhost", "nina","123")
or die("Неможливо встановити з'єднання: ". mysql_error());
echo "З'єднання встановлене";
mysql_close($conn);
?>
Дія mysql_connect рівносильна команді shell>mysql -u nina -p12314.2. Вибір бази даних.
Після встановлення з'єднання потрібно вибрати базу даних, з якою будемо працювати. Наші дані зберігаються в базі даних book. У MySQL вибір бази даних здійснюється за допомогою команди use:
mysql>use book;
У PHP для цього існує функція mysql_select_db.
Синтаксис mysql_select_db:
логічне mysql_select_db (рядок database_name [, ресурс link_identifier])
Ця функція повертає TRUE у випадку успішного вибору бази даних і FALSE - у протилежному випадку.
Зробимо базу даних book робочою:
<?
$conn = mysql_connect("localhost","nina","123")
or die("Неможливо встановити з'єднання: ". mysql_error());
echo "З'єднання встановлене";
mysql_select_db("book");
?>
2.2. Одержання списку полів таблиці
Тепер можна зайнятися власне розв’язанням задачі. Як одержати список полів таблиці? Дуже просто. У PHP і на цей випадок є своя команда - mysql_list_fields.
Синтаксис mysql_list_fields:
ресурс mysql_list_fields (рядок database_name, рядок table_name[, ресурс link_identifier])
Ця функція повертає список полів у таблиці table_name у базі даних database_name. Отже, вибирати базу даних нам було необов'язково, але це знадобиться пізніше. Як можна помітити, результат роботи цієї функції - змінна типу ресурс. Тобто це не зовсім те, що ми хотіли отримати. Це посилання, яке можна використовувати для одержання інформації про поля таблиці, включаючи їх назви, типи і прапори.
Функція mysql_field_name повертає ім'я поля, отриманого в результаті виконання запиту. Функція mysql_field_len повертає довжину поля. Функція mysql_field_type повертає тип поля, а функція mysql_field_flags повертає список прапорів поля, записаних через пробіл. Типи полів можуть бути int, real, string, blob і т.д. Прапори можуть бути not_null, primary_key, unique_key, blob, auto_increment і т.д.
Синтаксис у всіх цих команд однаковий:
рядок mysql_field_name (ресурс result, ціле field_offset)
рядок mysql_field_type (ресурс result, ціле field_offset)
рядок mysql_field_flags (ресурс result, ціле field_offset)
рядок mysql_field_len (ресурс result, ціле field_offset)
Тут result - це ідентифікатор результату запиту (наприклад, запиту, відправленого функціями mysql_list_fields або mysql_query (про неї буде розказано пізніше)), а field_offset - порядковий номер поля в результаті.
Функції mysql_list_fields або mysql_query, являють собою таблицю, а точніше, вказівник на неї. Щоб одержати з цієї таблиці конкретні значення, потрібно задіяти спеціальні функції, що порядково читають цю таблицю. До таких функцій і відносяться mysql_field_name і т.п. Щоб перебрати всі рядки в таблиці результату виконання запиту, потрібно знати кількість рядків у цій таблиці. Команда mysql_num_rows(ресурс result) повертає кількість рядків у безлічі результатів result.
А тепер спробуємо одержати список полів таблиці Artifacts (колекція експонатів).
<?
$conn = mysql_connect("localhost","nina","123")
or die("Неможливо встановити з'єднання: ".mysql_error());
echo "З'єднання встановлене";
mysql_select_db("book");
$list_f = mysql_list_fields ("book","Artifacts",$conn);
$n = mysql_num_fields($list_f);
for($i=0; $i<$n; $i++){
$type = mysql_field_type($list_f, $i);
$name_f = mysql_field_name($list_f,$i);
$len = mysql_field_len($list_f, $i);
$flags_str = mysql_field_flags ($list_f, $і);
echo "<br>Ім'я поля: ".$name_f;
echo "<br>Тип поля: ".$type;
echo "<br>Довжина поля: ".$len;
echo "<br>Рядок прапорів поля: ".$flags_str. "<hr>"; }
?>
У результаті повинно вийти приблизно наступне (якщо в таблиці всього два поля, звичайно):
Ім'я поля: id
Тип поля: int
Довжина поля: 11
Рядок прапорів поля: not_null primary_key auto_increment
Ім'я поля: title
Тип поля: string
Довжина поля: 255
Рядок прапорів поля:
2.3. Відображення списку полів у html-формі
Тепер дещо підкоректуємо попередній приклад. Будемо не просто виводити інформацію про поле, а відображати його як потрібний елемент html-форми. Так, елементи типу BLOB переведемо в textarea (помітимо, що поле description, що ми створювали з типом TEXT, відображається як таке, що має тип BLOB), числа й рядки відобразимо як текстові рядки введення <input type=text>, а елемент, що має мітку автоінкремента, взагалі не будемо відображати, оскільки його значення встановлюється автоматично.
Усе це розв’язується досить просто, за винятком виділення зі списку прапорів прапора auto_increment. Для цього потрібно скористатися функцією explode.
Синтаксис explode:
масив explode(рядок separator, рядок string [, int limit])
Ця функція розбиває рядок string на частини за допомогою роздільника separator і повертає масив отриманих рядків.
У нашому випадку як роздільник потрібно взяти пробіл " ", а як задану стрічку для розбивки - рядок прапорів поля.
Отже, створимо форму для введення даних у таблицю Artifacts:
<?
$conn=mysql_connect("localhost","nina","123"); // встановлюємо з’єднання
$database = "book";
$table_name = "Artifacts";
mysql_select_db($database); // обираємо базу даних для роботи
$list_f = mysql_list_fields($database,$table_name);
// отримуємо список полів в базі
$n = mysql_num_fields($list_f);
// кількість стрічок в результаті попереднього запиту
//тобто скільки всього полів в таблиці Artifacts)
echo "<form method=post action=insert.php>";
// створюємо форму для введення даних
echo "<TABLE BORDER=0 CELLSPACING=0 width=50%><tr>
<TD BGCOLOR='#005533' align=center>
<font color='#FFFFFF'>
<b> Add new row in $table_name</b>
</font></td></tr>
<tr><td></td></tr></TABLE>";
echo "<table border=0 CELLSPACING=1 cellpadding=0 width=50% >";
// для кожного поля отримуємо його ім’я, тип, довжину й прапори
for($i=0;$i<$n; $i++){
$type = mysql_field_type($list_f, $i);
$name_f = mysql_field_name ($list_f,$i);
$len = mysql_field_len($list_f, $i);
$flags_str = mysql_field_flags ($list_f, $i);
// із стрічки прапорів робимо масив, де кожен елемент масиву – прапор поля,
$flags = explode(" ", $flags_str);
foreach ($flags as $f){
if ($f == 'auto_increment') $key = $name_f;
// запам’ятовуємо ім’я інкремента
}
/* для кожного поля, що не є автоінкрементом, в
залежності від його типу виводимо потрібний елемент форми */
if ($key <> $name_f){
echo "<tr><td align=right bgcolor='#C2E3B6'>
<font size=2><b> ". $name_f."</b></font>
</td>";
switch ($type){
case "string":
$w = $len/5;
echo "<td><input type=text name=\"$name_f\" size = $w ></td>";
break;
case "int":
$w = $len/4;
echo "<td><input type=text name=\"$name_f\" size = $w ></td>";
break;
case "blob":
echo "<td><textarea rows=6 cols=60 name=\"$name_f\"></textarea></td>";
break;
}
}
echo "</tr>";
echo "</table>";
echo "<input type=submit name='add' value='Add'>";
echo "</form>";
?>
Дата публикования: 2015-01-13; Прочитано: 240 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!