मुझे पता है कि यह मूल कोड है लेकिन कहीं न कहीं एक गलती है कि मैं घंटों के बाद पता नहीं लगा सकता। ब्लॉकलिस्ट के अंदर। मुझे बूलियन सच नहीं मिलता है, भले ही वह मेल खाता हो।

function blocklist($ip) {
    $blocked = false;
    $ipList = file('blocklist.txt', FILE_SKIP_EMPTY_LINES) // ip in array
        or exit("Unable to open blocklist file");

    foreach ($ipList as $entry) {
        if(strpos($entry, $ip)) { // check if ip exist in array
            $blocked = true; // set true
            break; 
        }
        echo $blocked ? 'true' : 'false';
    }
    return $blocked;
}

function getUserIP() {
    $ip = '';
    if (getenv('HTTP_CLIENT_IP'))
        $ip = getenv('HTTP_CLIENT_IP');
    else if(getenv('HTTP_X_FORWARDED_FOR'))
        $ip = getenv('HTTP_X_FORWARDED_FOR');
    else
        $ip = 'UNKNOWN';
    return $ip;
}

Blocklist.txt सामग्री

123.45.67.89
464.93.47.37
95.83.46.359
237.8.54.849
0
karadayi 30 नवम्बर 2017, 06:46

2 जवाब

सबसे बढ़िया उत्तर

जब आप blocklist.txt से $ipList वेरिएबल में IP को पार्स करते हैं तो प्रत्येक IP में अतिरिक्त स्थान जुड़ जाता है, इसलिए मैंने $ipList का उपयोग करके प्रत्येक मान से व्हॉट्सएप को हटा दिया

array_map('trim',$ipList)

function blocklist($ip) {
    //remove white space from input array
    $ip = trim($ip);
    $blocked = false;
    $ipList = file('blocklist.txt', FILE_SKIP_EMPTY_LINES) // ip in array
        or exit("Unable to open blocklist file");
    //remove the white space from each value 
    $ipList = array_map('trim',$ipList);
    //Check if IP exist in the array list 
    if(in_array($ip,$ipList)){
        return true;
    }else{
        return false;
    }
}

function getUserIP() {
    $ip = '';
    if (getenv('HTTP_CLIENT_IP'))
        $ip = getenv('HTTP_CLIENT_IP');
    else if(getenv('HTTP_X_FORWARDED_FOR'))
        $ip = getenv('HTTP_X_FORWARDED_FOR');
    else
        $ip = 'UNKNOWN';
    return $ip;
}

var_dump(blocklist('123.45.67.89')); //output true
1
Aman Maurya 30 नवम्बर 2017, 07:15

मुझे नहीं लगता कि यह आपकी फ़ाइल सामग्री को एक सरणी में तोड़ने के लिए समझ में आता है, प्रत्येक तत्व से व्हाइटस्पेस को हटाने के लिए पुनरावृत्त trim() कॉल करें, फिर एक समान मान मिलान के लिए नए तैयार सरणी को स्कैन करें।

क्या ऐसा न करने का कोई अच्छा कारण है? एक एकल फ़ंक्शन कॉल अधिक कुशल/प्रत्यक्ष होगा।

function blocklist($ip){
    if(!$ipList=file_get_contents('blocklist.txt')){
        exit("Unable to open blocklist file");
    }
    return preg_match('/\b\Q'.$ip.'\E\b/',$ipList) ? true : false;
}

यहां एक स्थिर $ipList स्ट्रिंग वाला डेमो दिया गया है:

function blocklist($ip){
    $ipList='123.45.67.89
464.93.47.12
464.93.47.123
95.83.46.359
237.8.54.849';
    //                  vv-----------vv-Word Boundaries to ensure no extra digits are matched
    return preg_match('/\b\Q'.$ip.'\E\b/',$ipList) ? true : false;
    //                    ^^-------^^-Interpret $ip string literally, so dots are not "any character" (only important in extreme fringe cases)
}

var_export(blocklist('464.93.47.123'));  // true
var_export(blocklist('464.93.1.123'));  // false

अन्यथा यदि आप किसी सरणी को संसाधित करने पर अपना दिल सेट करते हैं, तो एक एकल लूप को जल्दी से बाहर निकलने की संभावना के साथ निष्पादित करें (न कि array_map() फिर in_array():

function blocklist($ip){
    $ipList = file('blocklist.txt', FILE_SKIP_EMPTY_LINES) // ip in array
              or exit("Unable to open blocklist file");
    foreach ($ipList as $entry) {
        if($ip===trim($entry)) { // check if ip value is element value
            return true; // set true and early exit
        }
    }
    return false;
}

साथ ही, अन्य फ़ंक्शन को सरल/छोटे सिंटैक्स का उपयोग करने के लिए परिष्कृत किया जा सकता है:

function getUserIP() {
    if (getenv('HTTP_CLIENT_IP')) return getenv('HTTP_CLIENT_IP');
    if (getenv('HTTP_X_FORWARDED_FOR')) return getenv('HTTP_X_FORWARDED_FOR');
    return 'UNKNOWN';
}
0
mickmackusa 1 पद 2017, 07:59