أكيد كل منا قد صمم محرك للبحث و عادة ما يكون بسيطا جدا لا يتعدى حقل او حقلين للبحث و كل منا يرى أن هناك مواقع لها محركات بحث موسعة .. مثلا نرى حقل للاسم و تحته مجموعة من الخيارات مثل الاسم الحقيقي و العمر و الجنسية و الجنس و البلد و غيرها من الخيارات بشكل يجعلك تقول في نفسك كيف يتم تحديد جملة الاستعلام و هل يلجأ للاحتمالات .. مثلا هناك 3 خيارات فهل سيقوم بكتابة ستة جمل استعلام لاخذ احتمالات الثلاث خيارات؟ و كم سيكون العدد ان كانت الخيارات كثيرة ؟
أنا قمت بكتابة سكريبت صغير و بسيط يقوم بعمل ذلك بكل سهولة و مرونة مهما تعددت الخيارات و سأكتبه الان ثم سأشرحه..
<%@codepage=1256%>
<%
Set cn = CreateObject("ADODB.Connection")
cn.Open("driver={Microsoft Access Driver (*.mdb)};dbq=" & _
Server.MapPath("/searchEngine/db.mdb"))
Sub write(text)
Response.write(text)
End Sub
loginname=request("loginname")
check_realname=request("check_realname")
realname=request("realname")
check_gender=request("check_gender")
gender=request("gender")
check_applicationid=request("check_applicationid")
applicationid=request("applicationid")
check_dealer=request("check_dealer")
dealer=request("dealer")
check_region=request("check_region")
region=request("region")
if check_realname<>"" or check_gender<>"" or check_applicationid<>"" or check_dealer<>"" or check_region<>"" then
flag=true
end if
set rs=createObject("ADODB.recordSet")
SQL="SELECT * FROM users"
if flag=true then
SQL= SQL & " where "
if check_realname<>"" then
SQL=SQL & "realName='"&realname&"'"
stat=True
end if
if check_gender<>"" then
if stat=True then SQL=SQL & " and "
SQL=SQL & "gender='"&gender&"'"
stat=True
end if '
'
'
'
' هنا يتم تكرار الخطوات حسب الحقول الموجودة
'
'
'
end if //end of flag
rs.Open SQL,cn,3,3
if rs.EOF then
write "not found"
else
while not rs.eof
write rs("login") &"<BR>"
rs.MoveNext
wend
end if
rs.Close
set rs=nothing
cn.close
set cn=nothing
%>فكرة الكود منطقية جدا .. و هي عمل جملة استعلام SQL قابلة للزيادة اوتوماتيكيا حسب الخيارات .. كيف ذلك؟
عادة الحالة الافتراضية هي جملة استعلام بدون شروط و لكن ماذا يحدث لو كان هناك شرط؟ من المؤكد ستزيد على الاقل كلمة where و اسم الحقل الذي ستبحث عنه و القيمة المرسلة التي ستقارن بها .. تابع المثال هنا :
// جملة الاستعلام العادية SQL="SELECT * FROM users" // لو كان هناك شرط واحد فقط SQL="SELECT * FROM users where login=' " & loginName& " ' "
اذا لاحظنا الاختلاف بين الجملتين لذا كانت الفكرة في عمل متغير اسمه flag يكون عادة false و عندما يجد أن أحد الخيارات معلم من خلال ال checkBox الخاص به يتحول تلقائيا ل True و بالتالي نكون تأكدنا أنه على الأقل سيكون هناك شرط واحد على الأقل .. يعني تلزمنا where و جملة المقارنة ..
لكن لو فكرنا قليلا سنجد انه سواء كان هناك شرط واحد او الف شرط ستكون هناك جملة where واحدة و عدد من جمل المقارنة و يفصلها and او or حسب نظام محرك البحث ..
و لو تمعنا قليلا في طريقة لحل ذلك للحفاظ على ديناميكية جملة الاستعلام نجد انه نحتاج لمتغير اخر يعلمنا ان تم إضافة جملة مقارنة أو لأ لأنه أول جملة فقط لا تسبقها كلمة and او or كما قلنا حسب النظام و يمكنكم المقارنة هنا
SQL="SELECT * FROM users where login=' " & loginName& " ' " SQL="SELECT * FROM users where login=' " & loginName& " ' and pass=' "& pass& " ' "
و بالتالي استخدمنا المتغير stat و الذي هو عبارة عن ال status اي حالة المقارنة و تكون قيمته True في حال وجود مقارنة سابقا ..
طبعا يلزمنا بعد اللمسات الأخيرة و هي إضاة جملة تقوم بتحويل stat إلى قيمة True بعد كل إضافة جملة مقارنة لجملة الاستعلام ..
هكذا نكون أنهينا هذه الفكرة الجميلة و التي ستكون تغيرا في نظري أنا لمطوري مواقع الويب من حيث نظرتهم لطريقة كتابة الكود ..
حظا موفقا و أتمنى أن يكون الشرح مناسبا و مفهوما للجميع و ها أنا أرفق مثالا .. و لا تنسونا من الدعاء :)