Php を使用した MySQL データベースからの URL の可用性 [重複]
質問
ユーザーが自分の Web サイトの 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:1 つの方法は、指定された URL を取得することです http://www.example.com
, 、データベースを検索して、 http://www.example.com
, www.example.com
, http://example.com
そして example.com
. 。ただし、これを行うためのより効率的な方法を見つけようとしています。
解決
ソリューションを実装する前に、ポリシーをより徹底的に抽象的に具体化する必要があると思います。URL には、同等である場合とそうでない部分が多数あります。プロトコルを同等のものとして扱いますか? https://foo.com 対 http://foo.com. 。サブドメインの中にはエイリアスである場合もあれば、そうでない場合もあります。 http://www.foo.com 対 http://foo.com, 、 または http://site1.foo.com 対 http://foo.com. 。URLのパスはどうなるのでしょうか? http://foo.com 対 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
他のヒント
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"
繰り返しになりますが、これは理解を助けるための非常に基本的なものです。
さらにサポートが必要な場合は、お知らせください。