БлогNot. PHP: редактируем список строк

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 [224 просмотра]


теги: textprocessing список php сервис безопасность