#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. Не волнуйтесь! Мне удалось заставить его работать, спасибо.