За последние 24 часа нас посетили 22875 программистов и 1240 роботов. Сейчас ищут 744 программиста ...

Сервис коротких ссылок

Тема в разделе "Решения, алгоритмы", создана пользователем Ensiferum, 10 авг 2010.

  1. Ensiferum

    Ensiferum Активный пользователь

    С нами с:
    11 июл 2010
    Сообщения:
    1.292
    Симпатии:
    0
    Адрес:
    из секты поклонников Нео
    Решил написать сервис коротких ссылок.
    БД:
    [sql]CREATE TABLE IF NOT EXISTS `shorturl` (
    `id` int(6) NOT NULL AUTO_INCREMENT,
    `s_long_url` varchar(255) DEFAULT NULL,
    PRIMARY KEY (`id`)
    ) ENGINE=MyISAM DEFAULT CHARSET=cp1251;[/sql]

    .htaccess
    Код (Text):
    1. RewriteEngine on
    2. RewriteRule ^([a-z_A-Z_0-9]+)$ index.php?url=$1
    файл index.php
    PHP:
    1. <?
    2. //Функция для создания короткой записи:
    3. function encodeID($id) {
    4.   $chars = '23456789abcdeghkmnpqsuvxyzABCDEGHKLMNPQSUVXYZ';
    5.   $length = strlen($chars);
    6.   $hash = '';
    7.   while($id > $length - 1) {
    8.     $hash = $chars[fmod($id, $length)].$hash;
    9.     $id = floor($id/$length);
    10.   }
    11.   return $chars[$id].$hash;
    12. }
    13.  
    14. //Функция для получения id записи в базе по короткой ссылке:
    15. function decodeID($string) {
    16.   $chars = '23456789abcdeghkmnpqsuvxyzABCDEGHKLMNPQSUVXYZ';
    17.   $length = strlen($chars);
    18.   $size = strlen($string) - 1;
    19.   $array = str_split($string);
    20.   $id = strpos($chars, array_pop($array));
    21.   foreach($array as $i => $char){
    22.     $id += strpos($chars, $char) * pow($length, $size - $i);
    23.   }
    24.   return $id;
    25. }
    26.  
    27. if (isset($_POST['long_url']) || !empty($_POST['long_url'])) {
    28.     mysql_select_db('shorturl',mysql_connect('localhost','root',''));
    29.    
    30.     $long_url   = mysql_real_escape_string($_POST['long_url']);
    31.    
    32.     mysql_query('INSERT INTO shorturl VALUES("","'.$long_url.'")');
    33.     $id = mysql_insert_id();
    34.     mysql_close();
    35.    
    36.     $short_url = encodeID($id);
    37.     echo 'Ваша ссылка: [url=http://'.$_SERVER]http://'.$_SERVER[/url]['SERVER_NAME'].'/'.$short_url;
    38. }
    39.  
    40. elseif (isset($_GET['url']) || !empty($_GET['url'])) {
    41.     mysql_select_db('shorturl',mysql_connect('localhost','root',''));
    42.    
    43.     $id         = decodeID($_GET['url']);
    44.     $res        = mysql_query('SELECT s_long_url FROM shorturl WHERE id="'.$id.'"');
    45.     $long_url  = mysql_result($res,0);
    46.    
    47.     mysql_close();
    48.     header('location: '.$long_url);
    49.    
    50. }
    51.  
    52. echo '<form action="?" method="post">Ваш URL: <input type="text" name="long_url" value="http://"/> <input type="submit" value="Создать ссылку"/></form>';
    53. ?>
    Жду комментариев. Что улучшить, что подправить, или вообще удалить и не стоит марать php.ru такой писаниной
     
  2. MiksIr

    MiksIr Активный пользователь

    С нами с:
    29 ноя 2006
    Сообщения:
    2.340
    Симпатии:
    44
  3. MiksIr

    MiksIr Активный пользователь

    С нами с:
    29 ноя 2006
    Сообщения:
    2.340
    Симпатии:
    44
    И... Конечно, ИМХО, но такие сервисы неплохо бы делать устойчивыми от "перебора" всех хранимых в базе ссылок. Этот вариант такой устойчивости не имеет.
     
  4. Ensiferum

    Ensiferum Активный пользователь

    С нами с:
    11 июл 2010
    Сообщения:
    1.292
    Симпатии:
    0
    Адрес:
    из секты поклонников Нео
    А поподробнее?
     
  5. MiksIr

    MiksIr Активный пользователь

    С нами с:
    29 ноя 2006
    Сообщения:
    2.340
    Симпатии:
    44
    Куда уж подробнее. Не давать возможности простым перебором чисел в запросе получить всю базу. Кому нужна она или нет - это уже второй вопрос, может для кого не критично, по-этому я и поставил ИМХО.