PDA

View Full Version : نظر سنجی سایت



amir_T_2008
سه شنبه 16 دی 1393, 14:12 عصر
سلام دوستان

من یه سیستم نظرسنجی دارم که به درستی کار میکنه اما مشکلش اینه که هر کاربر میتونه هر چند باری که میخواد رای بده حالا من برای حل این مشکل وقتی کاربر رای میده ip اون طرف تو دیتابیس ذخیره میکنم حالا چطوری میشه وقتی کاربر روی button کلیک میکنه بیاد چک کنه اگر اون ip توی دیتابیس بود اجازه ثبت نظر نده و برعکس


ممنون میشم با کد راهنمایی کنید چون خودم خیلی سرچ کردم

پیام حیاتی
سه شنبه 16 دی 1393, 15:01 عصر
سلام
ip رو در یک فیلد از جدول بانک ذخیره کنید ، رویداد کلیک ابتدا بررسی کند مقدار ip در مقادیر ثبت شده وجود دارد یا خیر ، اگر ندارد اجازه ثبت و اگر دارد پیغام مناسب نمایش دهد(شما قبلا در این رای گیری شرکت کرده اید!).
http://www.w3schools.com/sql/sql_select.asp

keiv@n
سه شنبه 16 دی 1393, 15:34 عصر
زیرو بخون


مرسی

amir_T_2008
سه شنبه 16 دی 1393, 15:36 عصر
سلام
ip رو در یک فیلد از جدول بانک ذخیره کنید ، رویداد کلیک ابتدا بررسی کند مقدار ip در مقادیر ثبت شده وجود دارد یا خیر ، اگر ندارد اجازه ثبت و اگر دارد پیغام مناسب نمایش دهد(شما قبلا در این رای گیری شرکت کرده اید!).
http://www.w3schools.com/sql/sql_select.asp

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

amir_T_2008
سه شنبه 16 دی 1393, 16:35 عصر
اگر شما آی پی کاربرارو به صورت کلید داخل پایگاه داده بزاری می تونی با یه try catch بسیار ساده امکان چندین بار لایک شدن یک کامنتو از کاربران بگیری چون پایگاه داده هیچ وقت نمی زاره دوتا کلید همسان داخل جدول باشه از این خاصیت سوء استفاده کن و داخل try عملیات افزودن لایک رو انجام بده و داخل catch بگو شما قبلا نظر دادین

1-ساخت پایگاه داده ساده برای ذخیره سازی آی پی کاربران ، user_Ip باید کلید باشه

2- یه کنترل sqldatasource میزاری تو صفحت برای اتصال به پایگاه داده :

<asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:mydbConnectionString %>" SelectCommand="SELECT [user_Ip] FROM [user_info]" InsertCommand="INSERT INTO user_info(user_Ip) VALUES (@user_ip)" DeleteCommand="DELETE FROM user_info WHERE (user_Ip = @user_ip)">
<DeleteParameters>
<asp:Parameter Name="user_ip" />
</DeleteParameters>
<InsertParameters>
<asp:SessionParameter Name="user_ip" SessionField="user_ip" Type="String" />
</InsertParameters>
</asp:SqlDataSource>

3-میای داخل تابع page_load آی پی کاربر رو داخل یک session میریزی :

protected void Page_Load(object sender, EventArgs e)
{
Session["user_ip"] = HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"];
}
4- یه دکمه لایک میسازی و تو رخداد کلیکش تابع ()insert از کنترل sqldatasource رو فرا خوانی می کنی :

protected void Button1_Click(object sender, EventArgs e)
{
try {
SqlDataSource1.Insert();
// کد :به پایگاه داده مطالب متصل شو و یک واحد به فیلد لایک شده اضافه کن
}
catch(Exception ex){
Label1.Text = "شما قبلا در سایت نظر داده اید";
}
}
واسه نمایش تعداد دفعات لایک هر مطلب هم می تونی داخل پایگاه داده مطالبت یه فیلد اضافه کنی با عنوان تعداد لایک شده و وقتی کاربر دکمه لایک رو زد به اون پایگاه دادت متصل شه به فیلد لایک شده یک واحد اضافه کنی :



protected void Button1_Click(object sender, EventArgs e)
{
try {
SqlDataSource1.Insert();
// کد :به پایگاه داده مطالب متصل شو و یک واحد به فیلد لایک شده اضافه کن
}


البته این چیزی که الان گفتم واسه لایک کردن فقط یک مطلب کاربرد داره
در ادامه فکرامو کنم جوابو کامل تر می کنم

حالا اگر کلید جدولم id باشه و یک فیلد برای ip باشه ممکن نیست دیگه از این طریق ؟

ممنون میشم کاملتر کنید

keiv@n
سه شنبه 16 دی 1393, 17:15 عصر
اگر شما آی پی کاربرارو به صورت کلید داخل پایگاه داده بزاری می تونی با یه try catch بسیار ساده امکان چندین بار لایک شدن یک کامنتو از کاربران بگیری چون پایگاه داده هیچ وقت نمی زاره دوتا کلید همسان داخل جدول باشه از این خاصیت سوء استفاده کن و داخل try عملیات افزودن لایک رو انجام بده و داخل catch بگو شما قبلا نظر دادین

1-ساخت پایگاه داده ساده برای ذخیره سازی آی پی کاربران ، user_Ip باید کلید باشه و یه فیلد دیگه هم داریم با عنوان content_Id که این فیلد هم از نوع کلید می باشد پس جدولمون دوتا کلید داره (خیلی خوب شد آخ جون)..

2- یه کنترل sqldatasource میزاری تو صفحت برای اتصال به پایگاه داده :

<asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:mydbConnectionString %>" InsertCommand="INSERT INTO user_info(user_Ip, content_Ip) VALUES (@user_ip,'1')" SelectCommand="SELECT [user_Ip], [content_Ip] FROM [user_info]" DeleteCommand="DELETE FROM user_info ">
<InsertParameters>
<asp:SessionParameter Name="user_ip" Type="String" SessionField="user_ip" />
</InsertParameters>
</asp:SqlDataSource></asp:SqlDataSource>
خوب چه اتفاقی افتاده ؟
اگر به کد های داخل sqldatasource نگاه کنی قسمت insertcommand آرگومان اول معرف session مون هست و آرگومان دوم مربوط به شماره مطلب یا خبر می باشد که من این شماره رو 1 در نظر گرفتم .
در داخل پایگاه داده من دو فیلد کلید دارم پس نمی توانم دو رکورد داخل جدول داشته باشم که هر دو فیلدشان یکسان باشند این مزیت موجب شده تا کاربر x بتونه چندین مطلب رو فقط یک بار لایک کنه مثل این حالت :
x,1
x,2
x,3
خوب سه رکورد بالا یعنی کاربر x مطلب 1 و 2 و 3 رو لایک کرده بدیهی است که کاربر x دیگه اجازه لایک کردن مطلب 1 رو برای دومین مرتبه نداره چرا که داخل پایگاه داده فقط مجاز هستیم یک x,1 داشته باشیم !!!
فهمیدین الان ؟ خودمم نفهمیدم چی گفتم :بامزه::بامزه: ولی هرچی بود باحال ود
3-میای داخل تابع page_load آی پی کاربر رو داخل یک session میریزی :

protected void Page_Load(object sender, EventArgs e)
{
Session["user_ip"] = HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"];
}
4- یه دکمه لایک میسازی و تو رخداد کلیکش تابع ()insert از کنترل sqldatasource رو فرا خوانی می کنی :

protected void Button1_Click(object sender, EventArgs e)
{
try {
SqlDataSource1.Insert();
// کد :به پایگاه داده مطالب متصل شو و یک واحد به فیلد لایک شده اضافه کن
}
catch(Exception ex){
Label1.Text = "شما قبلا در سایت نظر داده اید";
}
}
واسه نمایش تعداد دفعات لایک هر مطلب هم می تونی داخل پایگاه داده مطالبت یه فیلد اضافه کنی با عنوان تعداد لایک شده و وقتی کاربر دکمه لایک رو زد به اون پایگاه دادت متصل شه به فیلد لایک شده یک واحد اضافه کنی :



protected void Button1_Click(object sender, EventArgs e)
{
try {
SqlDataSource1.Insert();
// کد :به پایگاه داده مطالب متصل شو و یک واحد به فیلد لایک شده اضافه کن
}

در پایان خواستم شکل برنامه رو بهت نشون بدم اگه نگاه کرده باشی 4 تا button لایک داریم اگر button1 فشار داده بشه آرگومان دوم insertcommand داخل sqldatasource باید یک ثبت بشه و اگر button2 فشار داده بشه آرگومان دوم تابع insertcommand داخل sqldatasource باید دو در نظر گرفته شه و الی چهارمی ... بجای این ضایع بازیا پیشنهاد میکنم با خلاقیت خودت یه طور اندیشمندانه آرگومانارو متناسب با هر کدوم از button ها مقدار دهی کنی....

textbox های داخل تصویر واسه گرفتن شماره مطلب یا همون فیلد content_id (اشتباها content_Ip گزاشتم چیز خاصی نیس همون content_Id هست) پایگاه دادمون هست ....

amir_T_2008
سه شنبه 16 دی 1393, 18:42 عصر
اگر شما آی پی کاربرارو به صورت کلید داخل پایگاه داده بزاری می تونی با یه try catch بسیار ساده امکان چندین بار لایک شدن یک کامنتو از کاربران بگیری چون پایگاه داده هیچ وقت نمی زاره دوتا کلید همسان داخل جدول باشه از این خاصیت سوء استفاده کن و داخل try عملیات افزودن لایک رو انجام بده و داخل catch بگو شما قبلا نظر دادین

1-ساخت پایگاه داده ساده برای ذخیره سازی آی پی کاربران ، user_Ip باید کلید باشه و یه فیلد دیگه هم داریم با عنوان content_Id که این فیلد هم از نوع کلید می باشد پس جدولمون دوتا کلید داره (خیلی خوب شد آخ جون)..

2- یه کنترل sqldatasource میزاری تو صفحت برای اتصال به پایگاه داده :

<asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:mydbConnectionString %>" InsertCommand="INSERT INTO user_info(user_Ip, content_Ip) VALUES (@user_ip,'1')" SelectCommand="SELECT [user_Ip], [content_Ip] FROM [user_info]" DeleteCommand="DELETE FROM user_info ">
<InsertParameters>
<asp:SessionParameter Name="user_ip" Type="String" SessionField="user_ip" />
</InsertParameters>
</asp:SqlDataSource></asp:SqlDataSource>
خوب چه اتفاقی افتاده ؟
اگر به کد های داخل sqldatasource نگاه کنی قسمت insertcommand آرگومان اول معرف session مون هست و آرگومان دوم مربوط به شماره مطلب یا خبر می باشد که من این شماره رو 1 در نظر گرفتم .
در داخل پایگاه داده من دو فیلد کلید دارم پس نمی توانم دو رکورد داخل جدول داشته باشم که هر دو فیلدشان یکسان باشند این مزیت موجب شده تا کاربر x بتونه چندین مطلب رو فقط یک بار لایک کنه مثل این حالت :
x,1
x,2
x,3
خوب سه رکورد بالا یعنی کاربر x مطلب 1 و 2 و 3 رو لایک کرده بدیهی است که کاربر x دیگه اجازه لایک کردن مطلب 1 رو برای دومین مرتبه نداره چرا که داخل پایگاه داده فقط مجاز هستیم یک x,1 داشته باشیم !!!
فهمیدین الان ؟ خودمم نفهمیدم چی گفتم :بامزه::بامزه: ولی هرچی بود باحال ود
3-میای داخل تابع page_load آی پی کاربر رو داخل یک session میریزی :

protected void Page_Load(object sender, EventArgs e)
{
Session["user_ip"] = HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"];
}
4- یه دکمه لایک میسازی و تو رخداد کلیکش تابع ()insert از کنترل sqldatasource رو فرا خوانی می کنی :

protected void Button1_Click(object sender, EventArgs e)
{
try {
SqlDataSource1.Insert();
// کد :به پایگاه داده مطالب متصل شو و یک واحد به فیلد لایک شده اضافه کن
}
catch(Exception ex){
Label1.Text = "شما قبلا در سایت نظر داده اید";
}
}
واسه نمایش تعداد دفعات لایک هر مطلب هم می تونی داخل پایگاه داده مطالبت یه فیلد اضافه کنی با عنوان تعداد لایک شده و وقتی کاربر دکمه لایک رو زد به اون پایگاه دادت متصل شه به فیلد لایک شده یک واحد اضافه کنی :



protected void Button1_Click(object sender, EventArgs e)
{
try {
SqlDataSource1.Insert();
// کد :به پایگاه داده مطالب متصل شو و یک واحد به فیلد لایک شده اضافه کن
}

در پایان خواستم شکل برنامه رو بهت نشون بدم اگه نگاه کرده باشی 4 تا button لایک داریم اگر button1 فشار داده بشه آرگومان دوم insertcommand داخل sqldatasource باید یک ثبت بشه و اگر button2 فشار داده بشه آرگومان دوم تابع insertcommand داخل sqldatasource باید دو در نظر گرفته شه و الی چهارمی ... بجای این ضایع بازیا پیشنهاد میکنم با خلاقیت خودت یه طور اندیشمندانه آرگومانارو متناسب با هر کدوم از button ها مقدار دهی کنی....

textbox های داخل تصویر واسه گرفتن شماره مطلب یا همون فیلد content_id (اشتباها content_Ip گزاشتم چیز خاصی نیس همون content_Id هست) پایگاه دادمون هست ....

خیلی ممنون.حتما روش کار میکنم و اگر به مشکل خوردم مزاحم میشم.
در ضمن دوست عزیز شما با چه کدی ip میگیرید؟چون من با کدی که کار میکنم میاد ip ورژن 6 ذخیره میکنه ولی برای شما میاد ورژن 4 ذخیره میکنه

keiv@n
سه شنبه 16 دی 1393, 19:30 عصر
خیلی ممنون.حتما روش کار میکنم و اگر به مشکل خوردم مزاحم میشم.
در ضمن دوست عزیز شما با چه کدی ip میگیرید؟چون من با کدی که کار میکنم میاد ip ورژن 6 ذخیره میکنه ولی برای شما میاد ورژن 4 ذخیره میکنه

توسط دستور HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"] آی پی آدرس هاستی رو گرفتم که به سرور request داده ...

البته نا گفته نماند برای اذیت کردن شما و لایک کردن غیر متعارف مطالب راه های زیادی هست مثل ریست کردن آی پی و غیره

amir_T_2008
سه شنبه 16 دی 1393, 19:45 عصر
توسط دستور HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"] آی پی آدرس هاستی رو گرفتم که به سرور request داده ...

البته نا گفته نماند برای اذیت کردن شما و لایک کردن غیر متعارف مطالب راه های زیادی هست مثل ریست کردن آی پی و غیره

کد کاملشو برای ثبت تو دیتابیس محبت می کنید؟

keiv@n
سه شنبه 16 دی 1393, 20:09 عصر
ثبت داخل دیتابیس توسط دستور SqlDatasource1.Insert() انجام میشه

انجام هر خواسته ای که داشته باشید با مطالبی که گفته شده و یه خورده خلاقیت به راحتی انجام میشه من فقط واسه

نمونه و راهنمایی یک مثال بسیار ساده و ابتدایی واستون آوردم

amir_T_2008
سه شنبه 16 دی 1393, 20:37 عصر
ثبت داخل دیتابیس توسط دستور SqlDatasource1.Insert() انجام میشه

انجام هر خواسته ای که داشته باشید با مطالبی که گفته شده و یه خورده خلاقیت به راحتی انجام میشه من فقط واسه

نمونه و راهنمایی یک مثال بسیار ساده و ابتدایی واستون آوردم

من خودمم از دستور SqlDatasource1.Insert() برای insert استفاده میکنم اما نمیدونم کد





HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"]






چطوری باید پیاده سازی کنم تو SqlDatasource

keiv@n
سه شنبه 16 دی 1393, 20:59 عصر
چون می خوای هویت کاربرت که همون آی پی هست رو به محض ورودش یه جا ذخیره کنی بهترین روش استفاده از session state هست دستور زیر رو به تابع page_load صفحه اضافه کن:

Session["user_ip"] = HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"];

خوب حالا کاربر هر مطلبیو که لایک کنه دو حالت وجود داره :

1- قبلا مطلب توسط این کاربر لایک شده
2-دفعه اول هست که کاربر مطلبو لایک میکنه

اگر 1- اتفاق بیوفته قسمت catch از رخداد click دکمه like اجرا میشه و یه پیغام چاپ میشه که شما قبلا لایک رو انجام دادین و لایکی صورت نمی گیره

اگر 2- اتفاق بیوفته قسمت try از رخداد click دکمه like اجرا میشه و آی پی کاربر به همراه شماره مطلب داخل پایگاه داده ذخیره میشه و یه واحد به شمار لایک های مطلب اضافه میشه...

ذخیره سازی داخل پایگاه داده هم توسط کنترل sqldatasource انجام میشه به صورت کاملا ویزاردی شما InsertCommand رو به همراه پارامترش که از نوع session است میسازی پست قبلیمو نگاه کن کد نویسی sqldatasource هستش...

گرفتین مطلبو ؟

amir_T_2008
چهارشنبه 17 دی 1393, 00:49 صبح
خوب من نمي خوام هركسي وارد ميشه ip ذخيره بشه و ميخوام وقتي روي دكمه زد دخيره بشه

keiv@n
چهارشنبه 17 دی 1393, 01:16 صبح
امیر چرا اینجوری می کنی ؟

طرف تا لایک نزنه که ذخیره نمیشه :عصبانی::عصبانی: دوباره بخون کدارو چی نوشتم

amir_T_2008
چهارشنبه 17 دی 1393, 01:25 صبح
خيلي مخلصيم