PDA

View Full Version : سوال: گرفتن آدرس های اینترنتی مشابه یک آدرس از جدول my sql



dragontools
دوشنبه 07 فروردین 1391, 22:42 عصر
با سلام خدمت همه اساتید و دوستان
سال نو مبارک.

من یک جدول بنام test دارم که یکی از فیلدهاش url اسمشه و توش یه آدرس اینترنتی ثبت شده (مشخص نیست چه شکلیه یعنی www داره نداره یا index.php یا index.jsp یا index.aspx یا index.asp یا هر پسوندی و یا query string های گمراه کننده مثل http://test.com/? یا http://test.com/?1 یا http://test.com/?do=2 ممکنه هر کدومو داشته باشه یا نداشته باشه)
از یه طرفم یه متغیر url$ دارم که میخوام اگه به هیچ وجه نمونش ثبت نشده تو جدول (با در نظرگرفتن همون مطالب داخل پرانتز بالا) ثبت بشه...

خلاصه بگم یه expression جامع میخوام. ازتون خواهش میکنم کمکم کنید. اخه دارم یه سایت مینویسم که طرح خوارزمیمه. سال سوم هستم. خدا خیرتون بده.

موفق باشید.

djsaeedkhan
سه شنبه 08 فروردین 1391, 02:35 صبح
سلام
می تونی از تابع explode هم استفاده کنی
با explode('.',$url)d می تونی به قسمت های مختلف برسی.
و چون کوری ها در آخر آدرس هستند با همون تابع ولی جدا کننده & به متغیر های کوری دسترسی داشته باشی
اینم یه روشه دیگه

dragontools
سه شنبه 08 فروردین 1391, 08:21 صبح
خیلی خیلی ممنون. تست میکنم جوابشو میدم.
راستی هر وقتم طرحم آماده شد آدرسشو میذارم اینجا تا نظرات استادانتو بگین. هر چی باشه چهارتا استکان بیشتر از ما توی این کار شکوندین! :لبخند:

موفق باشید.


راستی یه چیز دیگه سایت hwhcharge.ir رو خودم نوشتم بهتر بگم مال خودمه. طراحیش چطوره؟؟؟ شش ماهه آوردمش رتبه 10 گوگل تو جستجوی "خرید کارت شارژ" (توی بحث سئو خیلی چیزا بلدم که همشونو به کار گرفتم.) 1+ هم بزنین ممنون میشم.

با تشکر

dragontools
سه شنبه 08 فروردین 1391, 09:04 صبح
روش mohsen6500 جواب نمیده. یعنی براحتی http://hesam.com و http://hesam.com/index.php یا http://www.hesam.com رو ثبت میکنه!

روش djsajadkhan هم خیلی دردسرداره. فکر کنم بشه با regular expression حلش کرد؟ کسی راهی بلد نیست؟

با تشکر

dragontools
سه شنبه 08 فروردین 1391, 09:07 صبح
منظورم از دردسر اینه که تو روش djsajadkhan باید دونه دونه url ها رو بیرون بکشی بازشون کنی چکشون کنی.
حدسم این بود شاید بشه با همون query اول که به بانک میفرستیم بشه حلش کرد. لطفاً کمکم کنید. وضعیتم حساسه.

با تشکر

narsic
سه شنبه 08 فروردین 1391, 11:00 صبح
شما میخواید اگه آدرس test.com/index.php وجود داشت دیگه آدرس test.com رو ثبت نکنه؟ یا اینکه اگه index.php وجود داشت و حالا contact.php رو میخواید ثبت کنید این رو ثبت کنه؟

djsaeedkhan
سه شنبه 08 فروردین 1391, 11:46 صبح
ببینید
http://barnamenevis.org/showthread.php?322464-%D9%BE%D8%B1%D9%88%DA%98%D9%87-%D8%AD%D8%B1%D9%81%D9%87-%D8%A7%DB%8C-%DA%86%D8%AA-%D8%B1%D9%88%D9%85-%D8%A8%D8%A7-php-%D9%88-Ajax

dragontools
سه شنبه 08 فروردین 1391, 12:39 عصر
درست فهمیدین چون محتوای این

http://test.com
و

http://test.com/index.*
یکیه و من نمیخوام دوبار ثبت بشه. ولی فایلی به قول شما contact.php که بحثش جداست و باید ثبت بشه.
بهتر بگم نمیخوام یه صفحه دوبار ثبت بشه.

فکر کنم تشخیص اینکه query string واقعیه یا الکی (واسه دور زدن برنامه) خیلی سخت باشه!!!

بنظرتون واسه query string ها چیکار کنم؟؟؟
چیزی که تو ذهنمه اینه که مشابه ها رو ثبت کنم یه جایی و دستی چکشون کنم. ولی خیلی بد میشه.
یه روش دیگه هم هست اینکه با file_get_contents محتواشونو مقایسه کنم. ولی حس میکنم روش های بهتری هم وجود داشته باشه که من بلد نیستم.
اگه راه حلی واسه اینم دارین بگین؟

خواهش میکنم اگه میتونین کمک کنید. وقتم داره تموم میشه.

ممنون.

dragontools
چهارشنبه 09 فروردین 1391, 09:44 صبح
کسی نمیخواد جواب بده چون گفتم وقتم کمه؟

MMSHFE
چهارشنبه 09 فروردین 1391, 17:53 عصر
دوست عزیز، اگه اینطور بخواین درنظر بگیرین، باید مراقب صفحاتی مثل Default.aspx و... هم باشین که توی ASP.NET بعنوان صفحه اصلی محسوب میشن و درنتیجه محتوای blogfa.com و blogfa.com/Default.aspx یکسان هست (مثلاً). بهترین کار اینه که صفحاتی رو که بعنوان صفحه خانگی (اصلی) در حالت پیشفرض درنظر گرفته میشن مثل *.index و *.Default و... رو توی آرایه بگذارین و موقع ثبت آدرس اون رو با parse_url تفکیک کنید و ببینید اگه صفحه اصلی دامنه مربوطه قبلاً ثبت شده بود، فقط اجازه ثبت صفحات جانبی مثل contact.php و... رو بدین. حقیقتش ایده چک کردن با file_get_contents و... بنظرم مناسب نیست چون توی سایتهای پویا، حتی یک صفحه خاص ممکنه در شرایط مختلف، محتوای متفاوتی با دفعات قبل داشته باشه. البته میشه از روشهای ترکیبی استفاده کرد. مثلاً اگه دامنه مربوطه اصلاً ثبت نشده بود، اجازه ثبت رو بدون هرگونه پردازشی بدیم و اگه دامنه ثبت شده باشه، اونوقت صفحه رو چک کنیم که آیا این صفحه خاص از دامنه مربوطه قبلاً ثبت شده یا نه. موفق باشید.

dragontools
پنج شنبه 10 فروردین 1391, 15:07 عصر
منظورتو فهمیدم. راستش از اولم به این فکر بودم که یه تابع دستی بنویسم گفتم شاید بشه باreqular expression درستش کرد. خیلی ممنونم.
راستی اگه تونستین به سایت اولم hwhcharge.ir که نوشتمش یه سر بزنین و نظرتو pm بدین یا از طریق تماس خود سایت بهم بگین. ممنون میشم.

با تشکر.

dragontools
شنبه 12 فروردین 1391, 16:43 عصر
یه چیزی نوشتم. نظراتتونو بگین تا تکمیل بشه.





$added = "added";
$exists = "exists";
$insertSql = "insert into test values (null,'$url');";
$sql = mysql_query("select * from test where `url`='$url';");
$num = mysql_num_rows($sql);
if($num>0){
echo $exists;
}else{
$parsed = parse_url($url);
$host = str_replace("www.","",$parsed['host']);
$indexes = array("/index.php","/index.jsp","/index.asp","/index.htm","/index.html","/index.aspx","/Default.aspx");
if(in_array($parsed['path'],$indexes)){
echo $exists;
}else{
$sql = mysql_query("select * from test where (`url` LIKE ('%$host%'));");
$num = mysql_num_rows($sql);
if($num>0){
mysql_query("اینجا باید آدرس رو توی یه جدول دیگه تو بانک ذخیره کنیم تا دستی چک بشه برای اطمینان بیشتر.");
$urldata = file_get_contents($url); $notSimilar=0;
for($i=1;$i<=$num;$i++){
$row = mysql_fetch_array($sql);
if($urldata!=file_get_contents($row['url'])){
$notSimilar++;
}else{
echo $exists;
}
}
if($num==$notSimilar){
mysql_query($insertSql);
}else{
echo $exists;
}
}else{
mysql_query($insertSql);
echo $added;
}
}
}

hassanzanjani1374
شنبه 12 فروردین 1391, 20:08 عصر
چرا موقع ثبت داخل دیتابیس همه رو یک جور نمی کنید ؟ این طوری به نظرم خیلی کارتون راحتر بشه

dragontools
شنبه 12 فروردین 1391, 23:46 عصر
چرا موقع ثبت داخل دیتابیس همه رو یک جور نمی کنید ؟ این طوری به نظرم خیلی کارتون راحتر بشه


مشکل اینه که توسط کاربر ذخیره میشه!!!

dragontools
یک شنبه 13 فروردین 1391, 23:08 عصر
کسی نمیخواد یه کار خیر انجام بده. ما رفتیم.

MMSHFE
دوشنبه 14 فروردین 1391, 01:09 صبح
شرمنده یکم سرم شلوغه ولی فرصت کنم، یک نمونه با استفاده از همین کدهایی که گذاشتین و اندکی تغییرات جزئی آماده میکنم. موفق باشید.

dragontools
دوشنبه 14 فروردین 1391, 08:54 صبح
هفدهم باید طرحمو تحویل بدم. خواهش میکنم...

MMSHFE
دوشنبه 14 فروردین 1391, 09:37 صبح
mysql_connect('localhost', 'root', '') or die('Connection error');
mysql_select_db('dbname') or die('Database error');
mysql_query('SET NAMES \'utf8\'');
mysql_set_charset('utf8');
$url = isset($_GET['url']) ? mysql_real_escape_string($_GET['url']) : '';
$added = 'Added';
$exists = 'Exists';
$insertSql = "INSERT INTO `test` VALUES (null,'{$url}');";
$sql = mysql_query("SELECT * FROM `test` WHERE (`url`='{$url}');");
$flag = true;
// URL is stored exactly in DB
if($sql && mysql_num_rows($sql) > 0) {
$flag = false;
}
else {
$parsed = parse_url($url);
$host = str_replace('www.', '', $parsed['host']);
$indices = array('index.php', 'index.jsp', 'index.asp', 'index.htm', 'index.html', 'index.aspx', 'Default.aspx');
foreach($indices as $index) {
$sql = mysql_query("SELECT * FROM `test` WHERE (`url`='{$host}/{$index}'));");
// URL is stored with one of index pages in DB
if($sql && mysql_num_rows($sql) > 0) {
$flag = false;
break;
}
}
unset($index);
if($flag) {
$path = $parsed['path'];
if(strlen($path) > 0) {
$path = substr($path, 1);
}
$sql = mysql_query("SELECT * FROM `test` WHERE (`url`='{$host}/{$path}'));");
// URL and PATH are stored in DB
if($sql && mysql_num_rows($sql) > 0) {
$flag = false;
}
if($flag) {
$sql = mysql_query("SELECT * FROM `test` WHERE (`url` LIKE '{$host}%')");
// Another path of URL is stored in DB
if($sql && mysql_num_rows($sql)) {
$urlData = file_get_contents($url);
while($path = mysql_fetch_assoc($sql) && $flag) {
$dbData = file_get_contents($path['url']);
if($urlData == $dbData) {
$flag = false;
}
}
}
}
}
}
if($flag) {
mysql_query($insertSql);
echo $added;
}
else {
echo $exists;
}

توی کد فوق، ابتدا بررسی میکنه ببینه آیا آدرس درخواست شده، دقیقاً به همون شکل توی دیتابیس هست یا نه. اگه بود که هیچ، اگه نبود، اونوقت چک میکنه ببینه صفحه اصلی اون آدرس توی دیتابیس هست یا نه. باز هم اگه بود از عمل ثبت صرفنظر میشه ولی اگه نبود، اونوقت چک میکنه ببینه آدرس و مسیر مربوطه (بدون QueryString و....) توی دیتابیس هست یا نه. اگه بود ثبت نمیکنه ولی اگه نبود، اونوقت صفحات دیگری که از همون هاست ثبت شده رو چک میکنه و اگه محتوای هرکدوم از اونها با محتوای صفحه جاری یکی بود، ثبت انجام نمیشه. اگه هیچ کدوم از حالتهای بالا برقرار نباشه، آدرس توی دیتابیس ثبت میشه. البته من در کد بالا آدرس رو به روش GET گرفتم (برای تست) و درصورت لزوم، باید کد رو مطابق اطلاعات سایت خودتون تغییر بدین.
موفق باشید.

dragontools
دوشنبه 14 فروردین 1391, 10:04 صبح
سلام



$indices = array('index.php', 'index.jsp', 'index.asp', 'index.htm', 'index.html', 'index.aspx', 'Default.aspx');
foreach($indices as $index) {
$sql = mysql_query("SELECT * FROM `test` WHERE (`url`='{$host}/{$index}'));");
if($sql && mysql_num_rows($sql) > 0) {
$flag = false;
break;
}
}



این قسمت باید به این صورت تغییر کنه. چون مثلاً وقتی blogfa.com ثبت شده نباید blogfa.com/Default.aspx ثبت بشه چون یکی هستن!



$indices = array("/index.php","/index.jsp","/index.asp","/index.htm","/index.html","/index.aspx","/Default.aspx");
if(in_array($parsed['path'],$indexes)){
$flag = false;
}else{
foreach($indices as $index) {
$sql = mysql_query("select * from test where (`url`='$host/$index');");
if($sql&&mysql_num_rows($sql)>0){
$flag = false;
break;
}
}
}


با تشکر.

MMSHFE
دوشنبه 14 فروردین 1391, 15:28 عصر
نه دوست عزیز، اگه به کد دقت کنید میبینید که درصورت پیدا شدن آدرس اصلی به تنهایی یا همراه با هرکدوم از صفحات index یا default و... توی دیتابیس، flag$ مقدار false میگیره و فقط درصورتی در انتهای اسکریپت عمل درج در دیتابیس انجام میشه که flag$ هنوز true باشه. موفق باشید.