Codeigniter Загрузка и чтение файлов внутри библиотеки - PullRequest
0 голосов
/ 14 февраля 2019

У меня в папке библиотеки есть папка ip_files.пример: library/ip_files/0.php папка ip_files содержит несколько файлов.См. Изображение:

enter image description here

Я создал класс в папке ip_files с именем GetCountry код этого класса:

class GetCountry
{

    public function iptocountry($ip)
    {
        $numbers = preg_split("/\./", $ip);
        echo $numbers[0] . ".php"; //test path

        //I have also tried the below for include path
        //include(base_url()."application/libraries/ip_files/".$numbers[0] . ".php"); 
        //gives a forbidden error

        include($numbers[0] . ".php");
        $code = ($numbers[0] * 16777216) + ($numbers[1] * 65536) + ($numbers[2] * 256) + ($numbers[3]);
        foreach ($ranges as $key => $value) {
            if ($key <= $code) {
                if ($ranges[$key][0] >= $code) {
                    $country = $ranges[$key][1];
                    break;
                }
            }
        }
        return $country;
    }
}

ПАПКА КОНТРОЛЛЕРОВ

   public function index($page = 'index')
   {
    $this->load->library('ip_files/GetCountry'); //load library
    $country = $this->getcountry->iptocountry($_SERVER['REMOTE_ADDR']); //call function
    var_dump($country);

    $this->load->view('templates/head', $data);
    $this->load->view('users/' . $page, $data);
    $this->load->view('templates/footer', $data);
}

Моя проблема

Я получаю ошибку Message: include(::1.php): failed to open stream: Invalid argument

Я также получаю неопределенное смещение в цикле foreach, потому что я подозреваю, что путь не открывается правильно для функции для циклического перемещения по файлам.

Любая помощь или совет будут оценены.(Имейте в виду, что я новичок в CodeIgniter)

Ответы [ 2 ]

0 голосов
/ 14 февраля 2019

Предполагая, что вы пытаетесь в localhost, вот почему $_SERVER['REMOTE_ADDR'] возвращает ::1.Для получения сплошного числа в качестве имени файла сначала удалите этот знак :: из строки.

$file_name = str_replace("::","",$numbers[0]);
include($file_name . ".php");

, а для проверки неопределенного смещения проверьте с помощью функции isset(), где используется смещение, например

if(isset($numbers[0])){
   $file_name = str_replace("::","",$numbers[0]);
}

и

if(isset($ranges[$key][0])){
    if ($ranges[$key][0] >= $code) {
        $country = $ranges[$key][1];
        break;
    }
}
0 голосов
/ 14 февраля 2019

Я предполагаю, что переменная $ip содержит адрес обратной связи IPv6, обычно выражаемый как ::1, поэтому вы можете применить фильтр только IPv4, используя FILTER_VALIDATE_IP с флагом FILTER_FLAG_IPV4:

class GetCountry
{

    public function iptocountry($ip)
    {
        if (filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4)) {
            $numbers = preg_split("/\./", $ip);
            echo $numbers[0] . ".php"; //test path

            //I have also tried the below for include path
            //include(base_url()."application/libraries/ip_files/".$numbers[0] . ".php"); 
            //gives a forbidden error

            include($numbers[0] . ".php");
            $code = ($numbers[0] * 16777216) + ($numbers[1] * 65536) + ($numbers[2] * 256) + ($numbers[3]);
            foreach ($ranges as $key => $value) {
                if ($key <= $code) {
                    if ($ranges[$key][0] >= $code) {
                        $country = $ranges[$key][1];
                        break;
                    }
                }
            }
            return $country;
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...