<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Записки программиста &#187; tinyurl.com</title>
	<atom:link href="http://anton.bukarev.org/tag/tinyurlcom/feed/" rel="self" type="application/rss+xml" />
	<link>http://anton.bukarev.org</link>
	<description>Web-программирование и не только</description>
	<lastBuildDate>Thu, 05 Nov 2009 08:50:10 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Создаем сервис коротких ссылок</title>
		<link>http://anton.bukarev.org/web/php/sozdaem-servis-korotkix-ssylok/</link>
		<comments>http://anton.bukarev.org/web/php/sozdaem-servis-korotkix-ssylok/#comments</comments>
		<pubDate>Sat, 23 May 2009 18:50:06 +0000</pubDate>
		<dc:creator>Антон</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[tinyurl.com]]></category>

		<guid isPermaLink="false">http://anton.bukarev.org/?p=269</guid>
		<description><![CDATA[Вероятно Вы уже знакомы с сервисом коротких ссылок tinyurl.com. Давайте создадим свой собственный сервис коротких ссылок.

Как работает сервис коротких ссылок
Например Вы залили файл на narod.ru/disk и получили ссылку вида http://narod.ru/disk/9036797010/somefile.html. Запомнить ее будет затруднительно, а записывать долго для этого и существуют сервисы коротких ссылок. Вы заходите на tinyurl.com,  копируете в специальную форму ссылку и [...]]]></description>
			<content:encoded><![CDATA[<p>Вероятно Вы уже знакомы с сервисом коротких ссылок tinyurl.com. Давайте создадим свой собственный сервис коротких ссылок.</p>
<p><span id="more-269"></span></p>
<h2>Как работает сервис коротких ссылок</h2>
<p>Например Вы залили файл на narod.ru/disk и получили ссылку вида http://narod.ru/disk/9036797010/somefile.html. Запомнить ее будет затруднительно, а записывать долго для этого и существуют сервисы коротких ссылок. Вы заходите на tinyurl.com,  копируете в специальную форму ссылку и получаете короткую ссылку вида http://tinyurl.com/8fp ее и запомнить, и записать намного быстрее.</p>
<h2>Приступим</h2>
<p>Для этого нам понадобится:</p>
<ul>
<li>PHP</li>
<li>MySQL</li>
<li>mod_rewrite</li>
</ul>
<p>
Для начала создадим новую базу данных, назвав ее url (для этого можете воспользоваться phpmyadmin). Теперь приступим к созданию таблицы. Назовем ее short_urls.</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><span class="kw1">CREATE TABLE</span> `short_urls` <span class="br0">&#40;</span></div>
</li>
<li class="li1">
<div class="de1">`id` <span class="kw2">INT</span><span class="br0">&#40;</span> <span class="nu0">11</span> <span class="br0">&#41;</span> <span class="kw3">NOT NULL</span> <span class="kw3">AUTO_INCREMENT</span> <span class="kw1">PRIMARY KEY</span> ,</div>
</li>
<li class="li1">
<div class="de1">`short` <span class="kw2">VARCHAR</span><span class="br0">&#40;</span> <span class="nu0">6</span> <span class="br0">&#41;</span> <span class="kw3">NOT NULL</span> ,</div>
</li>
<li class="li1">
<div class="de1">`url` <span class="kw2">VARCHAR</span><span class="br0">&#40;</span> <span class="nu0">1000</span> <span class="br0">&#41;</span> <span class="kw3">NOT NULL</span> ,</div>
</li>
<li class="li2">
<div class="de2">`stamped` <span class="kw2">DATETIME</span> <span class="kw3">NOT NULL</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#41;</span> ENGINE = MYISAM ;</div>
</li>
</ol>
</div>
<p>Первый столбец будет идентификатором. В столбце short будет храниться короткая часть ссылки (будет генерироваться ссылка вида http://yoursite.ru/xxxxxx, где xxxxxx короткая часть ссылки, xxxxxx будет состоять из цифр и букв это даст нам 2176782336 комбинаций). В столбце url будет храниться «укорачиваемая» ссылка. Последний столбец будет содержать в себе даты добавления ссылок.</p>
<p>Теперь создадим html шаблон сервиса. Создайте файл index.php и скопируйте в него следующий код</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">&lt;form id=&quot;shorten_form&quot; name=&quot;shorten_form&quot; method=&quot;post&quot; action=&quot;shorten.php&quot;&gt;
</div>
</li>
<li class="li1">
<div class="de1">&lt;label&gt;
</div>
</li>
<li class="li1">
<div class="de1">&lt;div align=&quot;center&quot;&gt;
</div>
</li>
<li class="li1">
<div class="de1">&lt;input type=&quot;text&quot; name=&quot;url&quot; id=&quot;url&quot; /&gt;
</div>
</li>
<li class="li2">
<div class="de2">&lt;/div&gt;
</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&lt;/label&gt;
</div>
</li>
<li class="li1">
<div class="de1">&lt;label&gt;
</div>
</li>
<li class="li1">
<div class="de1">&lt;div align=&quot;center&quot;&gt;
</div>
</li>
<li class="li2">
<div class="de2">&lt;input type=&quot;submit&quot; name=&quot;submit&quot; id=&quot;submit&quot; value=&quot;укоротить&quot; /&gt;
</div>
</li>
<li class="li1">
<div class="de1">&lt;/div&gt;
</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&lt;/label&gt;
</div>
</li>
<li class="li1">
<div class="de1">&lt;/form&gt;
</div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
</ol>
</div>
<p>Пришло время для php. Создайе файл shuffle.php и вставте в него следующий код</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><span class="co1">//функция для установки соединения с базой данных</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">function</span> dbconnect<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="co1">//HOST &#8211; адрес сервера баз данных (обычно localhost)</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="co1">//USERNAME &#8211; имя пользователя</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; <span class="co1">//PASSWORD &#8211; пароль</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="re0">$link</span> = <a href="http://www.php.net/mysql_connect"><span class="kw3">mysql_connect</span></a><span class="br0">&#40;</span><span class="st0">&#8216;HOST&#8217;</span>, <span class="st0">&#8216;USERNAME&#8217;</span>, <span class="st0">&#8216;PASSWORD&#8217;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="co1">//DB &#8211; имя базы данных (у меня url)</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="re0">$db_selected</span> = <a href="http://www.php.net/mysql_select_db"><span class="kw3">mysql_select_db</span></a><span class="br0">&#40;</span><span class="st0">&#8216;DB&#8217;</span>, <span class="re0">$link</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">//Функция для генерирования уникальной ссылки длинны $numAlpha</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">function</span> generateurl<span class="br0">&#40;</span><span class="re0">$numAlpha</span>=<span class="nu0">6</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;dbconnect<span class="br0">&#40;</span><span class="br0">&#41;</span>; <span class="co1">//соединяемся с базой данных</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp;<span class="re0">$listAlpha</span> = <span class="st0">&#8216;abcdefghijklmnopqrstuvwxyz0123456789&#8242;</span>; <span class="co1">//символы из которых генерируется индентификатор</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="kw1">return</span> <a href="http://www.php.net/str_shuffle"><span class="kw3">str_shuffle</span></a><span class="br0">&#40;</span><a href="http://www.php.net/substr"><span class="kw3">substr</span></a><span class="br0">&#40;</span><a href="http://www.php.net/str_shuffle"><span class="kw3">str_shuffle</span></a><span class="br0">&#40;</span><span class="re0">$listAlpha</span><span class="br0">&#41;</span>,<span class="nu0">0</span>,<span class="re0">$numAlpha</span><span class="br0">&#41;</span><span class="br0">&#41;</span>; <span class="co1">//генерируем индентификатор и возвращаем</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">//функция для «укорачивания» ссылок</span></div>
</li>
<li class="li2">
<div class="de2"><span class="kw2">function</span> geturl<span class="br0">&#40;</span><span class="re0">$in</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;dbconnect<span class="br0">&#40;</span><span class="br0">&#41;</span>; <span class="co1">//соединяемся с базой</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="co1">//генерируем индентификатор и проверяем его уникальность</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp;<span class="kw1">do</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp;<span class="re0">$out</span> = generateurl<span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp;<span class="re0">$query</span> = <span class="st0">&quot;SELECT short &nbsp;FROM `short_urls` WHERE `short` = &#8216;$out&#8217;&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="re0">$result</span> = <a href="http://www.php.net/mysql_query"><span class="kw3">mysql_query</span></a><span class="br0">&#40;</span><span class="re0">$query</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="br0">&#125;</span> <span class="kw1">while</span> <span class="br0">&#40;</span><a href="http://www.php.net/mysql_num_rows"><span class="kw3">mysql_num_rows</span></a> &gt; <span class="nu0">0</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">//добавляем данные в базу данных</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="re0">$insert_query</span> = <span class="st0">&quot;INSERT INTO `short_urls` (`id`, `short`, `url`, `stamped`) VALUES (NULL, &#8216;$out&#8217;, &#8216;$in&#8217;, NOW());&quot;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="re0">$result</span> = <a href="http://www.php.net/mysql_query"><span class="kw3">mysql_query</span></a><span class="br0">&#40;</span><span class="re0">$insert_query</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp;<span class="kw1">return</span> <span class="st0">&quot;http://yoursite.ru/&quot;</span>.<span class="re0">$out</span>; <span class="co1">//генерируем и возвращаем короткую ссылку</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>Последняя функция проверяет присутствует ли сгенерированый индентификатор в таблице, если присутствует, то генерируется новый, пока не сгенерируется уникальный индентификатор, затем генерируется ссылка.</p>
<p>Теперь соберем все вместе. Создайте файл forward.php и вставте в него следующий код</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><span class="kw1">include</span> <span class="st0">&#8217;shuffle.php&#8217;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$i</span> = <span class="re0">$_SERVER</span><span class="br0">&#91;</span><span class="st0">&#8216;QUERY_STRING&#8217;</span><span class="br0">&#93;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="co1">//проверяем формат индентификатора</span></div>
</li>
<li class="li2">
<div class="de2"><span class="kw1">if</span> <span class="br0">&#40;</span><a href="http://www.php.net/preg_match"><span class="kw3">preg_match</span></a><span class="br0">&#40;</span><span class="st0">&quot;/^[0-9a-z]{6}$/&quot;</span>, <span class="re0">$i</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; dbconnect<span class="br0">&#40;</span><span class="br0">&#41;</span>; <span class="co1">//соединяемся с базой</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="re0">$result</span> = <a href="http://www.php.net/mysql_query"><span class="kw3">mysql_query</span></a><span class="br0">&#40;</span><span class="st0">&quot;SELECT short, url FROM `short_urls` WHERE `short` = &#8216;$i&#8217;&quot;</span><span class="br0">&#41;</span> or <a href="http://www.php.net/die"><span class="kw3">die</span></a><span class="br0">&#40;</span><a href="http://www.php.net/mysql_error"><span class="kw3">mysql_error</span></a><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="co1">//проверка на наличие индентификатора в базе данных</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><a href="http://www.php.net/mysql_num_rows"><span class="kw3">mysql_num_rows</span></a><span class="br0">&#40;</span><span class="re0">$result</span><span class="br0">&#41;</span> &lt; <span class="nu0">1</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <a href="http://www.php.net/header"><span class="kw3">header</span></a><span class="br0">&#40;</span><span class="st0">&quot;Location: http://yoursite.ru&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <a href="http://www.php.net/exit"><span class="kw3">exit</span></a>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span><span class="kw1">else</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$row</span> = <a href="http://www.php.net/mysql_fetch_row"><span class="kw3">mysql_fetch_row</span></a><span class="br0">&#40;</span><span class="re0">$result</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <a href="http://www.php.net/header"><span class="kw3">header</span></a><span class="br0">&#40;</span><span class="st0">&quot;Location: &quot;</span>.<span class="re0">$row</span><span class="br0">&#91;</span><span class="nu0">1</span><span class="br0">&#93;</span><span class="br0">&#41;</span>; <span class="co1">//переадресация по хранимому адресу</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">else</span></div>
</li>
<li class="li2">
<div class="de2"><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<a href="http://www.php.net/header"><span class="kw3">header</span></a><span class="br0">&#40;</span><span class="st0">&quot;Location: http://yoursite.ru&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>В файл .htaccess вставте</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1">XBitHack &nbsp; &nbsp; &nbsp;Off</div>
</li>
<li class="li1">
<div class="de1">RewriteEngine On</div>
</li>
<li class="li1">
<div class="de1">RewriteCond &nbsp; %{REQUEST_URI} \/([0-9a-z]{4})$ [NC]</div>
</li>
<li class="li1">
<div class="de1">RewriteRule &nbsp; ^(.*) http://www.yoursite.ru/forward.php?%1 [L]</div>
</li>
</ol>
</div>
<p>Теперь создайте файл shorten.php и вставте в него следующий код.</p>
<div class="dean_ch" style="white-space: wrap;">
<ol>
<li class="li1">
<div class="de1"><span class="kw2">&lt;?php</span> <span class="kw1">include</span> `<a href="http://www.php.net/shuffle"><span class="kw3">shuffle</span></a>.php`; <span class="kw2">?&gt;</span></div>
</li>
<li class="li1">
<div class="de1">&lt;p align=<span class="st0">&quot;center&quot;</span>&gt;Ваша ссылка:</div>
</li>
<li class="li1">
<div class="de1">&lt;p align=<span class="st0">&quot;center&quot;</span>&gt;&lt;?php <a href="http://www.php.net/echo"><span class="kw3">echo</span></a> <span class="re0">$_POST</span><span class="br0">&#91;</span><span class="st0">&#8216;url&#8217;</span><span class="br0">&#93;</span>; <span class="kw2">?&gt;</span></div>
</li>
<li class="li1">
<div class="de1">&lt;p align=<span class="st0">&quot;center&quot;</span>&gt;Была уменьшена до:</div>
</li>
<li class="li2">
<div class="de2">&lt;p align=<span class="st0">&quot;center&quot;</span>&gt;&lt;?php <a href="http://www.php.net/echo"><span class="kw3">echo</span></a> geturl<span class="br0">&#40;</span><span class="re0">$_POST</span><span class="br0">&#91;</span><span class="st0">&#8216;url&#8217;</span><span class="br0">&#93;</span><span class="br0">&#41;</span>; <span class="kw2">?&gt;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
</ol>
</div>
<p>shorten.php будет отображать короткую ссылку</p>
<p>Сервис коротких ссылок готов. Как Вы уже заметили в этом нет ничего сложного. Если возникли трудности, задавайте свои вопросы в комментариях</p>
<p><br class="spacer_" /></p>
 <img src="http://anton.bukarev.org/wp-content/plugins/feed-statistics.php?view=1&post_id=269" width="1" height="1" style="display: none;" />]]></content:encoded>
			<wfw:commentRss>http://anton.bukarev.org/web/php/sozdaem-servis-korotkix-ssylok/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
