جستجو درپایگاه داده توسط Jquery در Asp.Net

سه شنبه 31 شهریور 1394

در این مقاله نشان می دهیم که چگونه در وب سایت خود با استفاده از ASP.Net کد C# ای پیاده سازی کنیم که جستجوی بهتری در سایت داشته باشیم.

جستجو درپایگاه داده توسط Jquery در Asp.Net

مقدمه:

این مقاله الگوریتمی را معرفی می کند که می توانید برای یافتن محتوای درون دیتابیس استفاده کرده و آن را برای هر فیلد نزدیک به جستجوی کاربر فراهم می کند.

پیش زمینه:

امروزه افراد زیادی را می بینیم که به دنبال ایجاد یک موتور جستجوی خوب و کارآمد هستند، در این مقاله قصد نداریم سورس کد موتور جستجوی Google یا Bing را در اختیار شما قرار دهیم، اما می خواهیم به شما نشان دهیم که یک موتور جستجو دقیقا چه کاری انجام می دهد(فقط بخش دیتابیس، چرا که قصد نداریم با meta tags، spider و crawlers کار کنیم) و چگونه نتایج را براساس کوئری ارسال شده به سرور توسط کاربر، به کاربر برمی گرداند.

محیط توسعه موردنیاز:

این برنامه در WebMatrix ایجاد شده است. اگر این نرم افزار را روی سیستم خود دارید، می توانید به بخش بعدی مقاله بروید. در غیر این صورت، می توانید آن را از Web Platform Installer مایکروسافت دریافت نمایید.

به وب سایت مایکروسافت (http://www.microsoft.com/web)  رفته و installer را دانلود نمایید. بعد از دانلود، نرم افزار روی سیستم شما نصب خواهد شد. دکمه accept را کلیک کرده و سپس wizard را ادامه دهید تا webmatrix و نرم افزارهای وابسته آن که نیاز نصب شود.

همچنین، SQL Server CE نیز نیاز است چرا که برای این کار باید با دیتابیس کار کنیم. SQL Server CE یک فایل رایگان مبتنی بر دیتابیس است که می توانید آن را به طور رایگان دانلود نموده و استفاده نمایید. همچنین می توانید از SQL Server Express و دیگر نسخه ها نیز استفاده کنید، فقط توجه داشته باشید که باید connection string را به web.config اضافه نمایید.

موتور جستجو چیست؟

درواقع، یک نرم افزار، منطق یا الگوریتم برای پیدا کردن محتوایی است شما به دنبال آن هستید. به عنوان مثال، Google یک کمپانی است که نتایج جستجوی مورد نظر شما را فراهم می کند. کوئری موردنظر را از شما دریافت کرده و روی دیتابیس خود اجرا می کنند و به دنبال بهترین نتیجه برای آن می گردند. معمولا از نوع خاصی از کدهای # As.net C برای رسیدن به نتیجه مطلوب استفاده می کنند.

این کار می تواند در هر وب سایت شخصی نیز انجام شود. برای این کار می توانید یک دیتابیس ایجاد کنید و سپس می توانید جدولی به آن اضافه کنید که محتواها را در آن ذخیره کنید. زمانی که این کار را انجام دهید، از این پس می دانید کجا و چگونه به دنبال محتوایی که کاربر درخواست کرده است بگردید. این دقیقا کاری است که موتورهای جستجو انجام می دهند، کوئری شما را گرفته و به دنبال نتیجه مربوط به آن دیتابیس خود را جستجو می کنند.

به عنوان مثال، زمانی که شما کلمه "کامپیوتر" را جستجو می کنید، این موتورها تمام محتواهایی که شامل این کلمه هستند جستجو می کنند، نتایج مطلوب را فراهم می کنند. همه این ها کد و داده هایی هستند که از قبل فراهم شده اند.

استفاده از پروژه:

این پروژه همه چیز را برای شما فراهم می کند، یک فیلد جستجو(که البته می تواند فقط یک فیلد ورودی باشد) و یک دکمه برای کار با آن داریم. زمانی که روی دکمه کلیک کنیم، به IIS Server رفته و درخواست را ارسال می کند که باید داده های دیتابیس خوانده شوند. IIS این کار را انجام می دهد و داده های تهیه شده را به این درخواست ارسال می کند. سپس پاسخ با محتوایی که می تواند با کوئری مربوطه مطابقت داشته باشد یا خیر، به این درخواست ارسال می شود.

بعد از این مرحله کاری که باقی می ماند، با کدی که در المنت body قرار دارد مدیریت می شود. که بررسی می کنیم آیا داده ای وجود دارد یا خیر، سپس مقادیر، محتوا و... را می یابیم.

ایجاد دیتابیس:

دیتابیسی که در این مقاله از آن استفاده کرده ایم، SQL Server CE می باشد که می توانید آن را از مایکروسافت به طور رایگان دریافت کرده و استفاده نمایید.

در این دیتابیس، تنها یک جدول داریم. این جدول شامل یک فیلد ID می باشد که در زمان مطابقت کوئری(Match) از آن استفاده می کنیم و PostTitle برای عنوان مورد جستجو و یک PostContent برای جستجوی محتوا استفاده می شود.

استفاده از وب سایت:

همانطور که گفتیم، این وب سایت از یک فرم ساده HTML استفاده می کند که ورودی را از کاربر می گیرد.

این یک فرم خالی است که با هر مقدار ورودی می تواند، پر شود. این فیلد را با کلمه "نرم افزار" پر کنید و مشاهده کنید که چه اتفاقی می افتد.

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

همانطور که می بینید در نتایج بالا، حداقل یک بار کلمه نرم افزار آمده است. تنها محتواهایی که به کوئری درج شده مربوط بودند، لیست شدند. این وب سایت هم عنوان و هم محتوا را برای کوئری مربوطه جستجو می کند. می توانید رابط کاربری خود را به شکل بهتری در آورید یا فقط عنوان را نشان دهید یا محتوا و یا هر دو کنار هم، مانند کاری که ما انجام داده ایم.

حال یک کوئری دیگر را امتحان می کنیم. این بار کلمه "#C" را جستجو می کنیم و نتیجه زیر به دست می آید:

شاید به نظر شبیه نتیجه قبلی باشد، اما اینطور نیست. اگر توجه کنید می بینید که این پست و عنوان آن، پست جدیدی است. بنابراین می توانید هر زمان که خواستید داده های جدید وارد کرده و refresh کنید و به عبارت دیگر، می توان گفت که از سرویس Cache استفاده نمی کند. به همین صورت به جستجوی داده های مربوطه ادامه می دهد و با استفاده از کوئری دقیقی که به دنبال آن هستید، داده ها را فراهم می کند و بقیه لیست را از آن حذف می کند.

و اما مواردی که در دیتابیس موجود نیستند:

این نیز یکی دیگر از امکانات این وب سایت است، که هیچ پیغام خطایی نمایش نمی دهد و در یک جمله به کاربر اطلاع می دهد که داده موردنیاز کاربر یافت نشد.

به عنوان مثال عبارت "Web Matrix" را جستجو می کنیم که صفحه زیر نمایش داده می شود:

این کد توسط ASP.Net تولید شده است که به شما نشان می دهد که هیچ محتوایی درباره "Web Matrix" ندارید و نیاز است که پست هایی در این باره به دیتابیس خود اضافه کنید تا کاربر با جستجوی این عبارت به نتایجی دست پیدا کند.

کد وب سایت:

این کد بسیار ساده است و مانند یک موتور جستجو کار می کند ولی یک موتور قدرتمند نیست چرا که تنها از چند خط کد سمت سرور ASP.Net تشکیل شده است، که مدیریت دیتابیس، کوئری وارد شده و سپس بارگذاری صفحه HTML را به عهده دارد.

@{  
   Layout = "~/_SiteLayout.cshtml";  
   Page.Title = "Home Page";  
}  
  
@{  
   bool executed = false;  
   List<int> titleResultStrings = new List<int>();  
   List<int> contentResultStrings = new List<int>();  
  
   if(IsPost) {  
      // request was made, get the input and search the database.  
      var query = "%" + Request.Form["input"] + "%";  
      var db = Database.Open("StarterSite");  
  
      // select the Query, parameters on  
      var selectTitleQuery = "SELECT * FROM Content WHERE PostTitle LIKE @0";  
      var selectContentQuery = "SELECT * FROM Content WHERE PostContent LIKE @0";  
      var titleResult = db.Query(selectTitleQuery, query);  
      var contentResult = db.Query(selectContentQuery, query);  
  
      // append the post id to the list  
      foreach (var row in titleResult) {  
         titleResultStrings.Add(row.PostId);  
      }  
  
      foreach (var row in contentResult) {  
         contentResultStrings.Add(row.PostId);  
      }  
  
      // got the content, now do the C# on it!  
      executed = true;  
   }  
}  
  
<form method="post">  
   Write the input and get the result!<br />  
   <input type="text" name="input" /><br />  
   <input type="submit" value="Submit" />  
</form>  
  
// code executed  
@if(executed) {  
   <p>Code has been executed!</p>  
   // if the code was executed show the result.  
   if(titleResultStrings.Count() != 0) {  
      var db2 = Database.Open("StarterSite");  
      <h4>Posts whose title have this character are</h4>  
      int i = 0;  
      foreach (var item in titleResultStrings) {  
         // get the data for each item!  
         var post = db2.Query("SELECT * FROM Content WHERE PostId = @0", titleResultStrings[i]);  
         i++;  
         foreach (var row in post) {  
            <p>@row.PostTitle</p>  
         }  
      }  
   } else {  
   <p>No post for query "<b>@Request.Form["input"]</b>" was found!</p>  
}  
  
if(contentResultStrings.Count() != 0) {  
   var db2 = Database.Open("StarterSite");  
   <h4>Posts whose content have this character are</h4>  
   int i = 0;  
   foreach (var item in contentResultStrings) {  
      // get the data for each item!  
      var post = db2.Query("SELECT * FROM Content WHERE PostId = @0", contentResultStrings[i]);  
      i++;  
      foreach (var row in post) {  
         <p>@row.PostContent</p>  
      }  
   }  
   } else {  
   <p>No post for query "<b>@Request.Form["input"]</b>" content was found!</p>  
   }  
}

20% این کد، الگوریتم می باشد و 30% آن مربوط به دیتابیس و 50% آن راه اندازی و بارگذاری HTML برای نمایش نتایج می باشد.

جلوگیری از SQL Injection:

SQL Injection روشی است که هکرها با شکستن کوئری وارد شده و تغییر آن سعی در دسترسی به دیتابیس و یا اعمال تغییراتی روی آن دارند. تزریق کدهای زیادی وجود دارد که می تواند محتوای دیتابیس را ویرایش، آپدیت و یا حتی جداول شما را حذف کند. مثالی از کوئری جستجوی دیتابیس به شکل زیر است:

var result = db.Query("SELECT * FROM table_name WHERE column_name = value");  

اگر مقادیر وارد شده صحیح باشند، این کد به درستی اجرا می شود. اما ممکن است کاربر مقداری وارد کند که سعی در شکستن کوئری داشته باشد و ممکن است کل دیتابیس توسط سرور به این کاربر ارائه شود. فرض کنید مقدار وارده شده به صورت زیر باشد.

"'; DROP TABLE table_name --"

کد بالا، کوئری را شکسته و جدول را حذف می نماید و بقیه کوئری را به صورت کامنت در می آورد(-- نشان دهنده کامنت در SQL می باشد)

برای جلوگیری از این حمله، باید کاری کنیم که امکان شکستن کوئری وجود نداشته باشد. تا زمانی که کوئری صحیح باشد، حتی اگر هیچ نتیجه ای مطابق آن در دیتابیس یافت نشود مشکلی پیش نخواهد آمد. در اینجا یک متغیر جدیدی ایجاد نموده ایم که توسط کد مقداردهی می شود. به این دلیل که اجازه پارامتردهی در کوئری ندهیم.

var query = "%" +Request.Form["input"] + "%";  
var selectTitleQuery = "SELECT * FROM Content WHERE PostTitle LIKE @0";  
var selectContentQuery = "SELECT * FROM Content WHERE PostContent LIKE @0"; 

 

برنامه نویسان

نویسنده 3355 مقاله در برنامه نویسان

کاربرانی که از نویسنده این مقاله تشکر کرده اند

در صورتی که در رابطه با این مقاله سوالی دارید، در تاپیک های انجمن مطرح کنید