1

我一直在使用Johnboy URL Shortner,我注意到它不会检查它生成的 URL 是否存在于数据库中。如何确保 URL 是唯一的>

4

5 回答 5

2

为长 URL 或短 URL 或两者创建唯一索引/约束。当脚本尝试插入具有相同值的另一条记录时,INSERT 语句将失败并显示特定错误代码,您可以对其进行测试和适当处理。

define('MYSQL_ER_DUP_ENTRY', 1062);
...
if ( !mysql_query($mysql, $query) ) {
  if ( MYSQL_ER_DUP_ENTRY==mysql_errno($mysql) ) {
    // handle duplicate entry
  }
}
于 2011-04-05T16:22:47.360 回答
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,则为骗子。

我会去#3。

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

于 2011-04-05T16:29:05.320 回答
2

好像 johnboy 的脚本充满了漏洞……但你去吧!(修改 index.php 脚本,它计算新的短 url)

$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()."' 
    ) 
"); 
于 2011-04-05T16:26:36.090 回答
0

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

于 2011-04-05T16:21:27.850 回答
0

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

于 2011-04-05T16:26:35.263 回答