PHP

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

Вот, решил написать статью по созданию каталога ссылок, т.к. очень многие хотят достать такие скрипты, а большинство готовых, слишком "навороченные". За основу каталога взят всем хорошо известный 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 &apos;&apos;, 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 &apos;0&apos;, name varchar(255) NOT NULL default &apos;&apos;,
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 &apos;&apos;, url varchar(255) NOT NULL default &apos;&apos;,
description text, sid int(11) NOT NULL default &apos;0&apos;,
counter int(11) NOT NULL default &apos;0&apos;, 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=&apos;".$qcrow["id"]."&apos;
      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=&apos;$cid&apos; order by name");
// получаем первую категорию (всего одна :))
$qnrow = mysql_fetch_array($qn);
// выбираем _все_ подкатегории для $cid
$qs = mysql_query("select * from $t_subcategory where cid=&apos;$cid&apos; 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=&apos;$sid&apos; order by name");
$qsrow = mysql_fetch_array($qs);
// а здесь выясняем название категории
$qc = mysql_query("select * from $t_category where id=&apos;".$qsrow["cid"].
      "&apos; 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=&apos;$sid&apos; 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=&apos;$categorystr&apos;");
if(mysql_num_rows($qcheck) == 0) { // нет
// Если введено название новой категории то добавляем ее
$qi = mysql_query("insert into $t_category values(&apos;&apos;, &apos;$categorystr&apos;)");
$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(&apos;&apos;, &apos;$category&apos;,
            &apos;$subcategory&apos;)");
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 = &apos;".$qcrow["id"]."&apos;
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(&apos;&apos;, &apos;$name&apos;, &apos;$url&apos;, &apos;$description&apos;,
            &apos;$category&apos;, &apos;0&apos;)");
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 = &apos;$id&apos; 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"];
}
?>

Вроде бы все, но тут можно бесконечно создавать что-нибудь новое, сделать сортировки выводимых ссылок (по названию, кол-ву кликов на них - наиболее популярные) и многое другое.
Добавлено: 31 Декабря 2014 13:15:40 Добавил: Андрей Ковальчук Нравится 0
Добавить
Комментарии:
Нету комментариев для вывода...