-
Урок 19. Каталог сайтов. Система обмена ссылками
Февраль 7th, 2009 24 Комментариев
Материал этого урока ознакомит начинающих php программистов с системой для обмена ссылками. Сама по себе статья позволит узнать некоторые тонкости довольно полезных функций в php.
Написать этот урок меня побудила одна интересная вещь – обмен ссылками. Сейчас много блогеров, СЕОшников, да и просто админов сайтов, которые стараются найти в сети своих друзей, единомышленников или же партнеров, с целью привлечения дополнительных посетителей на свой сайт. Для этого использую всевозможные методы.
Самый бестолковый способ – это спам. Причем спам оседает в комментариях, гостевых, форумах и др. местах. Этот способ действительно хорош, если не существует фильтра, а иначе большинство спама просто отсеивается и ваш “труд” пойдет козе под хвост.
Второй способ это регистрация на биржах линкообмена. Приведу простой пример – система купли-продажи ссылок САПЕ. При помощи нее действительно можно получить хорошие результаты, но смысл у этой системы в другом. На ней не учитывается переходы по вашей ссылке, т.к. ссылка обычно стоит где то в самом низу и заметна только поисковикам). Ну и третий способ – это самостоятельно, ручками связываться с админами блогов, сайтов, форумов и тд, для того чтобы обменяться ссылками. Чтобы разгрузить людей от столь рутинной работы мы прибегнем к сегодняшнему уроку. Его темой станет создание автоматизированного микро-каталога, в который любой желающий сможет добавить свою ссылку в автоматическом режиме.Детали
Итак, вот список того что нам сегодня придется освоить:
- Обработка заполняемых данных, включающая анти-спам систему;
- Работа с базой данных MySQL;
- Проверка ссылки на “вшивость” функциями PHP;
- Вложенные циклы для вывода информации;
- Работа с массивами;
Подготовка к работе
Традиционно перед написанием каких либо строк кода, мы создаем таблицу в базе данных,
которая будет хранить все ссылки. Наша таблица будет называться tlinks и содержать следующие поля:id (INT) auto_increment – первое поле, это идентификатор ссылки, данные числовые,
cid (INT) - поле для привязки ссылки к категории
link_url(VARCHAR) – поле для хранения адреса
link_anchor (VARCHAR) - анкор нашей ссылки
link_title(VARCHAR) - описание после ссылкиВторая таблица необходима для хранения данных о категориях:
id (INT) – идентификатор каталога
name (VARCHAR) – название каталога.Далее, чтобы не забивать каждое поле вручную воспользуйтесь sql-запросом:
Для таблицы tlinks
CREATE TABLE tlinks(
id INT( 10 ) NOT NULL AUTO_INCREMENT ,
cid INT( 10 ) NOT NULL ,
link_url VARCHAR( 100 ) NOT NULL ,
link_anchor VARCHAR( 200 ) NOT NULL ,
link_title VARCHAR( 200 ) NOT NULL ,
PRIMARY KEY ( id )
) ENGINE = MYISAM CHARACTER SET utf8 COLLATE utf8_general_ciДля таблицы tcat:
CREATE TABLE tcat(
id INT( 10 ) NOT NULL AUTO_INCREMENT ,
name VARCHAR( 100 ) NOT NULL ,
PRIMARY KEY ( id )
) ENGINE = MYISAM CHARACTER SET utf8 COLLATE utf8_general_ciАдминистративная часть
Если честно, то я и не хотел этот скрипт оборудовать панелью управления, но так как нам необходимо создавать категории, в которых будут храниться ссылки я решил все таки потратить время и написать небольшой скрипт.
Во первых, снабдим наш скрипт возможностью просматривать главную страницу панели управления со всеми категориями и ссылками внутри категории.
Для этого создаем статичные (неизменные элементы) в шапке странице, а ниже при помощи SQL-запроса выводим существующие категории.admin.php
[cc lang="php" ]
//Подключаем файл конфигурации
require("config.inc.php");//Необходимо подключиться к БД
$link = mysql_connect($DBSERVER, $DBUSER, $DBPASS) or die("Не могу подключиться" );
// сделать $DB текущей базой данных
mysql_select_db($DB, $link) or die ('Не могу выбрать БД');echo 'панель управления добавить категорию‘;
//Как и говорил – создаем запрос
$q1 = mysql_query(“SELECT * FROM tcat”);
//Проверяем результат
if(mysql_num_rows($q1)>0) {
//Перебираем значения
echo ‘- ‘;
- ‘.$r['name'].’
while($r = mysql_fetch_array($q1)){
//Выводим в браузер
echo ‘‘;
}echo ‘
‘;
}else { echo ‘
У Вас нет созданных категорий
‘;}
[/cc]else { echo ‘<h2>У Вас нет созданных категорий</h2>’;}
Первая часть содержит совсем мало кода. Ничего особенного здесь нет. Присутствует достаточно простой запрос в таблицу tcat, возвращающий все элементы из таблицы. После чего проверяем сколько рядов вернул запрос ( при помощи функции mysql_num_rows() ), если больше нуля, то организовываем перебор массива и вывод активных ссылок с именами категорий.
А вот и транскрипция запроса:
$q1 = mysql_query(“SELECT * FROM tcat”);
$q1 = mysql_query(“ВЫБРАТЬ *(все) ИЗ tcat”);
Если же наш запрос ничего не возвращает, т.е. 0 рядов – выводим соответствующее сообщение .
Естественно, при первой загрузке страницы админки список категорий будет пуст. Поэтому, наделяем панель управления дополнительной функцией – создание категории.
Как видно из первого фрагмента (см.выше), чтобы создать категорию мы передаем по ссылке значение, а точнее присваиваем переменной $_GET['a'] значение add (?a=add) . Чтобы отловить это значение – создаем условие, проверяющее переменную $_GET['a'].
Прежде чем создать категорию нам необходимо ввести ее название. Для того чтобы обработать логику действий придется создать вложенное условие, которое будет проверять была ли нажата кнопка . Обратите внимание, у тега form, атрибут action установлен на “функцию” создания, т.е. опять же ?a=add.
[cc lang="php" first_line="28"]
if($_GET['a'] ==’add’) {
if($_POST['do'] ==” AND $_POST['category']==”) {echo ‘
Введите название категории:
‘;
echo ‘
‘;
} else {
//Запрос на добавление категории
$q2 = mysql_query(“INSERT INTO tcat VALUES(NULL,’”.$_POST['category'].”‘)”);
//Проверяем результат
if(mysql_affected_rows()==1) {
echo ‘
Категория успешно создана
‘;
} else {echo ‘
Ошибка при создании
‘;}
}
}
[/cc]После нажатия кнопки , создаем sql-запрос $q2, для вставки значения в таблицу tcat .
Транскрипция запроса $q2:
$q2 = mysql_query(“INSERT INTO tcat VALUES(NULL,’”.$_POST['category'].”‘)”);
$q2 = mysql_query(“ВСТАВИТЬ В tcat ЗНАЧЕНИЯ(NULL,’”.$_POST['category'].”‘)”);
Далее используем условие, проверяющее количество затронутых рядов. Это можно реализовать при помощи функции mysql_affected_rows(). Если будет возвращена единица, то выводим сообщение об успешно созданной категории, иначе – ошибку .
Теперь позаботимся о том как нам просматривать категорию. В самом первом фрагменте, название категории является ссылкой. Сама ссылка несет в себе указание на действие и идентификатор категории (<a href=”admin.php?view=’.$r['id'].’”>’.$r['name'].’</a>). Чтобы отобразить содержимое категории мы создаем условие, при помощи которого будем проверять переменную $_GET['view'].
Если она содержит в себе какое либо значение, то мы незамедлительно передадим работу блоку для отображения ссылок.
[cc lang="php" first_line="47"]
if(isset($_GET['view']) AND $_GET['view'] !=”) {
//Запрос в таблицу с сылками
$q3 = mysql_query(“SELECT * FROM tlinks WHERE link_cat=’”.$_GET['view'].”‘ “);
//Проверяем результат
if(mysql_affected_rows()>0) {
//Перебираем массив
while ($r = mysql_fetch_array($q3)) {echo ‘‘.$r['link_anchor'].’‘.$r['link_title'].’
‘;
}} else { echo ‘
В данной категории нет ссылок.
‘;}
}?>
[/cc]Вот в принципе и все, небольшая панель управления готова. Ниже я приведу пару скринов с внешним видом.
Вот так выглядит меню добавления категории:

Так будет выглядеть меню просмотра категории:

При помощи панели управления можно просматривать список категорий и сайтов внутри них.
Клиентская часть.
Клиентская часть начинается дизайна. Для этого я создал несколько html-блоков, которые будут “общаться” с пользователем. Но для начала хочу объяснить как будет работать скрипт по отображение и добавлению новых ссылок:
- Категории и ссылки будут располагаться внутри одного блока, который можно будет внедрять в любую часть страницы;
- Необходимо добавить кнопку “добавить сайт”, которая ведет на форму подачи заявки на добавление;
Теперь посмотрим как это будет выглядеть.

Отображение блока ссылок.
Весь процесс по отображению категорий и ссылок берет на себя файл blogroll.php.
blogroll.php
Основой этого скрипта являются 2 запроса, которые вытаскивают из базы необходимую информацию. По традиции в начале скрипта подгружаем необходимые конфиги и совершаем подключения к базе:
[cc lang="php"]
//Подключаем файл конфигурации
require("config.inc.php");//Необходимо подключиться к БД
$link = mysql_connect($DBSERVER, $DBUSER, $DBPASS) or die("Не могу подключиться" );
// сделать $DB текущей базой данных
mysql_select_db($DB, $link) or die ('Не могу выбрать БД');
[/cc]По необходимости выполняем запрос mysql_query(“SET NAMES cp1251″); позволяющий установить вывод информации из бд в нужной нам кодировке. Кстати, в head кодировка должна быть такая же.
Чтобы визуально получить структуру каталога необходимо получить список категорий и вывести их в браузер. Для этого используем очень простой запрос в таблицу с категориями:
[cc lang="php" first_line="9"]
//Получаем категории
$q1 = mysql_query(“SELECT id,name FROM tcat”);
[/cc]Транскрипция запроса:
$q1 = mysql_query(“ВЫБРАТЬ id,name ИЗ tcat”);
Легко понять что мы вытаскиваем название категории и идентификатор. После этого мы должны запустить цикл, который будет работать столько раз, сколько категорий у нас имеется в таблице tcat:
//Запускаем цикл на количество категории
while($k = mysql_fetch_array($q1)){
/* Внутри цикла выводим название категорий и ссылки*/}
Само собой мы не просто так запускали этот цикл. Необходим он для отображения названия категорий:
[cc lang="php" first_line="11"]
//Запускаем цикл на количество категории
while($k = mysql_fetch_array($q1)){
//Выводим название категории
echo ‘‘.$k['name'].’
‘;
[/cc]Как же работает эта команда? Да все очень просто. При помощи цикла while() пробегаемся по всем рядам таблицы и выводим необходимые данные.
Для тех то совсем в “танке” привожу небольшой пример.На изображении один ряд подсвечен зеленым:

Ну допустим мы получили список категорий, которые в свою очередь содержат ссылки на ресурсы. Чтобы вывести список ссылок для соответствующей категории придется вставить второй SQL-запрос внутри цикла. Честно говоря не очень хорошая идея, так как не рекомендуется использовать запросы внутри цикла, но в нашем случае не будет много категорий, поэтому можно этим пожертвовать и создать второй запрос:
$q2 = mysql_query(“SELECT * FROM tlinks WHERE cid=”.$k['id'].”");
Транскрипция запроса:
mysql_query(“ВЫБРАТЬ * ИЗ tlinks ГДЕ cid=”.$k['id'].”");Данный запрос вытаскивает только те ссылки, которые удовлетворяют условию. Реализуется это при помощи условия WHERE (ГДЕ) в запросе $q2. Как это происходит?
На самом деле все просто, у нас получился вложенный цикл (while), который должен выводить список ссылок в категории. Предположим у нас существует 3 категории, следовательно родительский цикл (while) сработает три раза. Каждый раз он выводит соответствующее название категории, а далее происходит запрос $q2. В нем мы вытаскиваем именно те ссылки, которые соответствуют идентификатору, т.е. $k['id']. (Напоминаю, у каждой ссылки в базе помечается идентификатор категории)
[cc lang="php" first_line="15"]
//Используем второй запрос для получения ссылок категории
$q2 = mysql_query(“SELECT * FROM tlinks WHERE cid=”.$k['id'].”");//Проверяем наличие ссылок
if(mysql_num_rows($q2)>0) {
//Перебираем полученный результат
while($r=mysql_fetch_array($q2)){
//Выводим данные в браузер
echo ‘ ‘.$r['link_anchor'].’
‘;
}
} else {
//Если нет ссылок
echo ‘Пусто
‘;
}
}echo ‘
добавить сайт‘;
?>
[/cc]Данный фрагмент выполняет перебор массива с предварительной проверкой, и выводит ссылки в браузер. В итоге мы увидим следующее:

На дизайнера не претендую, слепил как говориться из того что было. Далее будет вполне рабочий вариант. Но сейчас мы должны перейти к важной части – добавление ссылки и ее проверка.
Механизм добавления ссылки.
Прежде всего нам необходимо вывести пользователю форму для заполнения. Также должен присутствовать сопроводительный текст с какими либо требованиями. В нашем случае главным требованием является “честный” обмен, т.е. перед добавлением ссылки, человеку необходимо разместить вашу ссылку на своем сайте, и в специальном поле формы указать адрес страницы, на которой эта ссылка размещается. Чтобы каждого не проверять вручную, мы дополним механизм добавления функцией для проверки нахождения ссылки на странице.
Визуально блок добавления будет выглядеть так:

Давайте рассмотрим сам скрипт.
add.php
В начале файла подключаем файл конфигурации и файл с функциями, а также инициализируем сессию:
[cc lang="php"]
session_start();
//Подключаем файл конфигурации
require("config.inc.php");
//Подключаем файл функций
require("functions.inc.php");//Необходимо подключиться к БД
$link = mysql_connect($DBSERVER, $DBUSER, $DBPASS) or die("Не могу подключиться" );
// сделать $DB текущей базой данных
mysql_select_db($DB, $link) or die ('Не могу выбрать БД');
[/cc]Далее следует условие, которое проверяет переменную $_POST['do'] . Если она отсутствует то происходит отображение формы для заполнения:
[cc lang="php" first_line="13"]
if($_POST['do'] ==”) {
//Генерируем защитный код
$_SESSION['antispam'] = md5(rand(0,500));//Получаем данные
$q1 = mysql_query(“SELECT id,name FROM tcat”);
echo ‘
Добавить сайт
‘;
echo ‘
‘;
}
[/cc]В самом начале генерируем случайное число и хэшируем его. Далее присваиваем это значение $_SESSION['antispam']. Это пригодиться от случайных добавлений ссылок.
Далее следует запрос, который возвращает название категорий и их идентификаторы. Это пригодиться для того чтобы организовать выпадающий список.
//Получаем данные
$q1 = mysql_query(“SELECT id,name FROM tcat”);Транскрипция запроса:
$q1 = mysql_query(“SELECT id,name FROM tcat”);
$q1 = mysql_query(“ВЫБРАТЬ id,name ИЗ tcat”);
Перед кнопкой обязательно добавляем скрытое поле, в котором будет храниться то самое с генерированное значение ($_SESSION['antispam']).
Другие пункты я не вижу смысла описывать, так как это обычные элементы html. Оборудовать данный скрипт капчей нет смысла. Почему? Смотрим далее.
Рассмотрим блок, который обрабатывает события добавления:
[cc lang="php" first_line="51"]
else {//Проверяем сессию и число из хидден поля
if($_POST['AS'] == $_SESSION['antispam']) {
//Проверяем url
if(isset($_POST['url']) AND $_POST['url']!=” AND get_name($_POST['url']) == get_name($_POST['check'])){
//Проверяем выбрана ли категория
if(isset($_POST['cat']) AND $_POST['cat']!=0 ) {
//Проверяем существует ли страница
if(check_url($_POST['check'])==1){
//Проверяем установлена ли сcылка
if(scan_page($_POST['check'],$mylink)==1) {
//Если не задан анкор
if($_POST['anchor']==”){$anchor = str_replace(“http://”,”",$_POST['url']);}
else {$anchor = addslashes($_POST['anchor']);}
//Фильтруем кавычки и тэги
$url = addslashes(strip_tags($_POST['url']));
$title= addslashes(strip_tags($_POST['title']));
$cat = addslashes(strip_tags($_POST['cat']));
//Составляем запрос для добавления
$q1 = mysql_query(“INSERT INTO tlinks VALUES(NULL,”.$cat.”,’”.$url.”‘,’”.$anchor.”‘,’”.$title.”‘) “);//Проверяем запрос
if(mysql_affected_rows()==1) {
echo ‘Ваша ссылка успешно добавлена. Спасибо за сотрудничество.’;} else { echo ‘Ошибка добавления’;}
//Удаляем сессию после записи
unset($_SESSION['antispam']);
} else { echo ‘На странице не установлена ссылка’; }} else { echo ‘Страница на которой установлена ссылка недоступна’; }
} else { echo ‘Вы не выбрали категорию’; }
} else { echo ‘Вы ввели не корректный URL’; }
} else { echo ‘Ваша ссылка уже добавлена’;}
}
?>
[/cc]Возможно нет смысла обьяснять как это работает. Это довольно простые вложенные условия. На первом шаге мы проверяем нашу сессию и проверочный код.
На втором этапе проверяется на валидность адрес. Здесь мы обращаемся к функции get_name() . Смысл прост, хост обратной страницы и хост сайта, добавляемого в каталог должны совпадать.
На третьем этапе проверяем переменную, в которой содержиться идентификатор категории., т.е. пользователь обязательно должен задать категорию из выпадающего списка.
После проверяем отклик от страницы, где располагается наша ссылка при помощи функции check_url().
На пятом шаге сканируем страницу и ищем на ней нашу ссылку используя функцию scan_page(). На сканирование всей страницы уходит некоторое время. Далее необходимо проверить был ли введен анкор у ссылки, и если нет то дублируем имя домена.
После проверок прибегаем к небольшой фильтрации и экранированию лишних символов. Для записи в таблицу используем запрос $q1:
$q1 = mysql_query(“INSERT INTO tlinks VALUES(NULL,”.$cat.”,’”.$url.”‘,’”.$anchor.”‘,’”.$title.”‘) “);
Транскрипция запроса:
$q1=mysql_query(“ВСТАВИТЬ В tlinks ЗНАЧЕНИЯ (NULL,”.$cat.”,’”.$url.”‘,’”.$anchor.”‘,’”.$title.”‘)”);
После данного запроса проверяем количество затронутых рядов функцией mysql_affected_rows(). Если функция возвращает единицу – говорим пользователю об успешном добавлении в каталог, иначе выводим ошибку. Также после совершения запроса необходимо удалить сессию, содержащую проверочный код. Теперь при обновлении страницы (кнопкой F5) первое условие не пропустит дальше и не позволит создать дублирующей информации.
Функции
Первая функция, которая встречается в коде – это is_url(). У данной функции одно предназначение – проверить адрес на валидность.
[cc lang="php"]
// функция с именем is_url
function is_url($url){
// если ничего не ввели, иначе:
if($url == “”) return 0;
// если не соответствует стандарту, возвращаем ошибку.
if(!(ereg(“\.”, $url) && ereg(“http://”, $url) && ereg(“/”, str_replace(“http://” , “”, $url)))) return 0;
else return 1;
}
[/cc]В теле функции мы проверяем передаваемый параметр – переменную $url, и далее при помощи простого регулярного выражения ищем совпадения. При положительном результате возвращаем 1, иначе 0.
Вторая функция get_name() не менее важна.Ее смысл в том чтобы из передаваемого адреса получить чистый хост, те из формата http:/freshcoder.ru/archive/170 выдрать только freshcoder.ru. В теле функции тоже присутствует небольшое регулярное выражение, извлекающее только то что необходимо.
[cc lang="php" first_line="9"]
//Функция для получения имени хоста
function get_name($url){
// если ничего не ввели, иначе:
if($url == “”) return 0;
// Извлекаем имя хоста из URL
preg_match(“/^(http:\/\/)?([^\/]+)/i”,$url, $matches);
return $matches[2];}
[/cc]Третяя функция носит название check_url() . Создана для того чтобы получить “правильный” отклик от страницы (или сайта) . Как раз таки в этой функции содержится первая изюминка нашего урока. В теле функции мы используем функцию get_headers(), которая получает заголовки от страницы.
[cc lang="php" first_line="18"]
function check_url($url){
// если ничего не ввели, иначе:
if($url == “”) return 0;
//Получаем заголовки
$res = get_headers($url);
//Ищем совпадение
preg_match(“/(200)|(301)/”,$res[0], $matches);
if($matches[0] ==200 OR $matches[0]==301) return 1;}
[/cc]Если страница возвращает положительный ответ (200 и 301), функция проверяет его и дает нам зеленый свет для дальнейшего движения.
Четвертая функция тоже довольно интересная. За этой функцие закреплена задача сканирования страницы на предмет совпадения, в частности поиска “нашего” url-адреса.
[cc lang="php" first_line="28"]
function scan_page($url,$link){
// если ничего не ввели, иначе:
if($url == “”) return 0;
if($link == “”) return 0;//получаем станицу
$temp = join(”,file($url));
//Ищем ссылку на странице
preg_match_all(‘|’.$link.’|Uis’, $temp, $out);
//Верно ли совпадение
if($out[0][0] == $link) return 1;
else return 0;
}?>
[/cc]Вначале функции проверяем переданные параметры, если они не пусты – возвращаем 0. Далее читаем страницу в массив и преобразуем в строку при помощи функции join(). При помощи регулярного выражения производим поиск $link в этой строке. Если совпадение найдено возвращаем единицу, иначе 0. Вот так просто и без ручной работы функции выполняют рутинную работу.
Файл конфигурации
Файл конфигурации предназначен для хранения настроек. Здесь собраны настройки для подключения к серверу MySQL и имя базы данных, в которой хранятся таблицы tcat и tlinks. Также в конфиге указываем значение переменной $mylink – адрес вашего сайта, включая http://
[cc lang="php"]
//Данные для работы с MySQL
//Сервер, в большинстве случаев менять не требуется
$DBSERVER = "localhost";
//Пользователь и пароль
$DBUSER = "root";
$DBPASS = "";
//База данных
$DB = "test";
//Адрес вашего сайта
$mylink = 'http://freshcoder.ru';
?>
[/cc]После столь долго разъяснения функций хочу обратить ваше внимание на готовый пример. Можете посмотреть как он работает здесь.
Скачать данный пример можно тут. В комплект входит графика, библиотека jQuery , кстати спасибо ресурсу www.linkexchanger.su
В заключении хочу сказать что это урок позволит внести в ваши приложения чуточку автоматизации. Кстати применение функций, которые я сегодня описал довольно широкое.

Читайте про необычные флешки на 2usb.ru
Только хороший салон дает гарантию на услугу наращивание волос
Только у нас вы сможете быстро и дешево заказать промо сувениры оптом с доставкой.
Подпишись на RSS, впереди много интересного.24 Responses to “Урок 19. Каталог сайтов. Система обмена ссылками”
Leave a Reply




Январь 22nd, 2010 at 16:26
Запасные части для грузовиков европейского производства. Всегда в наличии большой выбор запасных частей. Сайт: http://www.truckzapchast.ru
Декабрь 23rd, 2009 at 01:06
Софт для регистрации в каталог стать и не только.
Ноябрь 2nd, 2009 at 05:34
Наш магазин предлагает всем постельное белье тет-а-тет отличного
Сентябрь 30th, 2009 at 12:27
Может не совсем в тему, но тем не менее… Слыхали, что с 1 октября вступают в силу изменения в правилах о решистрации доменных имён? Правда это только зоны ru коснётся. Якобы теперь все должны будут предоставить копии документов своему регистратору. Как считаете, это только для новых доменов, или и для старых придётся подтверждать свою личность??? И вообще, сильно я сомневаюсь, что такие меры помогут чем то улучшить рунет.
Стоило ли вообще всю эту кашу заваривать, замаются они такой поток сканов паспортов обрабатывать..