file_get_contents не получает содержимое правильного файла

#php #arrays #file-get-contents

#php #массивы #file-get-contents

Вопрос:

Я пытаюсь создать скрипт, который покажет новый IP-адрес на основе имени состояния. IP-адреса должны быть взяты из файла с тем же именем, что и имя состояния. Затем он принимает случайный IP-адрес и присваивает его (вот как это должно работать).

Проблема в том, что он присваивает совершенно случайные IP-адреса и загружает их IP-адреса из случайного файла вместо того, чтобы брать его из правильного файла с именем состояния.

Как это должно работать: Калифорния> california.txt > случайный IP-адрес

Как это работает сейчас: Калифорния> newyork/georgia/texas/etc.txt > случайный IP-адрес

 $state_content=["Alabama","Alaska","Arizona","Arkansas","California","Colorado","Connecticut","Delaware","Florida","Georgia","Hawaii","Idaho","Illinois","Indiana","Iowa","Kansas","Kentucky","Louisiana","Maine","Maryland","Massachusetts","Michigan","Minnesota","Mississippi","Missouri","Montana","Nebraska","Nevada","NewHampshire","NewJersey","NewMexico","NewYork","NorthCarolina","NorthDakota","Ohio","Oklahoma","Oregon","Pennsylvania","RhodeIsland","SouthCarolina","SouthDakota","Tennessee","Texas","Utah","Vermont","Virginia","Washington","WestVirginia","Wisconsin","Wyoming"];

$country_content=["UnitedStates", "UnitedKingdom", "Canada", "Australia", "Germany", "France", "Spain"];

$a = 0;

function getStateContent($state_name) {

    // checks do we already have content for this state
    if(!isset($state_content[$state_name])) {

        // generate file name
        $file_name = "state/";
        $file_name .= str_replace(" ", "", ucwords($state_name));
        $file_name .= ".txt";

        $state_text = file_get_contents($file_name);
        $state_content[$state_name] = explode("n", $state_text);
    }

    return $state_content[$state_name];
}

function getStateIpByName($state_name) {
    $content = getStateContent($state_name);
    return $content[array_rand($content)];
}

function getCountryContent($country_name) {

    // checks do we already have content for this state
    if(!isset($country_content[$country_name])) {

        // generate file name
        $file_name = "country/";
        $file_name .= str_replace(" ", "", ucwords($country_name));
        $file_name .= ".txt";

        $country_text = file_get_contents($file_name);
        $country_content[$country_name] = explode("n", $country_text);
    }

    return $country_content[$country_name];
}

function getCountryIpByName($country_name) {
    $content = getCountryContent($country_name);
    return $content[array_rand($content)];
}
  

Использование:

 if ($result->num_rows > 0) {
    // output data of each row
    echo "<div class='block'><div class='rows'>";

    while($row = $result->fetch_assoc()) {

        if (!empty($row["state"]) amp;amp; $row["country"] == "united states") {
            $stateip = getStateIpByName($row["state"]);
            $a  ;
            echo $stateip;
        }

        else if (empty($row["state"]) amp;amp; $row["country"] == "united states") {
            $countryip = getCountryIpByName($row["country"]);
            $a  ;
            echo $countryip;
          }

        else if ($row["country"] != "united states") {

        }

    }
  

Комментарии:

1. Смотрите эти инструкции, $state_content[$state_name] = explode("n", $state_text); и $country_content[$country_name] = explode("n", $country_text); . Исходные массивы, т.е. $state_content и $country_content , обрабатываются / изменяются каждый раз, когда соответствующие функции вызываются из while цикла.

2. Я вижу. Есть идеи о том, как я могу это исправить?

3. Что содержат эти файлы? IP-адреса? Кроме того, что вы пытаетесь сделать с этими утверждениями?

4. Эти файлы содержат IP-адреса, такие как 1.1.1.1, 2.2.2.2 (по 1 на строку). Я пытаюсь вывести недавно созданные данные на страницу.

5. Я дал ответ ниже. Надеюсь, это решит вашу проблему.

Ответ №1:

Как я уже сказал в комментарии,

Эти операторы $state_content[$state_name] = explode("n", $state_text); и $country_content[$country_name] = explode("n", $country_text); манипулируют / изменяют исходный массив каждый раз, когда соответствующие функции вызываются из while() цикла.

Решение таково (после обсуждения в чате)

Изменить getStateContent() и getCountryContent() функционирует следующим образом,

 function getStateContent($state_name) {
    // checks do we already have content for this state
    global $state_content;
    $state_name = str_replace(" ", "", ucwords($state_name));
    if(in_array($state_name, $state_content)) {
        // generate file name
        $file_name = "state/";
        $file_name .= $state_name;
        $file_name .= ".txt";

        $state_text = file_get_contents($file_name);
        $ipaddresses = explode("n", $state_text);
        return $ipaddresses;
    }
}
  

и

 function getCountryContent($country_name) {
    // checks do we already have content for this state
    global $country_content;
    $country_name = str_replace(" ", "", ucwords($country_name));
    if(in_array($country_name, $country_content)) {
        // generate file name
        $file_name = "country/";
        $file_name .= $country_name;
        $file_name .= ".txt";

        $country_text = file_get_contents($file_name);
        $ipaddresses = explode("n", $country_text);
        return $ipaddresses;

    }
}
  

Комментарии:

1. Он просто показывает пустую страницу с state/California.txt … Мне нужно просмотреть все записи с недавно назначенными IP-адресами на странице, и именно поэтому я использовал while . Что-то здесь ужасно неправильно. Может быть, вы забыли о getStateIpByName($state_name) функции, которая извлекает случайный IP-адрес из связанного файла? Или, может быть, я просто не понимаю, как мне применить это в while цикле?

2. @Ricardo О, мой плохой. Я случайно сохранил die($file_name); эту функцию, вот почему. Я использовал это для отладки вашей проблемы. Я обновил свой ответ. И вам не нужно изменять какой-либо while цикл, вам просто нужно изменить эти функции, вот и все.

3. Что я должен написать в while цикле вместо echo $stateip; этого? Я думаю, вы не до конца поняли вопрос. Я беру данные из своей базы данных, и мне нужно присвоить КАЖДОЙ СТРОКЕ НОВЫЙ IP-адрес из текстового файла. Я предполагаю, что то, что вы сделали, просто показывает содержимое определенного файла .txt. Где находится назначение нового IP-адреса для каждой строки базы данных?

4. Пожалуйста, посмотрите в вопросительном сообщении: How this should work: california > california.txt > random IP . По сути, каждый раз california , когда он будет отображаться, он будет заменен случайным IP california.txt -адресом. Таким образом, для каждого калифорнийского поля в таблице мы получаем (показанный на странице) случайный калифорнийский IP.

5. @Ricardo Хорошо, итак, с этим $stateip $countryip вы получаете случайный IP-адрес из файла (на основе состояния или страны в каждой итерации while цикла). Итак, что вы пытаетесь сделать с этим случайным IP-адресом?