我一直在使用Johnboy URL shortner,我注意到它没有检查并查看它生成的URL是否存在于数据库中。我怎样才能确保该网址是唯一的<>
答案 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)
$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
作为主键。然后,您可以在插入新内容时执行以下三项操作之一:
INSERT
并检查错误代码:如果是1062,那就是骗局。我会去#3。
但是,考虑到它使用addslashes()
将输入参数注入SQL,我只是避免使用这个脚本。它看起来过时和不安全。
答案 3 :(得分:0)
只需将UNIQUE
添加到数据库列url_link
即可。
答案 4 :(得分:0)
您可以使用外键约束来确保数据库级别的唯一URL。然后,在php中,检查查询是否插入了一行 - 如果是,那么您知道已插入一个唯一的URL,如果没有,则让用户或脚本有机会再次尝试使用新的字符串。