[Генератор Рендомных чисел] Сервис сокращения ссылок

Статус
В этой теме нельзя размещать новые ответы.

AsanBosam

Постоялец
Регистрация
1 Мар 2009
Сообщения
139
Реакции
11
Доброе время суток!
Я бы хотел прикрутить генератор рендомных чисел к этому скрипту

Так как по умолчанию скрипт генерирует ссылки подобного вида "http://site.ru/77/" а хотелось бы 5-6 рендомных число\буквенных значений (Для просмотра ссылки Войди или Зарегистрируйся).
Вот часть кода.
PHP:
<?php
	define('mysql_hostname', 'localhost');
	define('mysql_username', 'XXXXX');
	define('mysql_password', 'XXXXX');
	define('mysql_database', 'XXXXX');
	ob_start('relink');
	$root = "http://$_SERVER[HTTP_HOST]" . ereg_replace('/$', '', dirname($_SERVER['PHP_SELF'])) . '/';
	$action = $_GET['action'] ? $_GET['action'] : ($_POST['action'] ? $_POST['action'] : '');
	$connection = @mysql_connect(mysql_hostname, mysql_username, mysql_password) && @mysql_select_db(mysql_database) || die('<code>' . mysql_error() . '</code>');
	switch ($action) {
		case 'generate_url':
			$parsed = @parse_url($_POST['url']);
			if ($parsed && strlen($_POST['url']) && ereg('\.', $_POST['url'])) {
				if (eregi('^[a-z0-9-]+$', $_POST['tag'])) {
					$tag = $_POST['tag'];
					$sql = "SELECT * FROM `urls` WHERE `url_tag` = '$tag' OR `url_id` = '$tag'";
					$q = mysql_query($sql);
					$n = mysql_fetch_assoc($q);
					if ($n) {
						$cancel = true;
					}
				}
				if (!$cancel) {
					$url = ($parsed['scheme'] ? '' : 'http://') . (get_magic_quotes_gpc() ? mysql_real_escape_string(stripslashes($_POST['url'])) : mysql_real_escape_string($_POST['url']));
					$sql = "INSERT INTO `urls` (`url_location`, `url_tag`) VALUES ('$url', '$_POST[tag]')";
					$q = mysql_query($sql);
					$id = mysql_insert_id();
					if (!$tag) {
						$result = 'Ваш <strong>новый URL</strong>: <a href="' . $root . $id . '/">' . $root .  $id . '/</a> !';
					} else {
						$result = 'Ваш <strong>новый URL</strong>: <a href="' . $root . $tag . '/">' . $root .  $tag . '/</a> !';
					}
				} else {
					if (ereg('^[0-9]+$', $_POST['tag'])) {
						$result = 'Этот тег зарезервирован системой!';
					} else {
						$result = 'Тег недоступен!';
					}
				}
			} else {
				$result = 'Вставьте <strong>реальный URL</strong> пожалуйста!';
			}
			if ((bool) $_POST['javascript']) {
				header('Content-Type: text/plain');
				die($result);
			}
		break;
		case 'redirect':
			if (is_numeric($_GET['id']) || eregi('^[a-z0-9-]+$', $_GET['tag'])) {
				if (!$_GET['tag']) {
					$sql = "SELECT * FROM `urls` WHERE `url_id` = $_GET[id]";
				} else {
					$sql = "SELECT * FROM `urls` WHERE `url_tag` = '$_GET[tag]'";
				}
				$q = mysql_query($sql);
				$r = mysql_fetch_assoc($q);
				header("Location: $r[url_location]");
				exit;
			} else {
				header("Location: $root");
				exit;
			}
		break;
	}
?>

Скажите пожалуйста в каком месте мне нужно подредактировать код?
 
примерно так

PHP:
...
$url = ($parsed['scheme'] ? '' : 'http://') . (get_magic_quotes_gpc() ? mysql_real_escape_string(stripslashes($_POST['url'])) : mysql_real_escape_string($_POST['url']));
$tag = substr(md5($url), 0, 6);
$sql = "INSERT INTO `urls` (`url_location`, `url_tag`) VALUES ('$url', '$tag')";
...

при этом исчезнет возможность задавать пользовательские теги.

кроме того надо добавить проверку на то, что такого тега нет (она есть в коде чуть выше).
 
Как должна писаться проверка на существование тега в базе?
 
PHP:
$sql = "SELECT * FROM `urls` WHERE `url_tag` = '$tag' OR `url_id` = '$tag'";
$q = mysql_query($sql);
$n = mysql_fetch_assoc($q);
if ($n) {
  $cancel = true; //если попали сюда, значит такой tag уже есть
}

этот кусок осуществляет проверку.
 
PHP:
$sql = "SELECT * FROM `urls` WHERE `url_tag` = '$tag' OR `url_id` = '$tag'";
$q = mysql_query($sql);
$n = mysql_fetch_assoc($q);
if ($n) {
  $cancel = true; //если попали сюда, значит такой tag уже есть
}
этот кусок осуществляет проверку.

В итоге должно получиться так?

PHP:
<?php
	define('mysql_hostname', 'localhost');
	define('mysql_username', 'XXXX');
	define('mysql_password', 'XXXX');
	define('mysql_database', 'XXXX');
	ob_start('relink');
	$root = "http://$_SERVER[HTTP_HOST]" . ereg_replace('/$', '', dirname($_SERVER['PHP_SELF'])) . '/';
	$action = $_GET['action'] ? $_GET['action'] : ($_POST['action'] ? $_POST['action'] : '');
	$connection = @mysql_connect(mysql_hostname, mysql_username, mysql_password) && @mysql_select_db(mysql_database) || die('<code>' . mysql_error() . '</code>');
	switch ($action) {
		case 'generate_url':
			$parsed = @parse_url($_POST['url']);
			if ($parsed && strlen($_POST['url']) && ereg('\.', $_POST['url'])) {
				if (eregi('^[a-z0-9-]+$', $_POST['tag'])) {
					$tag = $_POST['tag'];
					$sql = "SELECT * FROM `urls` WHERE `url_tag` = '$tag' OR `url_id` = '$tag'";
					$q = mysql_query($sql);
					$n = mysql_fetch_assoc($q);
					if ($n) {
						$cancel = true;
					}
				}
				if (!$cancel) {
					$url = ($parsed['scheme'] ? '' : 'http://') . (get_magic_quotes_gpc() ? mysql_real_escape_string(stripslashes($_POST['url'])) : mysql_real_escape_string($_POST['url']));
					$tag = substr(md5($url), 0, 6);

					$sql = "SELECT * FROM `urls` WHERE `url_tag` = '$tag' OR `url_id` = '$tag'";
					$q = mysql_query($sql);
					$n = mysql_fetch_assoc($q);
					if ($n) {
					  $cancel = true; //если попали сюда, значит такой tag уже есть
					}  

					$sql = "INSERT INTO `urls` (`url_location`, `url_tag`) VALUES ('$url', '$tag')";
					
					$q = mysql_query($sql);
					$id = mysql_insert_id();
					if (!$tag) {
						$result = 'Ваш <strong>новый URL</strong>: <a href="' . $root . $id . '/">' . $root .  $id . '/</a> !';
					} else {
						$result = 'Ваш <strong>новый URL</strong>: <a href="' . $root . $tag . '/">' . $root .  $tag . '/</a> ! <br><br> <TEXTAREA rows="1" cols="27"  readonly="readonly" onclick="select(this)" scrolling="no">' . $root . $tag . '</TEXTAREA>';
					}
				} else {
					if (ereg('^[0-9]+$', $_POST['tag'])) {
						$result = 'Этот тег зарезервирован системой!';
					} else {
						$result = 'Тег недоступен!';
					}
				}
			} else {
				$result = 'Вставьте <strong>реальный URL</strong> пожалуйста!';
			}
			if ((bool) $_POST['javascript']) {
				header('Content-Type: text/plain');
				die($result);
			}
		break;
		case 'redirect':
			if (is_numeric($_GET['id']) || eregi('^[a-z0-9-]+$', $_GET['tag'])) {
				if (!$_GET['tag']) {
					$sql = "SELECT * FROM `urls` WHERE `url_id` = $_GET[id]";
				} else {
					$sql = "SELECT * FROM `urls` WHERE `url_tag` = '$_GET[tag]'";
				}
				$q = mysql_query($sql);
				$r = mysql_fetch_assoc($q);
				header("Location: $r[url_location]");
				exit;
			} else {
				header("Location: $root");
				exit;
			}
		break;
	}
?>
 
кусок с генерацией тэга должен выглядеть примерно вот так

PHP:
    case 'generate_url': 
        $parsed = @parse_url($_POST['url']); 
        if ($parsed && strlen($_POST['url']) && ereg('\.', $_POST['url'])) { 
            $tag  = $url;
            $stop = false;
              while (!$stop) 
              { 
                  $url = ($parsed['scheme'] ? '' : 'http://') . (get_magic_quotes_gpc() ? mysql_real_escape_string(stripslashes($_POST['url'])) : mysql_real_escape_string($_POST['url'])); 
                  $tag = substr(md5($tag), 0, 6); 

                  $sql = "SELECT * FROM `urls` WHERE `url_tag` = '$tag' OR `url_id` = '$tag'"; 
                  $q = mysql_query($sql); 
                  $n = mysql_fetch_assoc($q); 
                  if ($n) 
                  { 
                     //если попали сюда, значит такой tag уже есть 
                  }
                  else
                  {
                    $stop = true;
                  }   
              }
              $sql = "INSERT INTO `urls` (`url_location`, `url_tag`) VALUES ('$url', '$tag')"; 
               
              $q = mysql_query($sql); 
              $id = mysql_insert_id(); 
              if (!$tag) { 
                  $result = 'Ваш <strong>новый URL</strong>: <a href="' . $root . $id . '/">' . $root .  $id . '/</a> !'; 
              } else { 
                  $result = 'Ваш <strong>новый URL</strong>: <a href="' . $root . $tag . '/">' . $root .  $tag . '/</a> ! <br><br> <TEXTAREA rows="1" cols="27"  readonly="readonly" onclick="select(this)" scrolling="no">' . $root . $tag . '</TEXTAREA>'; 
              } 
        } else { 
            $result = 'Вставьте <strong>реальный URL</strong> пожалуйста!'; 
        } 
        if ((bool) $_POST['javascript']) { 
            header('Content-Type: text/plain'); 
            die($result); 
        } 
    break;

, а остальное можно без изменений оставить.
 
кусок с генерацией тэга должен выглядеть примерно вот так
PHP:
    case 'generate_url': 
        $parsed = @parse_url($_POST['url']); 
        if ($parsed && strlen($_POST['url']) && ereg('\.', $_POST['url'])) { 
            $tag  = $url;
            $stop = false;
              while (!$stop) 
              { 
                  $url = ($parsed['scheme'] ? '' : 'http://') . (get_magic_quotes_gpc() ? mysql_real_escape_string(stripslashes($_POST['url'])) : mysql_real_escape_string($_POST['url'])); 
                  $tag = substr(md5($tag), 0, 6); 
                  $sql = "SELECT * FROM `urls` WHERE `url_tag` = '$tag' OR `url_id` = '$tag'"; 
                  $q = mysql_query($sql); 
                  $n = mysql_fetch_assoc($q); 
                  if ($n) 
                  { 
                     //если попали сюда, значит такой tag уже есть 
                  }
                  else
                  {
                    $stop = true;
                  }   
              }
              $sql = "INSERT INTO `urls` (`url_location`, `url_tag`) VALUES ('$url', '$tag')"; 
              $q = mysql_query($sql); 
              $id = mysql_insert_id(); 
              if (!$tag) { 
                  $result = 'Ваш <strong>новый URL</strong>: <a href="' . $root . $id . '/">' . $root .  $id . '/</a> !'; 
              } else { 
                  $result = 'Ваш <strong>новый URL</strong>: <a href="' . $root . $tag . '/">' . $root .  $tag . '/</a> ! <br><br> <TEXTAREA rows="1" cols="27"  readonly="readonly" onclick="select(this)" scrolling="no">' . $root . $tag . '</TEXTAREA>'; 
              } 
        } else { 
            $result = 'Вставьте <strong>реальный URL</strong> пожалуйста!'; 
        } 
        if ((bool) $_POST['javascript']) { 
            header('Content-Type: text/plain'); 
            die($result); 
        } 
    break;
, а остальное можно без изменений оставить.

Скрипт работает не совсем корректно, при генераций ссылок с тегом состоящим полностью из цифр он выдает просто пустую страницу.
Для примера пример:
В БД все прописано как нужно:
412_snap_2009.11.29_20.57.12_001.jpg
 
PHP:
        case 'redirect': 
            if (is_numeric($_GET['id']) || eregi('^[a-z0-9-]+$', $_GET['tag'])) { 
                if (!$_GET['tag']) { 
                    $sql = "SELECT * FROM `urls` WHERE `url_id` = $_GET[id]"; 
                } else { 
                    $sql = "SELECT * FROM `urls` WHERE `url_tag` = '$_GET[tag]'"; 
                } 
                $q = mysql_query($sql); 
                $r = mysql_fetch_assoc($q); 
                header("Location: $r[url_location]"); 
                exit; 
            } else { 
                header("Location: $root"); 
                exit; 
            } 
        break;

меняем на

PHP:
    case 'redirect': 
        if (eregi('^[a-z0-9-]+$', $_GET['tag'])) 
        { 
            $sql = "SELECT * FROM `urls` WHERE `url_tag` = '$_GET[tag]'"; 
            $q = mysql_query($sql); 
            $r = mysql_fetch_assoc($q);
            if(isset($r[url_location]))
            {
              header("Location: $r[url_location]"); 
              exit; 
            } 
        }
        header("Location: $root"); 
        exit; 
    break;

P.S. Недавно писал аналогичный скрипт без использования БД. На тот случай если кому-то нужно - лежит здесь Для просмотра ссылки Войди или Зарегистрируйся
 
PHP:
        case 'redirect': 
            if (is_numeric($_GET['id']) || eregi('^[a-z0-9-]+$', $_GET['tag'])) { 
                if (!$_GET['tag']) { 
                    $sql = "SELECT * FROM `urls` WHERE `url_id` = $_GET[id]"; 
                } else { 
                    $sql = "SELECT * FROM `urls` WHERE `url_tag` = '$_GET[tag]'"; 
                } 
                $q = mysql_query($sql); 
                $r = mysql_fetch_assoc($q); 
                header("Location: $r[url_location]"); 
                exit; 
            } else { 
                header("Location: $root"); 
                exit; 
            } 
        break;
меняем на
PHP:
    case 'redirect': 
        if (eregi('^[a-z0-9-]+$', $_GET['tag'])) 
        { 
            $sql = "SELECT * FROM `urls` WHERE `url_tag` = '$_GET[tag]'"; 
            $q = mysql_query($sql); 
            $r = mysql_fetch_assoc($q);
            if(isset($r[url_location]))
            {
              header("Location: $r[url_location]"); 
              exit; 
            } 
        }
        header("Location: $root"); 
        exit; 
    break;
P.S. Недавно писал аналогичный скрипт без использования БД. На тот случай если кому-то нужно - лежит здесь Для просмотра ссылки Войди или Зарегистрируйся

Теперь при переходе по ссылке

редиректит на index.php

P.S. Попытался использовать ваш скрипт но почему-то не генерируются файлы ссылок в папке urls
 
редиректит на index.php

странно попробуйте убрать первую проверку

PHP:
    case 'redirect':
            $tag = $_GET['tag'];
            //echo "*$tag*"; 
            $sql = "SELECT * FROM `urls` WHERE `url_tag` = '$tag'"; 
            $q = mysql_query($sql); 
            $r = mysql_fetch_assoc($q);
            if(isset($r[url_location]))
            {
              header("Location: $r[url_location]"); 
              exit; 
            } 
        header("Location: $root"); 
        exit; 
    break;

если поможет, то раскоментируйте строку с echo, посмотрите, что у вас в переменной ханится.

Попытался использовать ваш скрипт но почему-то не генерируются файлы ссылок в папке urls

права на запись на папку не забыли выставить? вот, что отвечает ваш сервер

failed to open stream: Permission denied in
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху