سلام وقتتون بخیر
من برای هر مطلب توی دیتابیس یک فیلد like دارم که از نوع int هست و عدد پیشفرض 1 رو داره
برای هر مطلب هم توی سایت یک button برای like دارم
میخوام هر ip یک بار که روی button کلیک میکنه عددی که در دیتابیس هست با 1 جمع بشه و دیگه هم نتونه کلیک کنه با اون ip !
مقاله لایک و دیسلایک که توی سایت موجود بود رو خوندم اون روش برای کاری که میخوام بکنم کارآمد نبود!
چطور باید این کار رو بکنم؟
باید لایک رو در جد.ل جدا به همراه IP شخص ذخیره کنید تا بتونید کنترل کنید این شخص قبلا لایک کرده یا خیر
درواقع من باید فیلد like که توی جدول پست ها موجود هست رو حذف کنم
یک جدول به شکل زیر بسازم:
هنگام فراخوانی کردن از طریق post_id به مطالب متصل کنم!
درسته؟
و اینکه فیلد ip رو باید از چه نوعی بگیرم؟ nvarchar یا چیز دیگه؟
بله
ازنوع varchar
استاد برای به دست آوردن ip من کلاس زیر رو به پروژه اضافه کردم:
using System; using System.Collections.Generic; using System.Data; using System.Linq; using System.Net; using System.Web; using System.Xml; /// <summary> /// Summary description for IPHostGenerator /// </summary> public class IPHostGenerator { internal string GetCurrentPageUrl() { return HttpContext.Current.Request.Url.AbsoluteUri; } internal string GetVisitorDetails() { string varIPAddress = string.Empty; string varVisitorCountry = string.Empty; string varIpAddress = string.Empty; varIpAddress = HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"]; if (string.IsNullOrEmpty(varIpAddress)) { if (HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"] != null) { varIpAddress = HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"]; } } //varIPAddress = (System.Web.UI.Page)Request.ServerVariables["HTTP_X_FORWARDED_FOR"]; if (varIPAddress == "" || varIPAddress == null) { if (HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"] != null) { varIpAddress = HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"]; } } //varIPAddress = Request.ServerVariables["REMOTE_ADDR"]; return varIpAddress; } internal DataTable GetLocation(string varIPAddress) { WebRequest varWebRequest = WebRequest.Create("http://freegeoip.net/xml/" + varIPAddress); WebProxy px = new WebProxy("http://freegeoip.net/xml/" + varIPAddress, true); varWebRequest.Proxy = px; varWebRequest.Timeout = 2000; try { WebResponse rep = varWebRequest.GetResponse(); XmlTextReader xtr = new XmlTextReader(rep.GetResponseStream()); DataSet ds = new DataSet(); ds.ReadXml(xtr); return ds.Tables[0]; } catch { return null; } } internal string GetMachineNameUsingIPAddress(string varIpAdress) { string machineName = string.Empty; try { IPHostEntry hostEntry = Dns.GetHostEntry(varIpAdress); machineName = hostEntry.HostName; } catch (Exception ex) { // Machine not found... } return machineName; } }
این هم محتوای رویداد page_load هست:
protected void Page_Load(object sender, EventArgs e) { string strHostName = Dns.GetHostName(); IPHostEntry ipEntry = Dns.GetHostEntry(strHostName); lbl1.Text = Convert.ToString(ipEntry.AddressList[1]); string IPAdd = string.Empty; IPAdd = Request.ServerVariables["HTTP_X_FORWARDED_FOR"]; IPHostGenerator ip = new IPHostGenerator(); }
توی هاست آپلود کردم این هم لینک :
http://www.k1inusa.com/Default2.aspx
خودتون ببینید ip رو چطوری نشون میده!!!!!
از کد زیر استفاده کنید
private string GetUserIP() { string ipList = Request.ServerVariables["HTTP_X_FORWARDED_FOR"]; if (!string.IsNullOrEmpty(ipList)) { return ipList.Split(',')[0]; } return Request.ServerVariables["REMOTE_ADDR"]; }
استاد طبق یه مقاله دیگه که نوشته بودید با کد زیر به دست آوردم ip رو:
Label1.Text = (Request.ServerVariables["HTTP_X_FORWARDED_FOR"] ?? Request.ServerVariables["REMOTE_ADDR"]).Split(',')[0].Trim();
حالا چطور باید با کلیک روی button1 درواقع محتوای فیلد دیتابیس رو +1 کنم؟
و اینکه بعد از ثبت چطور تشخیص بدم که این ip قبلا توی دیتابیس موجود بوده و دیگه نمیتونه لایک کنه؟
نباید + 1 کنید
باید رکورد جدید درج کنید و سپس با Count تعداد لایک را بدست بیارید
بنابراین دستور سلکت به این صورت میشه درسته؟
select count(post_id) as post_id from tbl_content
با چه کدی باید شرط کنم که ip تکراری نباشه؟
کوچری چک کردن ip به تعداد مربوط نیست و باید در زمان زدن لایک اجرا بشه و اگر از قبل بود اعمال نشه
منظورتون رو متوجه نشدم استاد
یعنی باید تاریخ و زمانی که کاربر لایک میکنه رو هم ذخیره کنم توی بانک؟
نه دوست من
شما هنوز منطق رو نمیدونید
همون ip کفایت میکنه و برای اینکه کاربر قبلا از پست رو لایک کرده میتونید با یک کوئری چک کنید
درواقع استاد من منظورم از اینکه گفتم با چه کدی باید شرط کنم که ip تکراری نباشه، این بود که کوئریش یا کدش رو چطوری باید بنویسم :(
این لینک رو ببینید انواع شرط در کوئری رو توضیح داده
استاد شرمندم سوالاتم خیلی شد توی این تاپیک
یعنی میفرمایید کاربر میتونه 10 بار هم لایک کنه اما موقع سلکت کردن باید از هر ip فقط یکیشو بخونم؟
نه نمیتونه
شما هر بار قبل از قبل از لایک چک میکنید که این کاربر قبلا این مطلب رو لایک نکرده باشه و اگر کرده بود ثبت نمیشه
اینجوری فقط یکبار میتونه
string.format("insert into tbl_like(like_number,post_id,ip) values(1,{0},'{1}') where ip IN ip",request.querystring["id"],lbl1.text)
به این صورت درست نوشتم استاد؟
هیچ کاربری تا کنون از این پست تشکر نکرده است
با ما تماس بگیرید تا در این مسیر همراهتان باشیم :)