我正在尝试创建一个允许用户提交其网站网址的注册系统。现在,当用户输入URL时,它会检查数据库以查看它是否已存在,如果存在则拒绝它。
然而,我的问题是因为:
如果http://www.example.com
在数据库中并且我输入http://example.com
,则就检查而言,这将被视为不同的URL,并允许提交。
除了检索所有记录,删除www
(如果存在),然后进行比较之外,是否有正确的方法来处理此问题? (这是一种非常低效的方式!)
注意:添加Laravel标签,以防它具有任何辅助功能(我正在使用laravel-4安装)。
编辑:这是我目前检查的逻辑:
$exists_url = DB::table("user_urls")
->where('site_url', 'like', $siteurl)
->get();
if($exists_url)
{
return Redirect::to('submiturl')->withErrors('Site already exists!');
}
编辑2:一种方法是获取给定的网址http://www.example.com
,然后在数据库中搜索http://www.example.com
,www.example.com
,http://example.com
和example.com
。但是我正试图找到一种更有效的方法来做到这一点!
答案 0 :(得分:1)
我认为在您实施解决方案之前,您应该更彻底地充实您的政策。 URL的许多部分可能相同也可能不相同。您想将协议视为等效协议吗? https://foo.com vs http://foo.com。一些子域可能是别名,有些可能不是。 http://www.foo.com vs http://foo.com或http://site1.foo.com vs http://foo.com。 URL的路径怎么样? http://foo.com vs http://foo.com/index.php。在你完全考虑好自己的政策之前,我不会浪费你的时间来编写比较函数。祝你好运!
<强>更新强>
或许这样的事情:
$ignore_subdomains = array('www','web','site');
$domain_parts = explode('.',$siteurl);
$subdomain = strtolower(array_shift($domain_parts));
$siteurl = (in_array($subdomain,$ignore_subdomains)) ? implode('.',$domain_parts) : $siteurl;
//now run your DB comparison query
答案 1 :(得分:0)
您可以在使用PHP将数据发送到数据库之前进行检查。以下是一个小例子。显然你可以根据自己的喜好使它更先进。
<?php
$test = "http://www.google.com";
$testa = "http://google.com";
if (str_replace("www.","",str_replace("http://","",$testa)) == str_replace("www.","",str_replace("http://","",$test))) {
echo "same";
}
else {
echo "different";
}
?>
以下是MySQL替换示例。在此示例中,“url”是数据库字段。
SELECT * FROM `urls` WHERE REPLACE(url, "http://www","") = "google.com" OR REPLACE(url,"http://","") = "google.com"
再一次,这是非常基本的,只是为了让您更好地理解。
如果您需要任何进一步的帮助,请告诉我