修改url缩短脚本

时间:2011-04-05 16:15:06

标签: php mysql short-url

我一直在使用Johnboy URL shortner,我注意到它没有检查并查看它生成的URL是否存在于数据库中。我怎样才能确保该网址是唯一的<>

5 个答案:

答案 0 :(得分:2)

为长网址或短网址创建unique index/constraint或两者。当脚本尝试插入具有相同值的另一个记录时,INSERT语句将失败并显示specific error code,您可以对其进行测试和处理。

define('MYSQL_ER_DUP_ENTRY', 1062);
...
if ( !mysql_query($mysql, $query) ) {
  if ( MYSQL_ER_DUP_ENTRY==mysql_errno($mysql) ) {
    // handle duplicate entry
  }
}

答案 1 :(得分:2)

好像johnboy的脚本似乎充满了漏洞......但是你走了! (修改了index.php脚本,用于计算新的短网址)

$short = substr(str_shuffle('abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'), 0, 5); 
$unique = false;
while(!$unique) {
    $exists = mysql_fetch_assoc(mysql_query("SELECT url_link FROM urls WHERE url_short = '".$short."'")); 
    if($exists['url_link'] != '') {
        // one already exists! create another, try again.
        $short = substr(str_shuffle('abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'), 0, 5); 
    } else {
        $unique = true;
    }
}
mysql_query("INSERT INTO urls (url_link, url_short, url_ip, url_date) VALUES 
    ( 
    '".addslashes($_POST['url'])."', 
    '".$short."', 
    '".$_SERVER['REMOTE_ADDR']."', 
    '".time()."' 
    ) 
"); 

答案 2 :(得分:2)

DB表如下所示:

CREATE TABLE IF NOT EXISTS `urls` (
  `url_id` int(11) NOT NULL auto_increment,
  `url_link` varchar(255) default NULL,
  `url_short` varchar(6) default NULL,
  `url_date` int(10) default NULL,
  `url_ip` varchar(255) default NULL,
  `url_hits` int(11) default '0',
  PRIMARY KEY  (`url_id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

主键是一个自动递增的整数,不会在应用程序的任何位置使用。你可以摆脱它并使用url_short作为主键。然后,您可以在插入新内容时执行以下三项操作之一:

  1. 使用INSERT IGNORE并默默丢弃欺骗。
  2. 使用INSERT ... ON DUPLICATE KEY UPDATE ...并更新欺骗。
  3. 使用常规INSERT并检查错误代码:如果是1062,那就是骗局。
  4. 我会去#3。

    但是,考虑到它使用addslashes()将输入参数注入SQL,我只是避免使用这个脚本。它看起来过时和不安全。

答案 3 :(得分:0)

只需将UNIQUE添加到数据库列url_link即可。

答案 4 :(得分:0)

您可以使用外键约束来确保数据库级别的唯一URL。然后,在php中,检查查询是否插入了一行 - 如果是,那么您知道已插入一个唯一的URL,如果没有,则让用户或脚本有机会再次尝试使用新的字符串。