PHP: редактируем список строк
Задача состояла в том, чтобы сделать простой редактор переменного количества строк - то есть, количество строк задаётся в некоторых допустимых пределах, каждая строка редактируется в своём текстовом поле, всё отправляется в текстовый файл на сохранение одной кнопкой. После изменения количества строк, все лишние удалятся и файл перепишется.
С некоторыми поправками можно использовать подход из этой заметки. Предполагается, что строки могут содержать символы разметки HTML и всё закодировано в кодировке Юникода UTF-8. Строки автоматически избавляются от лишних разделителей в начале, конце и между лексемами. Если текстовый файл отсутствует, он создаётся автоматически с одной пустой строкой.
Также предполагаем здесь, что редактирование не требует авторизации или ввода пароля. Кстати, простейший способ "защиты" скрипта в таких случаях - сохранить его под случайным именем, на которое у Вас есть ссылка, а в файле .htaccess
запретить просмотр оглавления папки директивой Options -Indexes
(ну или создать в папке скрипта файл index.html
нулевого размера).
Ниже показан исходник на PHP (кодировка Юникода UTF-8) и ссылка на приложение в работе.
<!DOCTYPE html> <html lang="ru"> <head> <meta charset="utf-8"> <title>Редактор списка строк</title> <style> table { margin: auto; } form { text-align: center; } table, th, td { border: 1px dotted #000; border-collapse: collapse; text-align: center; } th, td { padding: 5px; } </style> </head> <body> <?php function trimall($string) { return trim(preg_replace('/\s+/',' ',$string)); } mb_internal_encoding('UTF-8'); $params = array ('cnt', 'action'); foreach ($params as $num=>$var) { if (!empty($_REQUEST[$var])) $$var = trimall(htmlspecialchars($_REQUEST[$var])); else $$var = ''; } if (!empty($cnt)) $cnt = intval (max(1,min(99,$cnt))); //разрешаем от 1 до 99 строк else $cnt = 1; $filepath = dirname(__FILE__).'/data.txt'; //файл data.txt в текущей папке на хосте if (!file_exists($filepath)) { //если файла нет - создать и попросить обновить $res = @file_put_contents ($filepath, PHP_EOL); if ($res === false) { exit ('Ошибка создания файла '.$filepath.', проверьте права'); } else { echo '<p>Файл успешно создан, <a href="'.$_SERVER['PHP_SELF'].'">обновите страницу</a></p>'; } } else { if (!empty($action)) { //записать изменения $filedata = ''; for ($i = 0; $i < $cnt; $i++) { $string = ''; if (isset($_REQUEST['string_'.$i]) and !empty($_REQUEST['string_'.$i])) $string = $_REQUEST['string_'.$i]; $filedata .= $string.PHP_EOL; } $res = @file_put_contents ($filepath,$filedata); if ($res === false) { exit ('Ошибка записи файла '.$filepath.', проверьте права'); } } $res = @file ($filepath); if ($res === false) { exit ('Ошибка чтения файла '.$filepath.', проверьте права или создайте файл заново'); } if (count($res) > 0) $cnt = max ($cnt, count($res)); echo ' <form name="f1" method="post" action="'.$_SERVER['PHP_SELF'].'"> <table> <tr> <td>Bсего строк: <input type="number" name="cnt" min="1" max="99" value="'.$cnt.'"> </td> <td> <input type="submit" name="action" value="Сохранить текущие данные"> <input type="reset" value="Отменить последнюю правку"> </td> </tr>'; for ($i = 0; $i < $cnt; $i++) { $fill = (isset($res[$i]) ? trimall(htmlspecialchars($res[$i])) : ''); echo ' <tr> <td>Строка '.($i+1).':</td> <td> <input type="text" name="string_'.$i.'" maxlength="78" size="80" value="'.$fill.'"> </td> </tr>'; } echo ' </table> </form>'; } ?> </body></html>
27.11.2021, 12:50 [749 просмотров]