PDA

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



General-Xenon
جمعه 25 مرداد 1392, 01:37 صبح
سلام . دیدم چند تا از بچه ها در ساخت جستجو در سایتشون مشکل دارن . گفتم این تاپیک رو ایجاد کنم و یک مثالی در این رابطه بزنیم تا مشکلات بر طرف بشه ...

ببینید پروژه ما دارای بخش های زیر هست :
-----------------------------------------------
User Control جهت استفاده در هر بخشی که لازمه ، مثل Master Page یا نه فقط در یک صفحه از سایت
Search.aspx برای نمایش اطلاعات پیدا شده که رکورد ها به صفحات مورد نظر لینک میشن
-----------------------------------------------
خب بریم برای ساخت User Control به نام : SearchControl
TextBox + Button + CSS Style

<%@ Control Language="C#‎‎‎" AutoEventWireup="true" CodeFile="SearchControl.ascx.cs" Inherits="Barnamenevis.SearchControl"%>

<script runat="server">

</script>

<div class="SearchBox">
<div style="background-color:#FFF;">
<asp:TextBox CssClass="txt" runat="server" ID="TXTSearch" ValidationGroup="search"></asp:TextBox>
<asp:Button CssClass="btn" runat="server" ID="BTNSearch" Text="جستجو" OnClick="BTNSearch_Click" ValidationGroup="search" />
<asp:RequiredFieldValidator ValidateRequestMode="Enabled" ControlToValidate="TXTSearch" Display="Dynamic" runat="server" ID="RFVSearch" ValidationGroup="search" ErrorMessage="ورود اطلاعات الزامی میباشد" CssClass="validator"></asp:RequiredFieldValidator>
</div>
</div>
<style>
.SearchBox { display: inline-block; padding: 20px; background-color: #EFEFEF; border: 10px solid #DDD; font: normal 8pt 'tahoma'; direction: rtl; }
.SearchBox .txt { border: 0px; background-color: transparent; margin: 0px; padding: 8px; margin: 0px; font: normal 8pt 'tahoma'; color: #ff6a00; }
.SearchBox .btn { border: 0px; background-color: transparent; margin: 0px; padding: 8px; font: normal 8pt 'tahoma'; }
.SearchBox .btn:hover { background-color: #333; color: #FFF; }
.SearchBox .validator { display:inline-block; padding:8px; color:#0094ff; }
</style>


using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace Barnamenevis
{
public partial class SearchControl : System.Web.UI.UserControl
{
protected void BTNSearch_Click(object sender, EventArgs e)
{

string _Query = Server.HtmlEncode(TXTSearch.Text);
// Shoma Mitoonid Kalamate Vared Shodaro Encrypt Konid
Response.Redirect("search.aspx?q=" + _Query);
}
}
}


بعد از ساخت UserControl اون رو به هر جا که لازمه اضافه کنید ...

حالا بریم سر کار اصلی یعنی Search.aspx :
با استفاده از Repeater من قصد دارم تا رکورد ها رو به صفحات خاص حودش لینک کنم و در نهایت عناوین جستجو شده رو با یک رنگ دیگه متفاوت کنم

این کد صفحه :

<%@ Page Language="C#‎‎‎" AutoEventWireup="true" CodeFile="Search.aspx.cs" Inherits="Barnamenevis.Search" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div style="direction:rtl; font:normal 8pt 'tahoma';">
<asp:Repeater runat="server" ID="rptSearch">
<ItemTemplate>
<div class="found"><a class="Link" href="<%# Eval("Link") %>"><%# Eval("name") %></a><br />
<span><%# Eval("DESC") %></span></div>
</ItemTemplate>
</asp:Repeater>
</div>
<style>
.Link { text-decoration:none; font:bold 9pt 'tahoma'; }
.found { padding:5px; background-color:#EFEFEF; border-bottom:1px dashed #628fce; }
.selected { background-color:#ff6a00; color:#FFF;}
</style>
</form>
</body>
</html>




using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data;
using System.Data.SqlClient;

namespace Barnamenevis
{
public partial class Search : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
System.Data.DataTable dtResult = new System.Data.DataTable();
dtResult.Columns.Add(new System.Data.DataColumn() { ColumnName = "ID" });
dtResult.Columns.Add(new System.Data.DataColumn() { ColumnName = "Link" });
dtResult.Columns.Add(new System.Data.DataColumn() { ColumnName = "Name" });
dtResult.Columns.Add(new System.Data.DataColumn() { ColumnName = "Desc" });
try
{
string _SearchQuery = "";
if (Request.QueryString["q"] != null) _SearchQuery = Request.QueryString["q"].ToString();

//================================================== ============
// baraye Jolo Giri az Hack va Hamalate XSS|SQL INJECTION
//
string[] inj = new string[] { ";", "'", "<", ">", "+", "\"" };
foreach (string i in inj) { _SearchQuery = _SearchQuery.Replace(i, ""); }
//================================================== ============
// bargharari Ertebat ba bank
SqlConnection _cn = new SqlConnection(System.Web.Configuration.WebConfigur ationManager.ConnectionStrings["CN"].ConnectionString);
// Query ha baraye Jostejo dar bank
// 3 Table > 3 SELECT
// albate agar be ham marboot shodan mitonid az Inner Join Braye Kamtar kardane Hajme Query Estefade konid
SqlDataAdapter _da = new SqlDataAdapter();
_da.SelectCommand = new SqlCommand(
"SELECT * FROM TB_AGAHI WHERE [AdDescription] LIKE '%" + _SearchQuery + "%';" +
"SELECT * FROM TB_POST WHERE [postDescription] LIKE '%" + _SearchQuery + "%';" +
"SELECT * FROM TB_AKHBAR WHERE [Description] LIKE '%" + _SearchQuery + "%';", _cn);
DataSet _ds = new DataSet();
// Aghaze Jostejo va daryafte Data haye Avalie
_da.Fill(_ds);
// Shokhm Zadan dar Jadavel va joda kardan va arayeshe Dade Ha
int _counter = 0;
foreach (DataTable dt in _ds.Tables)
{
// Shomareshgare Jadavel
_counter++;
// agar Chizi peyda nakard bere jadvale badi

if (dt.Rows.Count > 0)
{
//jostejo va arayeshe dade dar Radif haye Peyda shode
foreach (DataRow dr in dt.Rows)
{
// ------------------------------------------
// Deghat konid shoma be harja ke deleton mikhad mitonid befrestid KArbareton ro ..
// ------------------------------------------
// man be onvane mesal bana be noe Data Ferestadam be safahate Morede nazar ...
// shoma mitoonid hameye in link haro be 1 page befrestid albate ba estefade az 2 Query String
// ------------------------------------------
switch (_counter)
{
// Jadvale Agahi ha > mortabet ba Safheye Agahi ha ke man ono dige dorostesh nakardam be ohdeye khodeton
case 1:
dtResult.Rows.Add(dr["ID"].ToString(), "./agahi.aspx?q=" + dr["ID"].ToString(),
dr["NAME"].ToString().Replace(_SearchQuery, "<span class=\"selected\">" + _SearchQuery + "</span>"),
dr["AdDescription"].ToString().Replace(_SearchQuery, "<span class=\"selected\">" + _SearchQuery + "</span>"));
break;
// Jadvale Post ha > mortabet ba Safheye post ha ke man ono dige dorostesh nakardam be ohdeye khodeton
case 2:
dtResult.Rows.Add(dr["ID"].ToString(), "./tb_post.aspx?q=" + dr["ID"].ToString(),
dr["NAME"].ToString().Replace(_SearchQuery, "<span class=\"selected\">" + _SearchQuery + "</span>"),
dr["postDescription"].ToString().Replace(_SearchQuery, "<span class=\"selected\">" + _SearchQuery + "</span>"));
break;
// Jadvale akhbar ha > mortabet ba Safheye akhbar ha ke man ono dige dorostesh nakardam be ohdeye khodeton
case 3:
dtResult.Rows.Add(dr["ID"].ToString(), "./tb_akhbar.aspx?q=" + dr["ID"].ToString(),
dr["NAME"].ToString().Replace(_SearchQuery, "<span class=\"selected\">" + _SearchQuery + "</span>"),
dr["Description"].ToString().Replace(_SearchQuery, "<span class=\"selected\">" + _SearchQuery + "</span>"));
break;
}
}
}
}
}
catch
{
// Dar Soorate har Gone khata dar dastoorat nabayad neshon bede
dtResult.Rows.Add("1", "#","عدم نمایش اطلاعات", "عدم نمایش اطلاعات");
}
finally
{
// Dar nahayat Etesal be Repeater ya hala harchi ke mikhayn bahash namayesh bedin
rptSearch.DataSource = dtResult;
rptSearch.DataBind();
}
}
}
}


موفق باشید . بانک رو هم Script کردم . برای تست هم عبارات a,a1,a12,b1,c1 رو جستجو کنید.. البته برای اطلاعاتی که من در این بانک قرار دادم برای تست ..109163109164109165

okpnz1
جمعه 25 مرداد 1392, 14:56 عصر
واقعا ممنون از آموزشتون خیلی مشکلم بر طرف شد ولی اگه بخوام با استفاده از جنتا فیلد از یک جدول سرچ کنم باید جیکار کنم؟

General-Xenon
جمعه 25 مرداد 1392, 17:00 عصر
واقعا ممنون از آموزشتون خیلی مشکلم بر طرف شد ولی اگه بخوام با استفاده از جنتا فیلد از یک جدول سرچ کنم باید جیکار کنم؟

سلام . برای اینکه بین چند فیلد بتونی سرچ کنی باید از OR بین شروط استفاده کنی . مثال روی Database خودم :
select * from tb_post where name like '%a%' or PostDescription like '%a%'
به SQL میگی که یا در این فیلد باشه یا در اون فیلد و یا در هر فیلدی که دوست داری باشه رو برات بیاره... با استفاده از OR
موفق باشی

ali_mnkt
جمعه 25 مرداد 1392, 18:26 عصر
109193سلام
من فایل ها رو download کردم ولی خطای زیر رو داره !!!!!!!!!!!!
چطور باید برطرفش کنم ؟

General-Xenon
جمعه 25 مرداد 1392, 18:57 عصر
109193سلام
من فایل ها رو download کردم ولی خطای زیر رو داره !!!!!!!!!!!!
چطور باید برطرفش کنم ؟

سلام دوست من ، فایل ها مشکلی نداره . شاید بخاطر وجود RequiredFieldValidator در UserControl باشه . برش دار از User Control ببین درست میشه ؟

okpnz1
جمعه 25 مرداد 1392, 19:16 عصر
مرسیییییییییییییییییییییی ییییییییییییی
واقعا ممنون خیلی وقت بود دنبالش بودم درست شد ممنوووووووووووووووووووووو وووون

okpnz1
جمعه 25 مرداد 1392, 19:43 عصر
شرمنده این همه سوال می پرسم
من الان عدد که سرج می کنم میاره
ولی کلمه فارسی نمیاره حرف N ام گذاشتم ولی فایده نکرد

General-Xenon
جمعه 25 مرداد 1392, 20:10 عصر
شرمنده این همه سوال می پرسم
من الان عدد که سرج می کنم میاره
ولی کلمه فارسی نمیاره حرف N ام گذاشتم ولی فایده نکرد

Command چی زدی ؟
مثال : select * from TB_POST where [postdescription] like N'%س%'

okpnz1
جمعه 25 مرداد 1392, 20:34 عصر
Command چی زدی ؟
مثال : select * from TB_POST where [postdescription] like N'%س%'
"SELECT * FROM maneger WHERE [post] like N'%Search Query%' OR [text] LIKE '%" + _SearchQuery + "%';"

General-Xenon
جمعه 25 مرداد 1392, 21:12 عصر
"SELECT * FROM maneger WHERE [post] like N'%Search Query%' OR [text] LIKE '%" + _SearchQuery + "%';"

"SELECT * FROM maneger WHERE [post] like N'%" + _SearchQuery + "%' OR [text] LIKE N'%" + _SearchQuery + "%';"

okpnz1
جمعه 25 مرداد 1392, 21:36 عصر
مرسی درست شد