к оглавлению

Доступ к различным системам банков данных средствами PHP

Проект: каталок ссылок

Самый простой способ наполнить ваш сайт реальным содержанием — дать пользователю возможность сделать это за вас. Конечно, для ввода данных удобнее всего воспользоваться формой HTML.

Введенную пользователем информацию необходимо обработать и сохранить. В проекте предыдущей главы было показано, как легко эта задача решается при помощи РНР и текстового файла. Бесспорно, текстовые файлы хорошо подходят для хранения относительно маленьких и простых фрагментов данных, но в полноценных web-приложениях информация обычно хранится в базах данных. В настоящем примере база данных MySQL используется для хранения информации о web-сайтах. Для упрощения навигации сайты разделены на несколько категорий. Пользователь может ввести информацию о сайте в форме HTML и отнести его к одной из стандартных категорий, определенных администратором сайта. Кроме того, пользователь может загрузить индексную страницу и просмотреть список всех сайтов той или иной категории, щелкнув на ее названии.

Прежде всего вы должны решить, какие сведения о сайтах будут храниться в базе данных SQL. Для простоты я ограничусь следующим набором атрибутов: название, URL, категория, дата включения и описание. Таким образом, определение таблицы в MySQL выглядит примерно так:

mysql>create table bookmarks ( category INT, site_name char(35), url char(50), date_added date, description char(254) );

В определении таблицы bookmarks имеется пара моментов, заслуживающих внимания. Во-первых, информация о категории сайта почему-то хранится в виде целого числа — но разве не правильнее было бы сделать названия категорий более содержательными и понятными для пользователя? Не беспокойтесь, в ини-циализационном файле будет создан массив, связывающий целочисленные индексы с названиями категорий. В будущем администратор может изменять и даже удалять отдельные категории. Хранение информации о категориях заметно упрощает эту задачу. Кроме того, целочисленное поле обеспечивает экономию места на диске, поскольку название категории многократно сохраняется в таблице. Другое обстоятельство, относящееся к структуре таблицы, — ограничение длины описания 254 символами. В зависимости от этого объема описаний вместо типа char() можно воспользоваться типом medium или text. За дополнительной информацией о типах полей обращайтесь к документации MySQL.

Следующим шагом в работе над этим приложением будет создание инициализационного файла. Помимо глобальных переменных, в инициализационном файле определяются две функции: add_bookmark() и view_bookmark(). Функция add_bookmark() получает пользовательский ввод из формы и включает его в базу. Функция view_bookmark() получает индекс категории, читает из базы данных все записи, относящиеся к указанной категории, и отображает их в браузере. Инициализацион-ный файл приложения init.inc с комментариями приведен в листинге 11.8.

Листинг 11.8. Инициализационный файл каталога ссылок (init.inc).

<?php
// Файл: init.inc
// Назначение: глобальные переменные и функции.
// используемые в проекте
// Стандартный заголовок страницы 
$title = "My Bookmark Repository";
// Цвет фона
$bg_color = "white";
// Дата
$post_date = date("Ymd");
// Категории 
$categories = array(
"computers",
"entertainment",
"dining",
"lifestyle",
"government",
"travel");
// Данные сервера MySQL 
$host = "localhost"; 
$user = "root"; 
$pswd = "";
// Имя базы данных
$database = "book";
// Имя таблицы
$bookmark_table = "bookmarks";
// Цвет ячеек таблицы
$cell_color = "#c0c0c0";
// Установить соединение с сервером MySQL
@mysql_pconnect($host, $user, $pswd) or die("Couldn't connect to MySQL server!");
// Выбрать базу данных
@mysql_select_db($database) or die("Couldn't select Sdatabase database!");
// Функция: add_bookmark()
// Назначение: включение новой ссылки в таблицу bookmark.
function add_bookmark ($category, $site_name, $url, $description) {
GLOBAL $bookmark_table, $post_date;
$query = "INSERT INTO $bookmark_table VALUES(\"$category\", \"$site_name\", \"$url\", \"$post_date\", \"$description\")";
$result = @mysql_query($query) or die("Couldn't insert bookmark information!");
} // add_bookmark 
// Функция: view_bookmark()
// Назначение: выборка из таблицы bookmark всех ссылок,
// относящихся к категории $category.
function view_bookmark ($category) {
GLOBAL $bookmark_table, $cell_color, $categories;
$query = "SELECT site_name, url, date_added, description FROM $bookmark_table WHERE category = $category ORDER BY date_added DESC";
$result = mysql_query($query);
print "<div align=\"center\"><table cellpadding=\"2\" cellspacing=\"1\" border = \"0\" width = \"600\">";
print "<tr><td bgcolor=\"$cell_color\"><b>Category: $categories[$category]</b></td></tr>";
if (mysql_num_rows($result) > 0) :
while ($row = mysql_fetch_array($result)) :
print "<tr><td>";
print "<b>".$row["site_name"]."</b>";
print " | Posted: ".$row["date_added"]."<br>";
print "</td></tr>";
print "<tr><td>";
print "<a href = \"http://".$row["url"]."\">http://".$row["url"]."</a><br>";
print "</td></tr>";
print "<tr><td valign=\"top\">";
print $row["description"]."<br>";
print "</td></tr>";
print "<tr><td><hr></td></tr>";
endwhile;
print "<tr><td>There are currently no bookmarks falling under this category. Why don't you <a href=\"add_bookmark.php\">add one</a>?</td></tr>";
endif;
print "</table><a href=\"index.php\">Return to index</a> ";
print " <a href=\"add_bookmark.php\">Add a bookmark</a></div>";
}// view bookmark
?>

Следующая страница, add_bookmark.php (листинг 11.9), предназначена для ввода информации о новой ссылке, включаемой в базу данных. Для обработки пользовательских данных вызывается функция add_bookmark().

Листинг 11.9. Программа add_bookmark.php.

<html>
<?php
INCLUDE("init.inc");
?>
<head>
<title><?=$title;?></title> </head>
<body bgcolor="#ffffff" text="#000000" link="#808040" vlink="#808040" alink="#808040">
<?php
if (! $seenform=="y") :
?>
<form action="add_bookmark.php" method="post"> <input type="hidden" name="seenform" value="y">
Category:<br>
<select name="category">
<option value="">Choose a category:
<?php
while (list($key, $value) = each($categories)) :
print "<option value=\"$key\">$value"; 
endwhile;
?>
</select><br>
Site Name:<br>
<input type="text" name="site_name" size="15" maxlength="30" value=""><br>
URL: (do <i>not</i> include "http://"!)<br>
<input type="text" name="url" size="35" maxlength="50" value=""><br>
Description:<br>
<textarea name="description" rows="4" cols="30"></textarea><br>
<input type="submit" value="submit">
</form>
<?php
else :
add_bookmark($category, $site_name, $url, $description);
print "<h4>Your bookmark has been added to the repository.
<a href=\"Listing11-11.php\">Click here</a> to return to the index.</h4>";
endif;
?>

При исходной загрузке страницы в браузере отображается форма (рис. 11.5).

После сохранения ссылки в базе программа выдает соответствующее сообщение и создает ссылку для перехода к домашней странице приложения index.php (листинг 11.11).

Форма, отображаемая страницей add_bookmark.php
Рис. 11.5. Форма, отображаемая страницей add_bookmark.php.

Следующая страница, view_bookmark.php, просто вызывает функцию view_bookmark(). Код этой страницы приведен в листинге 11.10.

Листинг 11.10. Программа view_bookmark.php.

<html>
<?php
INCLUDE("init.inc"); 
?>
<head>
<title><?=$title;?></title>
</head>
<body bgcolor="<?=$bg_color;?>" text="#000000" link="#808040" vlink="#808040" alink="#808040">
<?
view_bookmark($category);
?>

Если занести в категорию dining информацию о нескольких сайтах, страница view_bookmark.php будет выглядеть примерно так, как показано на рис. 11.6.

Выполнение страницы view_bookmark.php для категории dining
Рис. 11.6. Выполнение страницы view_bookmark.php для категории dining.

Остается лишь создать страницу, на которой пользователь выбирает ссылки из списка. Я назвал этот файл index.php (листинг 11.11).

Листинг 11.11. Программа index.php.

<html>
<?php
INCLUDE("init.inc");
?>
<head>
<titlex?=$title;?></title>
</head>
<body bgcolor="<?=$bg_color;?>" text="#000000" link="#808040" vlink="#808040"
alink="#808040">
<h4>Choose bookmark category to view:</h4>
<?php
// Перебрать категории и создать соответствующие ссылки
while (list($key, $value) = each($categories)) :
print "<a href = \"view_bookmark.php?category=$key\">$value</a><br>";
endwhile;
?>
<p>
<b><a href="add_bookmark.php">Add a new bookmark</a></b>
</body>
</html>

Если оставить в массиве $categories значения, сохраненные в файле init.inc, в результате выполнения листинга 11.11 в браузер будет отправлен код HTML, приведенный в листинге 11.12.

Листинг 11.12. Выходные данные, сгенерированные при выполнении index.php.

<html>
<head>
<title></title>
</head>
<body bgcolor="white" text="#000000" link="#808040" vlink="#808040" alink="#808040">
<h4>Choose bookmark category to view:</h4>
<a href = "view_bookmark.php?category=0">computers</a><br>
<a href = "view_bookmark.php?category=1">entertainment</a><br>
<a href = "view_bookmark.php?category=2">dining</a><br>
<a href = "view_bookmark.php?category=3">lifestyle</a><br>
<a href = "view_bookmark.,php?category=4">government</a><br>
<a href = "view_bookmark.php?category=5">travel</a><br>
<p>
<b><a href="add_bookmark.php">Add a new bookmark</a></b>
</body>
</html>

Если щелкнуть на любой ссылке из приведенного выше,фрагмента HTML, в браузере загружается файл view_bookmark.php, который вызывает функцию view_bookmark() и передает ей значение переменной $category.

к оглавлению

Знаете ли Вы, что декомпозиция программы - это создание модулей, которые в свою очередь представляют собой небольшие программы, взаимодействующие друг с другом по хорошо определенным и простым правилам.

НОВОСТИ ФОРУМА

Форум Рыцари теории эфира


Рыцари теории эфира
 10.11.2021 - 12:37: ПЕРСОНАЛИИ - Personalias -> WHO IS WHO - КТО ЕСТЬ КТО - Карим_Хайдаров.
10.11.2021 - 12:36: СОВЕСТЬ - Conscience -> РАСЧЕЛОВЕЧИВАНИЕ ЧЕЛОВЕКА. КОМУ ЭТО НАДО? - Карим_Хайдаров.
10.11.2021 - 12:36: ВОСПИТАНИЕ, ПРОСВЕЩЕНИЕ, ОБРАЗОВАНИЕ - Upbringing, Inlightening, Education -> Просвещение от д.м.н. Александра Алексеевича Редько - Карим_Хайдаров.
10.11.2021 - 12:35: ЭКОЛОГИЯ - Ecology -> Биологическая безопасность населения - Карим_Хайдаров.
10.11.2021 - 12:34: ВОЙНА, ПОЛИТИКА И НАУКА - War, Politics and Science -> Проблема государственного терроризма - Карим_Хайдаров.
10.11.2021 - 12:34: ВОЙНА, ПОЛИТИКА И НАУКА - War, Politics and Science -> ПРАВОСУДИЯ.НЕТ - Карим_Хайдаров.
10.11.2021 - 12:34: ВОСПИТАНИЕ, ПРОСВЕЩЕНИЕ, ОБРАЗОВАНИЕ - Upbringing, Inlightening, Education -> Просвещение от Вадима Глогера, США - Карим_Хайдаров.
10.11.2021 - 09:18: НОВЫЕ ТЕХНОЛОГИИ - New Technologies -> Волновая генетика Петра Гаряева, 5G-контроль и управление - Карим_Хайдаров.
10.11.2021 - 09:18: ЭКОЛОГИЯ - Ecology -> ЭКОЛОГИЯ ДЛЯ ВСЕХ - Карим_Хайдаров.
10.11.2021 - 09:16: ЭКОЛОГИЯ - Ecology -> ПРОБЛЕМЫ МЕДИЦИНЫ - Карим_Хайдаров.
10.11.2021 - 09:15: ВОСПИТАНИЕ, ПРОСВЕЩЕНИЕ, ОБРАЗОВАНИЕ - Upbringing, Inlightening, Education -> Просвещение от Екатерины Коваленко - Карим_Хайдаров.
10.11.2021 - 09:13: ВОСПИТАНИЕ, ПРОСВЕЩЕНИЕ, ОБРАЗОВАНИЕ - Upbringing, Inlightening, Education -> Просвещение от Вильгельма Варкентина - Карим_Хайдаров.
Bourabai Research - Технологии XXI века Bourabai Research Institution