مرجع تخصصی برنامه نویسان

انجمن تخصصی برنامه نویسان فارسی زبان

کاربر سایت

moonfa1392

عضویت از 1394/08/17

لایک اینستاگرامی!

  • شنبه 21 اسفند 1395
  • 17:39
تشکر میکنم

سلام وقتتون بخیر

من برای هر مطلب توی دیتابیس یک فیلد like دارم که از نوع int هست و عدد پیشفرض 1 رو داره

برای هر مطلب هم توی سایت یک button برای like دارم

میخوام هر ip یک بار که روی button کلیک میکنه عددی که در دیتابیس هست با 1 جمع بشه و دیگه هم نتونه کلیک کنه با اون ip !

مقاله لایک و دیسلایک که توی سایت موجود بود رو خوندم اون روش برای کاری که میخوام بکنم کارآمد نبود!

چطور باید این کار رو بکنم؟

پاسخ های این پرسش

تعداد پاسخ ها : 16 پاسخ
کاربر سایت

ایمان مدائنی

عضویت از 1392/01/20

  • شنبه 21 اسفند 1395
  • 17:43

باید لایک رو در جد.ل جدا به همراه IP شخص ذخیره کنید تا بتونید کنترل کنید این شخص قبلا لایک کرده یا خیر

کاربر سایت

moonfa1392

عضویت از 1394/08/17

  • شنبه 21 اسفند 1395
  • 17:48

درواقع من باید فیلد like که توی جدول پست ها موجود هست رو حذف کنم

یک جدول به شکل زیر بسازم:

هنگام فراخوانی کردن از طریق post_id به مطالب متصل کنم!

درسته؟

و اینکه فیلد ip رو باید از چه نوعی بگیرم؟ nvarchar یا چیز دیگه؟

کاربر سایت

ایمان مدائنی

عضویت از 1392/01/20

  • شنبه 21 اسفند 1395
  • 17:50

بله

ازنوع varchar

کاربر سایت

moonfa1392

عضویت از 1394/08/17

  • شنبه 21 اسفند 1395
  • 18:08

استاد برای به دست آوردن 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 رو چطوری نشون میده!!!!!

کاربر سایت

ایمان مدائنی

عضویت از 1392/01/20

  • شنبه 21 اسفند 1395
  • 18:10

از کد زیر استفاده کنید

   private string GetUserIP()
    {
        string ipList = Request.ServerVariables["HTTP_X_FORWARDED_FOR"];

        if (!string.IsNullOrEmpty(ipList))
        {
            return ipList.Split(',')[0];
        }

        return Request.ServerVariables["REMOTE_ADDR"];
    }

کاربر سایت

moonfa1392

عضویت از 1394/08/17

  • شنبه 21 اسفند 1395
  • 18:40

استاد طبق یه مقاله دیگه که نوشته بودید با کد زیر به دست آوردم ip رو:

Label1.Text = (Request.ServerVariables["HTTP_X_FORWARDED_FOR"] ?? Request.ServerVariables["REMOTE_ADDR"]).Split(',')[0].Trim();

حالا چطور باید با کلیک روی button1 درواقع محتوای فیلد دیتابیس رو +1 کنم؟

و اینکه بعد از ثبت چطور تشخیص بدم که این ip قبلا توی دیتابیس موجود بوده و دیگه نمیتونه لایک کنه؟

کاربر سایت

ایمان مدائنی

عضویت از 1392/01/20

  • یکشنبه 22 اسفند 1395
  • 00:04

نباید + 1 کنید

باید رکورد جدید درج کنید و سپس با Count تعداد لایک را بدست بیارید

کاربر سایت

moonfa1392

عضویت از 1394/08/17

  • یکشنبه 22 اسفند 1395
  • 00:08

بنابراین دستور سلکت به این صورت میشه درسته؟

select count(post_id) as post_id from tbl_content

با چه کدی باید شرط کنم که ip تکراری نباشه؟

کاربر سایت

ایمان مدائنی

عضویت از 1392/01/20

  • یکشنبه 22 اسفند 1395
  • 09:16

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

کاربر سایت

moonfa1392

عضویت از 1394/08/17

  • یکشنبه 22 اسفند 1395
  • 09:21

منظورتون رو متوجه نشدم استاد

یعنی باید تاریخ و زمانی که کاربر لایک میکنه رو هم ذخیره کنم توی بانک؟

کاربر سایت

ایمان مدائنی

عضویت از 1392/01/20

  • یکشنبه 22 اسفند 1395
  • 09:23

نه دوست من

شما هنوز منطق رو نمیدونید

همون ip کفایت میکنه و برای اینکه کاربر قبلا از پست رو لایک کرده میتونید با یک کوئری چک کنید

کاربر سایت

moonfa1392

عضویت از 1394/08/17

  • یکشنبه 22 اسفند 1395
  • 09:26

درواقع استاد من منظورم از اینکه گفتم با چه کدی باید شرط کنم که ip تکراری نباشه، این بود که کوئریش یا کدش رو چطوری باید بنویسم :(

کاربر سایت

ایمان مدائنی

عضویت از 1392/01/20

  • یکشنبه 22 اسفند 1395
  • 09:28

این لینک رو ببینید انواع شرط در کوئری رو توضیح داده

کاربر سایت

moonfa1392

عضویت از 1394/08/17

  • یکشنبه 22 اسفند 1395
  • 09:33

استاد شرمندم سوالاتم خیلی شد توی این تاپیک

یعنی میفرمایید کاربر میتونه 10 بار هم لایک کنه اما موقع سلکت کردن باید از هر ip فقط یکیشو بخونم؟

کاربر سایت

ایمان مدائنی

عضویت از 1392/01/20

  • یکشنبه 22 اسفند 1395
  • 09:35

نه نمیتونه

شما هر بار قبل از قبل از لایک چک میکنید که این کاربر قبلا این مطلب رو لایک نکرده باشه و اگر کرده بود ثبت نمیشه

اینجوری فقط یکبار میتونه

کاربر سایت

moonfa1392

عضویت از 1394/08/17

  • یکشنبه 22 اسفند 1395
  • 09:45
string.format("insert into tbl_like(like_number,post_id,ip)  values(1,{0},'{1}') where ip IN ip",request.querystring["id"],lbl1.text)

به این صورت درست نوشتم استاد؟

کاربرانی که از این پست تشکر کرده اند

هیچ کاربری تا کنون از این پست تشکر نکرده است

اگر نیاز به یک مشاور در زمینه طراحی سایت ، برنامه نویسی و بازاریابی الکترونیکی دارید

با ما تماس بگیرید تا در این مسیر همراهتان باشیم :)