Как перебирать каждую строку в файле PHP

#php

#php

Вопрос:

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

 key1
key2
 

И так далее.
Я попробовал следующее, чтобы перебрать текстовый файл, вставить значения в массив и и работать там. Вот что у меня есть:

 $gkey = $_GET["key"];

$file = fopen("./generatedkeys.txt", "a");
$generatedk = array();

// generate table from data in txt file
while(! feof($file)) {
   $generatedk[] = fgets($file);
}
    

foreach ($generatedk as $key){
   if ($key == hash("sha256", $gkey)){

      // Removing of key from data in txt file
      $contents = file_get_contents($file);
      $contents = str_replace($key, '', $contents);
      file_put_contents($file, $contents);
      fclose($file);

      $accfile = fopen("./accs.txt", "a");
      fwrite($accfile, hash("sha256", $key).",".hash("sha256", $hwid)."n");

      break;
   }
}
 

Однако приведенный выше код, похоже, не работает. Ключ просто не обнаруживается и не удаляется из generatedkeys.txt . (Не уверен, есть ли какие-либо ошибки, поскольку я их не вижу).
Есть ли какие-либо очевидные ошибки?
Любая помощь приветствуется. Спасибо.

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

1. Вероятно, проще просто прочитать файл в строку сразу, а затем split строку. Помните, что основная часть основных функциональных возможностей PHP и библиотеки функций — это просто тонкие оболочки поверх стандартной библиотеки C (а C не позволяет легко читать файлы построчно, поскольку ввод-вывод файлов выполняется с использованием буферов фиксированного размера, а не строк). Материал ООП не добавлялся до PHP5.

2. «Похоже, не работает» — пожалуйста, отредактируйте свой вопрос и напишите ожидаемое поведение

3. Просто используйте file() вместо этого. Это даст вам массив с каждой строкой в качестве элемента массива, что, похоже, вы пытаетесь сделать вручную.

4. Неопределенная переменная $hwid

5. Совет: file_get_contents() и file_put_contents() ожидают путь к файлу

Ответ №1:

Я думаю, это должно упростить процесс, используя file для чтения всего файла за один раз в массив, а затем используя array_search() для поиска, существует ли ключ (он возвращает false, если не найден, поэтому !== false ).

Затем, если он найден, он просто добавляет использованный ключ в другой файл, удаляет запись массива для ключа и перезаписывает исходный файл…

 $gkey = $_GET["key"];

$generatedk = file("./generatedkeys.txt", FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);

if ( ($entry = array_search(hash("sha256", $gkey), $generatedk)) !== false )    {
    // Add key used, with whatever content you want
    file_put_contents("./accs.txt", $gkey.PHP_EOL, FILE_APPEND);
    // Remove found key from list in input file
    unset($generatedk[$entry]);
    // Overwrite input file with adjusted array
    file_put_contents("./generatedkeys.txt", implode(PHP_EOL, $generatedk));
}
 

Ответ №2:

Ваш код создаст несколько пустых строк при удалении ключа из файла. И вы передали возвращаемое значение fopen() в качестве параметра file_get_contents() . возвращаемое значение — ресурс в файле, но file_get_contents() нуждается в строке (путь к файлу).

Вы можете проверить следующее.

 $gkey = $_GET["key"];

$file_path="./generatedkeys.txt";
$file = fopen($file_path, "a");
$generatedk = array();

// generate table from data in txt file
while(! feof($file)) {
   $generatedk[] = fgets($file);
}
fclose($file);

for($i=0; $i<count($generatedk); $i  ){
   $key=$generatedk[$i];
   if ($key == hash("sha256", $gkey)){

      // Removing of key from data in txt file
      array_splice($generatedk, $i, 1);
      file_put_contents($file_path, implode("n", $generatedk));

      $accfile = fopen("./accs.txt", "a");
      fwrite($accfile, hash("sha256", $key).",".hash("sha256", $hwid)."n");
      fclose($accfile);

      break;
   }
}
 

Я надеюсь, что это будет работать хорошо.
Спасибо.

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

1. Спасибо за помощь. Только что опробовал ваш метод, но я получаю следующую ошибку: Фатальная ошибка: разрешенный объем памяти 134217728 байт исчерпан (пытался выделить 134217736 байт) Эта ошибка находится в строке 33 по адресу: $generatedk[] = fgets($file); Есть предложения?

2. Да, я обнаружил, что в этой строке может возникнуть ошибка. вы можете использовать file_get_contents() вместо fget() . Попробуйте использовать этот фрагмент кода вместо цикла while. $contents=file_get_contents($file_path); $generatedk=explode(» n», $contents);

3. Хм, теперь я, кажется, получаю эту ошибку: Фатальная ошибка: превышено максимальное время выполнения 120 секунд в (путь к файлу)

4. если ошибка возникает в функции file_get_contents(), вы можете использовать функцию file($file_path) . пожалуйста, обратитесь к справке . Если вы можете поделиться своим экраном, дайте мне знать. Спасибо.

5. Не волнуйтесь! Мне удалось заставить его работать, спасибо.