PDA

View Full Version : جلوگیری از Like تکراری وقتی چند جدول داریم با استفاده از کوکی



bftarane
دوشنبه 07 بهمن 1392, 15:47 عصر
من چند تا جدول دارم مثل
اخبار،
افراد مفوق
و...
که باید در صفحه جزئیات هر خبر و هر مطلب
دکمه لایک رو بزارم
کاری که کردم این بوده
که با کلیک روی دکمه لایک
تست می کنه آیا یه کوکی به اسم جدولم وجود داره یا نه
اگه نداشت ایجاد میشه و آی دی خبر توش درج میشه
مثلاً 1
اگه کوکی وجود داشته باشه
چک می کنه ببینه آیا id در کوکی وجود داره یا نه
اگه وجود داشت پیغام میده شما قبلاً لایک کردید این خبر یا مطلب رو
و اگه وجود نداشت id رو به id های قبلی اضافه می کنه

یعنی به ازای فرضاً 4 جدول 4 کوکی ساخته میشه
و در هر کوکی هم id هایی که کاربر اونا رو لایک کرده ذخیره میشه

حالا می خواستم بدونم آیا سناریوی بهتری به نظرتون می رسه؟
ممنون می شم همفکری کنید
اینم کدهای تا اینجای کار

DALBase DBase = new DALBase();
protected void Page_Load(object sender, EventArgs e)
{

}
//protected void btn_like_Click(object sender, EventArgs e)
//{

//}
public static bool Exists(string key, string[] keylist)
{
foreach (string item in keylist)
if (key == item)
return true;
return false;
}

protected void ImageButton1_Click(object sender, ImageClickEventArgs e)
{
if (Request.Cookies["MyCookieName"] != null)
{
string MyCookieValue = Request.Cookies["MyCookieName"].Value;
string[] arr = MyCookieValue.Split(',');
bool isExist = Exists(Request.QueryString["ID"], arr);
string NewMyCookieValue = MyCookieValue;
if (isExist)
{
Page.ClientScript.RegisterStartupScript(GetType(), "Javascript", "<script>alert('You like this subject one time')</script>");
}
else
{
//string expire = Response.Cookies["MyCookieName"].Expires.ToString();
//Response.Cookies["MyCookieName"].Value = "new";
//Response.Cookies["MyCookieName"].Expires =Convert.ToDateTime( expire);
HttpCookie aCookie;
aCookie = new HttpCookie("MyCookieName");
aCookie.Expires = DateTime.Now.AddDays(-1);
Response.Cookies.Add(aCookie);


HttpCookie MyGreatCookie = new HttpCookie("MyCookieName");
NewMyCookieValue += "," + Request.QueryString["ID"];
MyGreatCookie.Value = NewMyCookieValue;
MyGreatCookie.Expires = DateTime.Now.AddDays(7);
Response.Cookies.Add(MyGreatCookie);

DBase.ExecuteNoneQuery(System.Data.CommandType.Tex t, "update Table1 set Likes = Likes+1 where ID=@ID", new OleDbParameter[]{
new OleDbParameter("@ID",Request.QueryString["ID"])
});
}
}
else
{
HttpCookie MyGreatCookie = new HttpCookie("MyCookieName");

MyGreatCookie.Value = Request.QueryString["ID"];
MyGreatCookie.Expires = DateTime.Now.AddDays(7);
Response.Cookies.Add(MyGreatCookie);


DBase.ExecuteNoneQuery(System.Data.CommandType.Tex t, "update Table1 set Likes = Likes+1 where ID=@ID", new OleDbParameter[]{
new OleDbParameter("@ID",Request.QueryString["ID"])
});
}

GetLikes();

}
public void GetLikes()
{
OleDbDataReader dr = DBase.ExecuteReader(System.Data.CommandType.Text, "select Likes from Table1 where ID=@ID", new OleDbParameter[]{
new OleDbParameter("ID",Request.QueryString["ID"])
});
if (dr.Read())
{
Label1.Text = dr["Likes"].ToString();
}
}

bftarane
سه شنبه 08 بهمن 1392, 08:43 صبح
خوب یه راه دیگه اینه که
به ازای هر جدول یه جدول دیگه به اسم لایک درست کنم و با کلیک دکمه لایک اگه کوکی در سیستم کاربر موجود نبود یه کوکی به اسم جدول در سیستم کاربر ذخیره بشه و در این کوکی هم یه رشته تصادفی ذخیره بشه
بعد این رشته تصادفی، و id مطلبی که کاربر براش لایک زده در جدول لایک ثبت بشه
اگر هم این کوکی از قبل موجود بود رشته تصادفی و id رو از کوکی بخونیم و یه سلکت به صورت زیر بزنیم

select count(*) from tbl_like where id=@id and randomstring=@randomstring
و اگه نتیجه سلکت حاکی از این بود که کاربر داره دوباره به یه مطلب رأی میده از رأیش جلوگیری کنیم.

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

AmirRezanezhad
سه شنبه 08 بهمن 1392, 09:05 صبح
سلام ، به نظر من روش 2 خیلی خیلی بهتره ..

VRAnonymous
سه شنبه 08 بهمن 1392, 11:10 صبح
من خودم به ازای هر سطر یه کوکی درست کردم

cookiename=myWebsiteName+myUniqueId

اما چرا select اضافی میفرستی واسه دیتابیس!!
موقع ItemDataBound چرا چک نمیکنی اگه کوکی بود کنترل لایک disable شه!!

bftarane
سه شنبه 08 بهمن 1392, 12:08 عصر
من خودم به ازای هر سطر یه کوکی درست کردم

cookiename=myWebsiteName+myUniqueIdمنظورتو از هر سطر چیه؟ آخه تعداد محدودی کوکی میشه ذخیره کرد در سیستم کاربر (شنیدم 50 تا).
شاید مورد شما تعداد سطور محدود بوده ولی من تعداد مطالبم خیلی ممکنه زیاد بشه.

اما چرا select اضافی میفرستی واسه دیتابیس!!
موقع ItemDataBound چرا چک نمیکنی اگه کوکی بود کنترل لایک disable شه!! این ایده خوبیه به نظرم.

راستی شما تاریخ انقضا رو چی ست کردین؟ دلیل این که این رو پرسیدم اینه که اگه تاریخ انقضای فرضاً 1 هفته ست کرده باشیم، از یک کامپیوتر فرضاً 5 نفر بخوان رأی بدن فقط نفر اول می تونه رأی بده مگر اینکه یه هفته بگذره
ولی اگه تاریخ انقضا ندیم تاریخ انقضا مقدار at the end of session میگیره که حالا نمی دونم اون زمانش چقدره ولی احتمالاً مدت کوتاهی بعد از اینکه کاربر صفحه رو بست.

نظرتون در این مورد چیه؟

VRAnonymous
سه شنبه 08 بهمن 1392, 13:04 عصر
تعداد کوکی محدودیت نداره
الان خودم شک کردم یه مثال 200 تایی ثبت کردم

برای ذخیره کردن هم موقعی که طرف لایک کرد مقدارشو ذخیره کنید.موقع ItemDatabound هم چک کنید ببینید آیا همچین مقداری هست یا نه

تاریخ انقضا رو معمولا سه ماهه(یک فصل) تنظیم میکنم.فرض هم بر این هست هر مرورگر یک کاربر هست.اما اگه براتون تغییر در نتیجه لایک خیلی مهمه میتونید بر حسب IP هم شناسایی و جلوگیری انجام بدین

bftarane
سه شنبه 08 بهمن 1392, 13:31 عصر
عجیبه
این مطالب در لینک زیر نوشته شده
Microsoft Internet Explorer complies with the following RFC 2109 recommended minimum limitations:

at least 300 cookies
at least 4096 bytes per cookie (as measured by the size of the characters that comprise the cookie non-terminal in the syntax description of the Set-Cookie header)
at least 20 cookies per unique host or domain name

برای مرورگرهای دیگه هم در این لینک توضیحاتی داده
http://webdesign.about.com/od/cookies/f/cookies-per-domain-limit.htm
ولی من خودم تست نکردم

میتونید بر حسب IP هم شناسایی و جلوگیری انجام بدین
این قضیه Ip که بر اساس جستجویی که قبلاً انجام داده بودم به این نتیجه رسیدم که Ipها به طور مداوم در حال تغییر هستند نمی شه اعتماد کرد بهشون.

VRAnonymous
سه شنبه 08 بهمن 1392, 13:40 عصر
روش دیگه ای هم هست با این توضیحات
صحبت شما درست بود یه محدودیتی با توجه به حافظه هرکدام از مرورگرها هست.حالا اگر بخوایم کار و بدون محدودیت ببندیم :
می تونید به هر کاربر یک uniqeId بدین و اونو توی کوکی ذخیره کنید
حالا اونو با هر کدوم از newsId هایی که لایک کرده کاربر توی یه جدول ذخیره کنید

فقط موقع چک کردن اینکه کدوم سطرها توسط کاربر لایک شده سعی کنید همه رو واکشی کنید توی RAM تا هم سرعت بره بالا هم بار رو از روی DBMS وردارید
تو همچین شرایطی تاریخ انقضای کوکی رو بالا بزنید