我一直在使用Johnboy URL Shortner,我注意到它不会检查它生成的 URL 是否存在于数据库中。如何确保 URL 是唯一的>
问问题
223 次
5 回答
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
作主键。然后,您可以在插入新内容时执行以下三件事之一:
- 使用INSERT IGNORE并默默地丢弃欺骗。
- 使用INSERT ... ON DUPLICATE KEY UPDATE ...并更新骗子。
- 使用常规
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 回答