Рецепты программирования на PHP

  Главная   Учебник   Статьи   FAQ   Книги   Ссылки  

Каталог ссылок в примерах

Евгений Кучеров aka Razor

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

Нужно сперва создать 3 таблицы, в 1-ой (категории) будут храниться названия категорий, во 2-ой (sub_categories) будут подкатегории, а уже в 3-ей (links) сами ссылки. Создаем:

CREATE TABLE categories (
# уникальный идентификатор
id int(11) NOT NULL auto_increment,
# название категории
name varchar(255) NOT NULL default '',
PRIMARY KEY (id), UNIQUE KEY id (id,name)
)
CREATE TABLE sub_categories (
# уникальный идентификатор подкатегории
id int(11) NOT NULL auto_increment,
# идентификатор категории, куда входит данная подкатегория
cid int(11) NOT NULL default '0',
# название подкатегории
name varchar(255) NOT NULL default '',
PRIMARY KEY (id), UNIQUE KEY id (id)
)
CREATE TABLE links (
# уник. идент-р
id int(11) NOT NULL auto_increment,
# краткое название ссылки
name varchar(100) NOT NULL default '',
# адрес в интернете (http://vasya.pupkin.ru)
url varchar(255) NOT NULL default '',
# полное описание ссылки
description text,
# идентификатор подкатегории
sid int(11) NOT NULL default '0',
# счетчик посещений ссылки с Вашего сайта
counter int(11) NOT NULL default '0',
PRIMARY KEY (id), UNIQUE KEY id (id)
)

Все эти таблицы можно создать с помощью очень удобного phpMyAdmin (http://phpwizard.net/phpMyAdmin) или следующим скриптом (прилагается install.php)

<?
include "config.php"; // здесь идет подключение к БД
mysql_query("CREATE TABLE categories (id int(11) NOT NULL auto_increment,
name varchar(255) NOT NULL default '', PRIMARY KEY  (id),
UNIQUE KEY id (id,name))");
mysql_query("CREATE TABLE sub_categories (id int(11) NOT NULL auto_increment,
cid int(11) NOT NULL default '0', name varchar(255) NOT NULL default '',
PRIMARY KEY  (id), UNIQUE KEY id (id))");
mysql_query("CREATE TABLE links (id int(11) NOT NULL auto_increment,
name varchar(100) NOT NULL default '', url varchar(255) NOT NULL default '',
description text, sid int(11) NOT NULL default '0',
counter int(11) NOT NULL default '0', PRIMARY KEY  (id),
UNIQUE KEY id (id))");
?>

Создаются скрипты (index.php, add.php, config.php, go.php).

Рассмотрим сначала index.php

<?
include "config.php";
include "header.inc.php"; // шапка страницы
// если не указана категория (cid) или подкатегория (sid)
// выводим список всех основных категорий (главная страница)
if(!isset($cid) && !isset($sid)) {
// выясняем кол-во категорий
$cats = tablecount($t_category);
$i = 0;
// посылаем запрос выборки категорий из базы данных
$qc = mysql_query("select * from $t_category order by name");
print "<div align=center>\n";
print "<table width=600 cellspacing=2 cellpadding=2 border=0>\n";
// последовательно обходим все категории
while($qcrow = mysql_fetch_array($qc)) {
// если четный индекс у категории значит начинаем новую строку в таблице
if($i%2 == 0) { print "<tr>\n"; }
print "<td width=50%>\n";
// выводим ссылку на список подкатегорий в данной категории
print "<b><a href="index.php?cid=".$qcrow["id"]."">".
       $qcrow["name"]."</a></b><br>\n";
// здесь происходит выборка подкатегорий для данной категории
// и ограничиваемся первыми пятью (далее стоит условие)
$qs = mysql_query("select * from $t_subcategory where cid='".$qcrow["id"]."'
      order by name");
$k = 0;
while($qsrow = mysql_fetch_array($qs)) {
// если это шестой по счету выводим ссылку на список всех подкатегорий
if($k == 5) {
print "<a href="index.php?cid=".$qcrow["id"]."">...</a>";
break;
}
print "<a href="index.php?sid=".$qsrow["id"]."">".$qsrow["name"].
      "</a>\n";
$k++;
}
print "</td>\n";
// если это последняя подкатегория и их общее кол-во нечетное выводим
// пустой эл-т таблицы
if($i+1 == $cats) { if($cats%2 != 0) { print "<td> </td>\n"; } }
// если нечетная, выводим конец строки
if($i%2 != 0) { print "</tr>\n"; }
$i++;
}
print "</table>\n";
print "</div>\n";
} elseif(isset($cid)) {
// Выводим список всех подкатегорий для указанной категории $cid
// получаем общее кол-во подкатегорий для $cid, эта ф-я находится в
// файле config.php
$cats = tablecount($t_subcategory, " where cid=$cid");
// запрос на выборку категории из таблицы (чтобы получить ее имя)
$qn = mysql_query("select * from $t_category where id='$cid' order by name");
// получаем первую категорию (всего одна :))
$qnrow = mysql_fetch_array($qn);
// выбираем _все_ подкатегории для $cid
$qs = mysql_query("select * from $t_subcategory where cid='$cid' order by name");
$i = 0;
print "<div align=center>\n";
print "<b><a href="index.php">Главная </a> > ".
       $qnrow["name"]."</b><br><br>\n";
print "<table width=600 cellspacing=2 cellpadding=2 border=0>\n";
// обходим все подкатегории и выводим их в браузер (принцип такой же как
// и для категорий)
while($qsrow = mysql_fetch_array($qs)) {
if($i%2 == 0) { print "<tr>\n"; }
print "<td width=50%>\n";
print "<a href="index.php?sid=".$qsrow["id"]."">".$qsrow["name"].
      "</a>\n";
print "</td>\n";
if($i+1 == $cats) { if($cats%2 != 0) { print "<td> </td>\n"; } }
if($i%2 != 0) { print "</tr>\n"; }
$i++;
}
print "</table></div>\n";
} elseif(isset($sid)) {
// А здесь, собственно, уже выводим все ссылки
// берем подкатегорию $sid (для выяснения названия подкатегории)
$qs = mysql_query("select * from $t_subcategory where id='$sid' order by name");
$qsrow = mysql_fetch_array($qs);
// а здесь выясняем название категории
$qc = mysql_query("select * from $t_category where id='".$qsrow["cid"].
      "' order by name");
$qcrow = mysql_fetch_array($qc);
// Выводим местонахождение и начало таблицы
print "<div align=center>\n";
print "<b><a href="index.php">Главная </a> >
       <a href="index.php?cid=".$qcrow["id"]."">".$qcrow["name"].
      "</a> > ".$qsrow["name"]."</b><br><br>\n";
print "<table width=600 cellspacing=2 cellpadding=2 border=0>\n";
// запрос на все ссылки для данной подкатегории $sid с сортировкой по имени
// можно конечно выводит как и самый популярный
// (больше всего кликов - order by counter)
$ql = mysql_query("select * from $t_links where sid='$sid' order by name");
// если полученное кол-во ссылок 0, то сообщаем об этом
if(mysql_num_rows($ql) == 0) { print "<tr><td>Нет
ссылок</td></tr>"; }
else {
// теперь обходим все ссылки по-очереди и выводим их.
while($qlrow = mysql_fetch_array($ql)) {
print "<tr>\n";
print "<td>\n";
print "Название: <b><a target=_blank href="go.php?id=".$qlrow["id"].
      "">".>$qlrow["name"]."</a></b><br><br>\n";
print "Описание: ".$qlrow["description"]."<br><br>";
print "Кликов: ".$qlrow["counter"];
print "</td>\n";
print "</tr>\n";
}
}
print "</table>\n</div>\n";
}
include "footer.inc.php";
?>

add.php - скрипт для добавления категорий/подкатегорий (add.php?what=category) и самих ссылок (add.php?what=link).

<?
include "config.php";
include "header.inc.php";
print "<div align=center>\n";
print "<table width=600 cellspaing=2 cellpadding=2 border=0>\n";
// переменная what хранит значение category/link чтобы знать что добавлять
if(@$what == "category") { //
// если не нажата кнопка "Добавить" (Submit) выводим форму для заполнения
if(!isset($submit)) {
?>
<form method=post action="add.php?what=category">
<tr><td width=50%>Выберите категорию, в которую добавлять
    подкатегорию:<br>Или введите новую</td>
<td width=50%>
<select class=select name=category size=1 style="width: 100%;">
<option selected value=#>Выберите категорию</option>
<?  // выводим все категории
$qc = mysql_query("select * from $t_category");
while($qcrow = mysql_fetch_array($qc)) {
print "<option value=".$qcrow["id"].">".$qcrow["name"]."</option>\n";
}
?>
</select>
<input type=text name=categorystr value="" style="width: 100%">
</td></tr>
<tr><td width=50%>Введите название подкатегории</td>
<td width=50%>
<input type=text name=subcategory value="" style="width: 100%">
</td></tr>
<tr><td colspan=2><input type=submit name=submit
value="Добавить">
</td></tr>
</form>
<?
} else { // обрабатываем нажатие кнопки "Добавить"
if($categorystr != "") {
// узнаем, есть ли такая категория уже в таблице
$qcheck = mysql_query("select * from $t_category where name='$categorystr'");
if(mysql_num_rows($qcheck) == 0) { // нет
// Если введено название новой категории то добавляем ее
$qi = mysql_query("insert into $t_category values('', '$categorystr')");
$category = mysql_insert_id(); // узнаем id для новой категории
// выводим сообщение о том что добавлена.
print "<tr><td>Новая категория добавлена
      (<i>$categorystr</i>)</td><tr>\n";
} else {
// если категория уже существует, значит узнаем
// ее идентификатор и записываем в $category
$qcrow = mysql_fetch_array($qcheck);
$category = $qcrow["id"];
}
if($subcategory != "") { // добавляем подкатегорию, если ее ввели
mysql_query("insert into $t_subcategory values('', '$category',
            '$subcategory')");
print "<tr><td>Подкатегория <i>$subcategory</i>
добавлена.</td></tr>";
}
}
} elseif(@$what == "link") {
// Добавление новой ссылки
if(!isset($submit)) { // если не нажата кнопка Добавить выводим форму для ввода
?>
<form method=post action="add.php?what=link">
<tr><td width=50%>Добавлять в:</td>
<td>
<?
print "<select name=category size=1 style="width: 100%;">";
print "<option selected value="#">Выберите категорию</option>\n";
// Выводим все категории в следующем формате Кат1 -> подкат1, Кат1 ->
подкат2 ну и т.д.
$qc = mysql_query("select * from $t_category order by name");
while($qcrow = mysql_fetch_array($qc)) {
$qs = mysql_query("select * from $t_subcategory where cid = '".$qcrow["id"]."'
order by name");
while($qsrow = mysql_fetch_array($qs)) {
print "<option value=".$qsrow["id"].">".$qcrow["name"]."  >
".$qsrow["name"]."</option>\n";
}
}
print "</select>\n";
?>
</td>
</tr>
<tr>
<td>Название сайта:</td>
<td><input type=text name=name value=""
style="width: 100%"></td>
</tr>
<tr>
<td>Адрес сайта (url):</td>
<td><input type=text name=url value=""
style="width: 100%"></td>
</tr>
<tr>
<td>Описание сайта:</td>
<td><textarea name=description rows=5
style="width: 100%"></textarea></td>
</tr>
<tr>
<td colspan=2><input type=submit name=submit
value="Добавить"></td>
</tr>
<?
} else { // обрабатываем нажатие на кнопку "Добавить"
// Добавляем в таблицу новую ссылку
mysql_query("insert into $t_links values('', '$name', '$url', '$description',
            '$category', '0')");
print "<tr><td>Ссылка добавлена в каталог.
<a href="index.php?sid=$category">Перейти в подкатегорию</a>
</td></tr>\n";
}
}
print "</table>\n";
print "</div>\n";
include "footer.inc.php";
?>

go.php - скрипт для перенаправления браузера на ссылку и увеличения счетка (counter)

<?
include "config.php";
$error = 0; // устанавливаем флаг ошибки в 0
// если не указан идентификатор ссылки, след-но ошибка
if(!isset($id)) $error = 1;
else {
// выбираем ссылку из таблицы (должна быть всего одна, поэтому
// ограничиваем выборку - limit 1)
$result = mysql_query("select * from $t_links where id = '$id' limit 1");
// если не найдена ссылка с таким идентификатором, значит ошибка
if(mysql_num_rows($result) == 0) {
$error = 2;
} else {
// получаем строку из таблицы об указанной ссылке
$row = mysql_fetch_array($result);
// увеличиваем счетчик и записываем его обратно в таблицу (update)
$counter = $row["counter"];
$counter++;
$url = $row["url"];
$resultu = mysql_query("update $t_links set counter=$counter where id=$id");
// перенаправляем на нашу найденную ссылку
header("Location: $url");
}
}
// Обрабатываем ошибки и сообщаем о них.
if($error != 0) {
print "<font size=+1><b>";
switch($error) {
case 1:    print "Вы не указали идентификатор";    break;
case 2:    print "Вы указали неверный идентификатор";    break;
}
print "</font></b>";
}
?>

А в скрипте config.php идет простое подключение к БД MySQL и функция для получения общего кол-ва строк в таблице:

<?
$database["name"] = "mysql";
$database["host"] = "localhost";
$database["database"] = "links";
$database["user"] = "root";
$database["password"] = "";
$t_category = "categories";
$t_subcategory = "sub_categories";
$t_links = "links";
$db = mysql_connect($database["host"], $database["user"],
$database["password"]);
mysql_select_db($database["database"], $db);
function tablecount($name, $cond = "") {
$q = mysql_query("select count(*) as total from $name $cond");
if(mysql_num_rows($q) == 0) return 0;
$qrow = mysql_fetch_array($q);
return $qrow["total"];
}
?>

Вроде бы все, но тут можно бесконечно создавать что-нибудь новое, сделать сортировки выводимых ссылок (по названию, кол-ву кликов на них - наиболее популярные) и многое другое.

Hosted by uCoz