Запись в текстовый файл не будет работать при первом щелчке мышью


У меня странный вопрос, и я понятия не имею, что случилось. Я кодирую интерактивную карту Соединенных Штатов. Пользователь щелкает состояние, и щелчок записывается в текстовый файл. Затем на карте отображается общее количество кликов. Это в основном быстрый обходной путь вокруг полной базы данных.

Код работает. Каждый раз, когда вы нажимаете на состояние, оно добавляется в текстовый файл. Если государство еще не существует, то для него делается запись. Если это так, то количество кликов просто обновляется. Вот файл:

<?php 
    // get the input from AJAX
    @$state = $_GET['state'];
    // get the txt file where all of the states are 
    $file = 'state_count.txt';
        //if state_count.txt exists 
        if($fopen = fopen($file, 'c')){ 
            //open it and check if the name of the state is recorded or not 
            if($strpos= strpos(file_get_contents($file), $state)){
                //if so, add 1 to the value after the state's name
                // in the formate State:#
                //cut the text file into an array by lines 
                $lines = file($file);
                //foreach line, parse the text 
                foreach($lines as $l => $k){ 
                    // create a new array $strings where each key is the STATE NAME and each value is the # of clicks 
                    $strings[explode(':', $k)[0]] = explode(':', $k)[1];
                } 
                // add 1 to the # of clicks for the state that was clicked
                $strings[$state] = $strings[$state]+1;  
                // move cursor to the end of the state's name and add 1 to accomodate the : 
                fseek($fopen, $strpos+strlen($state)+1, SEEK_SET); 
                // overwrite number in file
                fwrite($fopen, $strings[$state]); 

                // debug print($strings[$state]);

            }
            //if not, add it with the value 1
            else{ 
                file_put_contents($file, $state.":1n", FILE_APPEND); 
            } 
        }   
        //if does not exist
        else{ 
            die('Cannot create or open file.'); 
        } 

?>

Проблема у меня в том, что код работает для всех состояний, кроме первого состояния, которое нажато (т. е. текстовый файл пуст, пользователь нажимает одно состояние, это состояние является первым состоянием). В этом случае он никогда не обновляет первоначально нажатое состояние, он просто создает кучу отдельных записей для него. В конечном итоге это выглядит так (предполагая, что я нажал Пенсильванию первым):

Pennsylvania:1
Pennsylvania:1
Utah:1
Colorado:1
Kansas:1
Nebraska:1
Wyoming:1
Indiana:1
Ohio:3
Virginia:1
West Virginia:2
Kentucky:8
Tennessee:1
Georgia:1
Alabama:2
Mississippi:1
Pennsylvania:1
Pennsylvania:1
Pennsylvania:1
Pennsylvania:1
Pennsylvania:1

Я не уверен, почему он это делает, поэтому я надеюсь, что пара свежих глаз сможет укажи на что-нибудь очевидное... У меня есть ощущение, что это связано с утверждением строки if в if($strpos= strpos(file_get_contents($file), $state)){, но я не могу быть уверен. Это кажется странной проблемой для кода, чтобы работать на 100% правильно для всего, кроме первого состояния, которое вы нажимаете. Я знаю, что это первое состояние только потому, что я пробовал его много раз с разными состояниями в качестве первого.

Есть идеи или предложения?

1 5

1 ответ:

Обратите внимание, что когда вы используете strpos, чтобы увидеть, существует ли строка, вы должны проверить против boolean:

if (strpos(....) !== false) { ... }

Иначе у вас будет false negative, когда ваш strpos возвращает 0, как в вашем случае.

В своем коде вы можете подойти следующим образом:

$strpos= strpos(file_get_contents($file), $state);
if ($strpos !== false) {...