Самый простой способ наполнить ваш сайт реальным содержанием — дать пользователю возможность сделать это за вас. Конечно, для ввода данных удобнее всего воспользоваться формой 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
.
Следующая страница, 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
.
Остается лишь создать страницу, на которой пользователь выбирает ссылки из списка. Я назвал этот файл 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
.