اذهب إلى المحتوى

السؤال

نشر (معدل)

الكود التالي يظهر عدد الزوار ليوم واحد

يتم تخزين ip الزائر في القاعدة

كيف يمكن اظهار اسم دولة الزائر - فمثلا لو قام زائرين من مصر بزيارة الموقع عشر مرات في اليوم لا يتم تكرار اسم الدولة غير مرة واحدة كذلك لو قام مجموعة زائرين من تونس بالدخول للموقع عدة مرات لا يتم تكرار اسم الدولة الا مرة واحدة مثلا كالتالي؛

بلدان الزوار  ( مصر - الجزائر - السعودية .......الخ )

<?PHP
// التأكد من ان عنوان ip حقيقى 
function getUserIP()
{
if (isset($_SERVER["HTTP_CF_CONNECTING_IP"])) 
{
$_SERVER['REMOTE_ADDR'] = $_SERVER["HTTP_CF_CONNECTING_IP"];
$_SERVER['HTTP_CLIENT_IP'] = $_SERVER["HTTP_CF_CONNECTING_IP"];
}
$client  = @$_SERVER['HTTP_CLIENT_IP'];
$forward = @$_SERVER['HTTP_X_FORWARDED_FOR'];
$remote  = $_SERVER['REMOTE_ADDR'];
if(filter_var($client, FILTER_VALIDATE_IP))
{
$ip = $client;
}
elseif(filter_var($forward, FILTER_VALIDATE_IP))
{
$ip = $forward;
}
else
{
$ip = $remote;
}
return $ip;
}
$user_ip = getUserIP();
?>
<?php
$end_time = date("Y-m-d", strtotime("+1 day"));
$stmt3 = $db->prepare("INSERT INTO totalview VALUES ('$user_ip','$end_time')");  
$stmt3->execute(); 
$stmt3->close();
?>
<?php
// حذف زوار الأمس بعد نهاية اليوم 
$date= date("Y-m-d");
$stmt11= $db->prepare("DELETE from totalview WHERE end_time = ? ");
$stmt11->bind_param('s', $date ); 
$stmt11->execute(); 
$stmt11->close();
?>
<?php
$status_query = "SELECT DISTINCT user_ip FROM totalview ";
$result_query = mysqli_query($db, $status_query);
$count = mysqli_num_rows($result_query);
echo ' زوار اليوم : '.$count.' زائر ';
?>

 

 

تم التعديل في بواسطة Hamada Ahmed

Recommended Posts

  • 1
نشر
بتاريخ 2 ساعات قال Hamada Ahmed:

قمت باضافة للكود لكن بها زيادات اريد الاستغناء عنها


<?php
include ('connect_file.php');
function ip_info($ip = NULL, $purpose = "location", $deep_detect = true)
{
    $output = NULL;
    if (filter_var($ip, FILTER_VALIDATE_IP) === false)
    {
        $ip = $_SERVER["REMOTE_ADDR"];
        if ($deep_detect)
        {
            if (filter_var(@$_SERVER['HTTP_X_FORWARDED_FOR'], FILTER_VALIDATE_IP)) $ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
            if (filter_var(@$_SERVER['HTTP_CLIENT_IP'], FILTER_VALIDATE_IP)) $ip = $_SERVER['HTTP_CLIENT_IP'];
        }
    }
    $purpose    = str_replace(array(
        "name",
        "\n",
        "\t",
        " ",
        "-",
        "_"
    ) , NULL, strtolower(trim($purpose)));
    $support    = array(
        "country",
        "countrycode",
        "state",
        "region",
        "city",
        "location",
        "address"
    );
    $continents = array(
        "AF" => "Africa",
        "AN" => "Antarctica",
        "AS" => "Asia",
        "EU" => "Europe",
        "OC" => "Australia (Oceania)",
        "NA" => "North America",
        "SA" => "South America"
    );
    if (filter_var($ip, FILTER_VALIDATE_IP) && in_array($purpose, $support))
    {
        $ipdat = @json_decode(file_get_contents("http://www.geoplugin.net/json.gp?ip=" . $ip));
        if (@strlen(trim($ipdat->geoplugin_countryCode)) == 2)
        {
            switch ($purpose)
            {
                case "location":
                    $output = array(
                        "city"           => @$ipdat->geoplugin_city,
                        "state"          => @$ipdat->geoplugin_regionName,
                        "country"        => @$ipdat->geoplugin_countryName,
                        "country_code"   => @$ipdat->geoplugin_countryCode,
                        "continent"      => @$continents[strtoupper($ipdat->geoplugin_continentCode) ],
                        "continent_code" => @$ipdat->geoplugin_continentCode
                    );
                break;
                case "address":
                    $address = array(
                        $ipdat->geoplugin_countryName
                    );
                    if (@strlen($ipdat->geoplugin_regionName) >= 1) $address[] = $ipdat->geoplugin_regionName;
                    if (@strlen($ipdat->geoplugin_city) >= 1) $address[] = $ipdat->geoplugin_city;
                    $output = implode(", ", array_reverse($address));
                    break;
                case "city":
                    $output = @$ipdat->geoplugin_city;
                    break;
                case "state":
                    $output = @$ipdat->geoplugin_regionName;
                    break;
                case "region":
                    $output = @$ipdat->geoplugin_regionName;
                    break;
                case "country":
                    $output = @$ipdat->geoplugin_countryName;
                    break;
                case "countrycode":
                    $output = @$ipdat->geoplugin_countryCode;
                    break;
                }
            }
    }
    return $output;
}
?>
<?PHP
// التأكد من ان عنوان ip حقيقى
function getUserIP()
{
    if (isset($_SERVER["HTTP_CF_CONNECTING_IP"]))
    {
        $_SERVER['REMOTE_ADDR'] = $_SERVER["HTTP_CF_CONNECTING_IP"];
        $_SERVER['HTTP_CLIENT_IP'] = $_SERVER["HTTP_CF_CONNECTING_IP"];
    }
    $client  = @$_SERVER['HTTP_CLIENT_IP'];
    $forward = @$_SERVER['HTTP_X_FORWARDED_FOR'];
    $remote  = $_SERVER['REMOTE_ADDR'];
    if (filter_var($client, FILTER_VALIDATE_IP))
    {
        $ip = $client;
    }
    elseif (filter_var($forward, FILTER_VALIDATE_IP))
    {
        $ip = $forward;
    }
    else
    {
        $ip = $remote;
    }
    return $ip;
}
$user_ip = getUserIP();
?>
<?php
$ip_info = ip_info("Visitor", "Country");
$end_time = date("Y-m-d", strtotime("+1 day"));
$stmt3 = $db->prepare("INSERT INTO totalview VALUES ('$user_ip','$ip_info','$end_time')");
  $stmt3->execute();
$stmt3->close();
?>
<?php
// حذف زوار الأمس بعد نهاية اليوم
$date = date("Y-m-d");
$stmt11 = $db->prepare("DELETE from totalview WHERE end_time = ? ");
$stmt11->bind_param('s', $date);
$stmt11->execute();
$stmt11->close();
?>
<?php
$status_query = "SELECT DISTINCT user_ip FROM totalview ";
$result_query = mysqli_query($db, $status_query);
$count = mysqli_num_rows($result_query);
echo ' زوار اليوم : ' . $count . ' زائر ';
?>
<br />

<?php
$stmt = $db->prepare("SELECT DISTINCT
user_country FROM totalview");
$stmt->execute();
$result = $stmt->get_result();
while ($row = $result->fetch_assoc())
{
    echo $row['user_country'], '-';
}
$stmt->close();
?>

 

أظن أنك الأدرى بما ستحتاج الإستغناء عليه أو لا، ولكن بشكل عام لا أظن أنه هنالك حاجة من أسطر التحقق:

if (filter_var($ip, FILTER_VALIDATE_IP) && in_array($purpose, $support))
    {
       

فالواجهة تقوم بعمل ذلك بدلا عنك، وفي حالة عدم صلاحية هذا العنوان فلن يتم إعادة أي رد. خصوصا وأنك لا تقوم بخزن هذا العنوان إلا بعد إستلام الرد. 

ولا من هذا الشرط أيضا: 


        if (@strlen(trim($ipdat->geoplugin_countryCode)) == 2)
        {
           

 فكامل الcountry codes مميزة بمحرفين ولا حاجة للتحقق من ذلك. 
أما باقي الشيفرة فجيدة.

  • 1
نشر

يمكنك الإستعانة بالواجهات البرمجية التي تقوم بتحليل عنوان IP وإستنتاج دولة الزائر المرافقة لهذا الـIP.

واحدة من الواجهات السهل التعامل معها هي واجهة ip-api، أين يمكنك إرسال طلبية HTTP من النوع GET مرفقة بعنوان IP الزائر لجلب كامل المعلومات الخاصة بهذا العنوان. يتم إرسال الطلبيات إلى نقطة الوصول التالية: 

http://ip-api.com/json/{ip-address}

مثال عن الردود التي تقدمها الواجهة:

{
status: "success",
country: "Algeria",
countryCode: "DZ",
region: "25",
regionName: "Constantine",
city: "Constantine",
zip: "25010",
lat: 36.368,
lon: 6.6172,
timezone: "Africa/Algiers",
isp: "new",
org: "",
as: "AS36947 Telecom Algeria",
query: "244.244.244.244"
}

سيمكنك بعد ذلك قراءة أي خاصية من هذا الرد. مثل خاصية country أو countryCode لتوظيفها في خدمة غرضك. 

خطوات لتوظيف الفكرة في مثالك:

  • لنقل أن الدالة getUsersCountries تقوم بجلب الدول التي يأتي منها زوارك. 
  • تقوم هاته الدالة بإستعلام قراءة من قواعد البيانات لقراءة جميع عناوين الـ IP الخاصة بزوارك. 
  • تقوم الدالة بإرسال طلبيات GET إلى نقطة الوصول المذكورة سابقا لإستنتاج الدول التي يأتي منها زوارك (يمكنك إستعمال الدالة file_get_contents). 
  • يتم تخزين هاته الدول في مصفوفة.
  • يتم فلترة عناصر هاته المصفوفة وجلب العناصر الغير مكررة (يمكنك إستعمال الدالة array_unique). 

=> النتيجة: مصفوفة تحمل كامل بلدان الزوار.

تعديل :

لتجنب حظرك عن طريق هاته الواجهة، لا يفضل إرسال العديد من الطلبيات مرة واحدة مثل المنطق الذي ستقوم الدالة المرفقة كمثال بإتباعه، عوضا عن ذلك قم بتخزين اسم الدولة مباشرة بدل عنوان IP أو بجانبه في إستعلام INSERT الذي تقوم به في جدول totalview. 

  • 0
نشر
بتاريخ On 11/20/2021 at 17:38 قال Adnane Kadri:

يمكنك الإستعانة بالواجهات البرمجية التي تقوم بتحليل عنوان IP وإستنتاج دولة الزائر المرافقة لهذا الـIP.

واحدة من الواجهات السهل التعامل معها هي واجهة ip-api، أين يمكنك إرسال طلبية HTTP من النوع GET مرفقة بعنوان IP الزائر لجلب كامل المعلومات الخاصة بهذا العنوان. يتم إرسال الطلبيات إلى نقطة الوصول التالية: 


http://ip-api.com/json/{ip-address}

مثال عن الردود التي تقدمها الواجهة:


{
status: "success",
country: "Algeria",
countryCode: "DZ",
region: "25",
regionName: "Constantine",
city: "Constantine",
zip: "25010",
lat: 36.368,
lon: 6.6172,
timezone: "Africa/Algiers",
isp: "new",
org: "",
as: "AS36947 Telecom Algeria",
query: "244.244.244.244"
}

سيمكنك بعد ذلك قراءة أي خاصية من هذا الرد. مثل خاصية country أو countryCode لتوظيفها في خدمة غرضك. 

خطوات لتوظيف الفكرة في مثالك:

  • لنقل أن الدالة getUsersCountries تقوم بجلب الدول التي يأتي منها زوارك. 
  • تقوم هاته الدالة بإستعلام قراءة من قواعد البيانات لقراءة جميع عناوين الـ IP الخاصة بزوارك. 
  • تقوم الدالة بإرسال طلبيات GET إلى نقطة الوصول المذكورة سابقا لإستنتاج الدول التي يأتي منها زوارك (يمكنك إستعمال الدالة file_get_contents). 
  • يتم تخزين هاته الدول في مصفوفة.
  • يتم فلترة عناصر هاته المصفوفة وجلب العناصر الغير مكررة (يمكنك إستعمال الدالة array_unique). 

=> النتيجة: مصفوفة تحمل كامل بلدان الزوار.

تعديل :

لتجنب حظرك عن طريق هاته الواجهة، لا يفضل إرسال العديد من الطلبيات مرة واحدة مثل المنطق الذي ستقوم الدالة المرفقة كمثال بإتباعه، عوضا عن ذلك قم بتخزين اسم الدولة مباشرة بدل عنوان IP أو بجانبه في إستعلام INSERT الذي تقوم به في جدول totalview. 

قمت باضافة للكود لكن بها زيادات اريد الاستغناء عنها

<?php
include ('connect_file.php');
function ip_info($ip = NULL, $purpose = "location", $deep_detect = true)
{
    $output = NULL;
    if (filter_var($ip, FILTER_VALIDATE_IP) === false)
    {
        $ip = $_SERVER["REMOTE_ADDR"];
        if ($deep_detect)
        {
            if (filter_var(@$_SERVER['HTTP_X_FORWARDED_FOR'], FILTER_VALIDATE_IP)) $ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
            if (filter_var(@$_SERVER['HTTP_CLIENT_IP'], FILTER_VALIDATE_IP)) $ip = $_SERVER['HTTP_CLIENT_IP'];
        }
    }
    $purpose    = str_replace(array(
        "name",
        "\n",
        "\t",
        " ",
        "-",
        "_"
    ) , NULL, strtolower(trim($purpose)));
    $support    = array(
        "country",
        "countrycode",
        "state",
        "region",
        "city",
        "location",
        "address"
    );
    $continents = array(
        "AF" => "Africa",
        "AN" => "Antarctica",
        "AS" => "Asia",
        "EU" => "Europe",
        "OC" => "Australia (Oceania)",
        "NA" => "North America",
        "SA" => "South America"
    );
    if (filter_var($ip, FILTER_VALIDATE_IP) && in_array($purpose, $support))
    {
        $ipdat = @json_decode(file_get_contents("http://www.geoplugin.net/json.gp?ip=" . $ip));
        if (@strlen(trim($ipdat->geoplugin_countryCode)) == 2)
        {
            switch ($purpose)
            {
                case "location":
                    $output = array(
                        "city"           => @$ipdat->geoplugin_city,
                        "state"          => @$ipdat->geoplugin_regionName,
                        "country"        => @$ipdat->geoplugin_countryName,
                        "country_code"   => @$ipdat->geoplugin_countryCode,
                        "continent"      => @$continents[strtoupper($ipdat->geoplugin_continentCode) ],
                        "continent_code" => @$ipdat->geoplugin_continentCode
                    );
                break;
                case "address":
                    $address = array(
                        $ipdat->geoplugin_countryName
                    );
                    if (@strlen($ipdat->geoplugin_regionName) >= 1) $address[] = $ipdat->geoplugin_regionName;
                    if (@strlen($ipdat->geoplugin_city) >= 1) $address[] = $ipdat->geoplugin_city;
                    $output = implode(", ", array_reverse($address));
                    break;
                case "city":
                    $output = @$ipdat->geoplugin_city;
                    break;
                case "state":
                    $output = @$ipdat->geoplugin_regionName;
                    break;
                case "region":
                    $output = @$ipdat->geoplugin_regionName;
                    break;
                case "country":
                    $output = @$ipdat->geoplugin_countryName;
                    break;
                case "countrycode":
                    $output = @$ipdat->geoplugin_countryCode;
                    break;
                }
            }
    }
    return $output;
}
?>
<?PHP
// التأكد من ان عنوان ip حقيقى
function getUserIP()
{
    if (isset($_SERVER["HTTP_CF_CONNECTING_IP"]))
    {
        $_SERVER['REMOTE_ADDR'] = $_SERVER["HTTP_CF_CONNECTING_IP"];
        $_SERVER['HTTP_CLIENT_IP'] = $_SERVER["HTTP_CF_CONNECTING_IP"];
    }
    $client  = @$_SERVER['HTTP_CLIENT_IP'];
    $forward = @$_SERVER['HTTP_X_FORWARDED_FOR'];
    $remote  = $_SERVER['REMOTE_ADDR'];
    if (filter_var($client, FILTER_VALIDATE_IP))
    {
        $ip = $client;
    }
    elseif (filter_var($forward, FILTER_VALIDATE_IP))
    {
        $ip = $forward;
    }
    else
    {
        $ip = $remote;
    }
    return $ip;
}
$user_ip = getUserIP();
?>
<?php
$ip_info = ip_info("Visitor", "Country");
$end_time = date("Y-m-d", strtotime("+1 day"));
$stmt3 = $db->prepare("INSERT INTO totalview VALUES ('$user_ip','$ip_info','$end_time')");
  $stmt3->execute();
$stmt3->close();
?>
<?php
// حذف زوار الأمس بعد نهاية اليوم
$date = date("Y-m-d");
$stmt11 = $db->prepare("DELETE from totalview WHERE end_time = ? ");
$stmt11->bind_param('s', $date);
$stmt11->execute();
$stmt11->close();
?>
<?php
$status_query = "SELECT DISTINCT user_ip FROM totalview ";
$result_query = mysqli_query($db, $status_query);
$count = mysqli_num_rows($result_query);
echo ' زوار اليوم : ' . $count . ' زائر ';
?>
<br />

<?php
$stmt = $db->prepare("SELECT DISTINCT
user_country FROM totalview");
$stmt->execute();
$result = $stmt->get_result();
while ($row = $result->fetch_assoc())
{
    echo $row['user_country'], '-';
}
$stmt->close();
?>

 

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...