Pergunta

Eu estou tentando criar um sistema de registro que permite que os usuários enviem suas URLs do website.Agora, quando um usuário digita uma URL, verifica-se contra o banco de dados para ver se ele já existe, e rejeita-lo se ele faz.

No entanto, o meu problema é devido a este :

Se http://www.example.com é no banco de dados e eu entrar http://example.com, isso conta como uma URL diferente quanto a seleção está em causa, e permite o envio.

Existe uma maneira correta de lidar com isso, além de recuperar todos os registros, removendo o www se presente, e, em seguida, comparar?(O que é extremamente ineficiente maneira de fazer isso!)

Nota :Adicionar Laravel etiqueta no caso de ter quaisquer funções auxiliares para isso (eu estou usando um laravel-4 instalação).

EDITAR :Este é o meu atual lógica para a seleção :

$exists_url = DB::table("user_urls")
        ->where('site_url', 'like', $siteurl)
        ->get();
        if($exists_url)
        {
            return Redirect::to('submiturl')->withErrors('Site already exists!');
    }

EDIT 2 :Uma maneira é pegar a URL fornecida http://www.example.com, e , em seguida, pesquisar o banco de dados para http://www.example.com, www.example.com, http://example.com e example.com.No entanto, eu estou tentando encontrar uma maneira mais eficiente de fazer isso!

Foi útil?

Solução

Eu acho que antes de implementar uma solução que você deve abstratamente carne para fora de sua política de forma mais minuciosa.Há muitas partes de um URL que pode ou não ser equivalente.Você deseja tratar protocolos como equivalentes? https://foo.com vs http://foo.com.Alguns subdomínios podem ser aliases, alguns talvez não. http://www.foo.com vs http://foo.com, ou http://site1.foo.com vs http://foo.com.O que sobre o caminho da URL? http://foo.com vs http://foo.com/index.php.Eu não iria perder o seu tempo escrevendo uma função de comparação até que tenha completamente pensamento através de sua política.Boa sorte!

ATUALIZAÇÃO:

Algo como isso, talvez:

$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

Outras dicas

Você pode verificar antes de enviar os dados para o banco de dados utilizando PHP.Segue-se um pequeno exemplo.Obviamente, você pode torná-lo mais avançado como por seu gosto.

<?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";
   }
?>

Seguinte é o MySQL Substituir exemplo.Neste exemplo, 'url' é campo de banco de dados.

SELECT * FROM `urls` WHERE REPLACE(url, "http://www","") = "google.com" OR REPLACE(url,"http://","") = "google.com"

Mais uma vez, isso é muito básico, só para sua melhor compreensão.

No caso de necessitar de mais assistência, por gentileza me avise

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top