Domanda

Sto cercando di creare un sistema di registrazione che consenta agli utenti di inviare gli URL dei propri siti web.Ora, quando un utente inserisce un URL, verifica se esiste già nel database e, in caso affermativo, lo rifiuta.

Tuttavia, il mio problema è dovuto a questo:

Se http://www.example.com è nel database e inserisco http://example.com, questo conta come un URL diverso ai fini del controllo e consente l'invio.

Esiste un modo corretto per gestirlo, oltre a recuperare tutti i record, rimuovendo il file www se presente, e poi confrontare?(Il che è un modo terribilmente inefficiente per farlo!)

Nota :Aggiunta del tag Laravel nel caso in cui abbia funzioni di supporto per questo (sto usando un'installazione laravel-4).

MODIFICARE :Questa è la mia logica attuale per il controllo:

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

MODIFICA 2:Un modo è prendere l'URL fornito http://www.example.com, quindi cercare nel database http://www.example.com, www.example.com, http://example.com E example.com.Tuttavia sto cercando di trovare un modo più efficiente per farlo!

È stato utile?

Soluzione

Penso che prima di implementare una soluzione dovresti delineare astrattamente la tua politica in modo più approfondito.Esistono molte parti di un URL che possono essere equivalenti o meno.Vuoi trattare i protocolli come equivalenti? https://foo.com contro http://foo.com.Alcuni sottodomini potrebbero essere alias, altri no. http://www.foo.com contro http://foo.com, O http://sito1.foo.com contro http://foo.com.E il percorso dell'URL? http://foo.com contro http://foo.com/index.php.Non perderei il tuo tempo a scrivere una funzione di confronto finché non avrai riflettuto completamente sulla tua polizza.Buona fortuna!

AGGIORNAMENTO:

Qualcosa del genere forse:

$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

Altri suggerimenti

Puoi controllare prima di inviare dati al database usando PHP.Di seguito è riportato un piccolo esempio.Ovviamente puoi renderlo più avanzato secondo i tuoi gusti.

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

Di seguito è riportato l'esempio di sostituzione di MySQL.In questo esempio "url" è il campo del database.

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

Ancora una volta questo è molto semplice solo per una migliore comprensione.

Nel caso abbiate bisogno di ulteriore assistenza, fatemelo sapere

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top