我正在尝试创建一个注册系统,允许用户提交他们的网站 URL。现在,当用户输入 URL 时,它会检查数据库以查看该 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:一种方法是获取给定的 URL http://www.example.com, ,然后在数据库中搜索 http://www.example.com, www.example.com, http://example.comexample.com. 。不过,我正在尝试找到一种更有效的方法来做到这一点!

有帮助吗?

解决方案

我认为在实施解决方案之前,您应该更彻底地抽象地充实您的政策。URL 的许多部分可能相同,也可能不同。您想将协议视为等效的吗? https://foo.comhttp://foo.com. 。有些子域可能是别名,有些可能不是。 http://www.foo.comhttp://foo.com, , 或者 http://site1.foo.comhttp://foo.com. 。URL 的路径呢? http://foo.comhttp://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

其他提示

您可以在使用 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"

再说一遍,这是非常基本的,只是为了您更好地理解。

如果您需要任何进一步的帮助,请告诉我

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top