Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Скриптовые языки программирования > PHP
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 13.04.2024, 16:49   #1
Grasss
Пользователь
 
Регистрация: 03.11.2017
Сообщений: 32
По умолчанию Сохранение файла после удаления лишних строк

Имеется файл с данными tst.log, которые мы можем отметить и удалить с помощью кнопки "Удалить лишнее".
Далее, обновленный файл нужно перезаписать кнопкой "Сохранить изменения" ... т.к после обновления страницы все изменения сбрасываются...

Код:
<style>
  .table td {
    border: 1px solid #757575;
    text-align: center;
    vertical-align: middle;
    position: relative;
    cursor: pointer;
  }

  .table .active td:after {
    content: '';
    position: absolute;
    top: 0px;
    right: 0px;
    bottom: 0px;
    left: 0px;
    background:red; opacity:0.5;
    border: 3px solid red;
  }
</style>

<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://code.jquery.com/jquery-2.1.0.js"></script>
<script type="text/javascript">
$(document).ready(function() {
  $('.table tr').hover(function() {
    $(this).addClass('hover');
  }, function() {
    $(this).removeClass('hover');
  });

  $('.table tr').click(function() {
    $('.table tr').removeClass('active');
    $(this).addClass('active');
    element_tr = $(this);
  });
});

$(document).ready(function() {
  $("#btnDelete").on('click', function() {
    element_tr.remove();
  });
});</script>


<?php
if (isset($_GET[col])) { $col=$_GET[col]; } else { $col=20; }
$file=file("tst.log"); ?>

<html>
<head>
<style type='text/css'>
td.zz {PADDING-LEFT: 3px; FONT-SIZE: 9pt; PADDING-TOP: 2px; FONT-FAMILY: Arial; COLOR: Black;}
</style>
</head>

<body>
<center>

<?php
if ($col>sizeof($file)) { $col=sizeof($file); }
echo "Последние <b>".$col."</b> записей:";
echo "<br><button id='btnDelete'>Удалить лишнее</button>";
?>

<table id="myTable" class="table" width="auto" cellspacing="1" cellpadding="1" border="0" STYLE="table-layout:fixed">

<?php
   for ($si=sizeof($file)-1; $si+1>sizeof($file)-$col; $si--) {
   $string=explode("|",$file[$si]);
   $q1[$si]=$string[0]; // столбец
   echo '<tr bgcolor="#B0E0E6"><td class="zz">'.$q1[$si].'</td>';
}
?>

</table></center></body></html>
Содержимое файла tst.log
Код:
строка A
строка B
строка C
строка D
строка E
строка F
строка G
строка K
строка L
строка M
Grasss вне форума Ответить с цитированием
Старый 15.04.2024, 11:12   #2
Valick
Форумчанин
 
Регистрация: 27.04.2022
Сообщений: 495
По умолчанию

Для начала прочитайте это https://tproger.ru/explain/xyproblem
А потом сформулируйте саму задачу, а не проблему собственного решения этой задачи.
Valick вне форума Ответить с цитированием
Старый 15.04.2024, 17:10   #3
Grasss
Пользователь
 
Регистрация: 03.11.2017
Сообщений: 32
По умолчанию

Цитата:
Сообщение от Valick Посмотреть сообщение
Для начала прочитайте это https://tproger.ru/explain/xyproblem
А потом сформулируйте саму задачу, а не проблему собственного решения этой задачи.
это не относится к решению моего вопроса...
Grasss вне форума Ответить с цитированием
Старый 16.04.2024, 10:16   #4
ADSoft
Старожил
 
Регистрация: 25.02.2007
Сообщений: 4,179
По умолчанию

так у вас нигде и нет сохранения файла... один раз прочли - отобразили и все
как вы хотите сделать?
1) что при удалении строки файл сразу перезаписывался?
2) чтоб по удаляли строки - нажали на какую-то кнопку - Сохранить изменения - и только тогда перезаписывался?

В зависимости от вашего выбора - будут разные действия
ADSoft вне форума Ответить с цитированием
Старый 16.04.2024, 17:47   #5
Grasss
Пользователь
 
Регистрация: 03.11.2017
Сообщений: 32
По умолчанию

Цитата:
Сообщение от ADSoft Посмотреть сообщение
так у вас нигде и нет сохранения файла... один раз прочли - отобразили и все
как вы хотите сделать?
1) что при удалении строки файл сразу перезаписывался?
2) чтоб по удаляли строки - нажали на какую-то кнопку - Сохранить изменения - и только тогда перезаписывался?

В зависимости от вашего выбора - будут разные действия
В идеале конечно, чтобы при удалении строки, она сразу же удалялась из файла и он сохранялся...
Grasss вне форума Ответить с цитированием
Старый 17.04.2024, 08:05   #6
ADSoft
Старожил
 
Регистрация: 25.02.2007
Сообщений: 4,179
По умолчанию

ну и какие ваши потуги по реализации данного действ? или просто нужен готовый код?
Цитата:
Сообщение от Grasss Посмотреть сообщение
$("#btnDelete").on('click', function() {
element_tr.remove();
});
тут делаете ajax запрос на бэк - где производите операцию по удалению строки из файла....
ADSoft вне форума Ответить с цитированием
Старый 17.04.2024, 10:03   #7
Valick
Форумчанин
 
Регистрация: 27.04.2022
Сообщений: 495
По умолчанию

Цитата:
Сообщение от ADSoft Посмотреть сообщение
ну и какие ваши потуги по реализации данного действ?
ТС бестолков как пробка, и даже не в состоянии грамотно поставить задачу, не то что осилить её решение.
А всего лишь надо внимательно прочесть о "проблеме молотка" и переформулировать задачу.

В 90% случаев данная задача решается выводом строк с чекбоксами, установкой чекбоксов и действием с выбранными строками, в частности удалением.
А ещё в 90% случаев необходимо использовать БД вместо файлов.
Valick вне форума Ответить с цитированием
Старый 17.04.2024, 15:44   #8
Valick
Форумчанин
 
Регистрация: 27.04.2022
Сообщений: 495
По умолчанию

Код:
<?php
declare(strict_types=1);

// Model

function getFileContent(string $fileName): array
{
    if (file_exists($fileName)) {
        return file($fileName);
    }

    return [];
}

function addFileLastRow($fileName, $value): bool
{
    if (empty($value) || !file_exists($fileName)) {
        return false;
    }

    $f = fopen($fileName, "ab");
    if (!flock($f, LOCK_EX | LOCK_NB)) {
        return false;
    }
    fwrite($f, PHP_EOL . $value);
    fclose($f);

    return true;
}

function addFileRow($fileName, array $addAfterRow, $value): bool
{
    if (empty($value) || !file_exists($fileName)) {
        return false;
    }

    $i = 0;
    $new = fopen('new_' . $fileName, 'ab');
    if (!flock($new, LOCK_EX | LOCK_NB)) {
        return false;
    }
    $old = fopen($fileName, "rb");
    while (($row = fgets($old, 4096)) !== false) {
        if (in_array($i++, $addAfterRow, true)) {
            fwrite($new, $row);
            fwrite($new, $value . PHP_EOL);
            continue;
        }
        fwrite($new, $row);
    }
    fclose($new);
    fclose($old);
    unlink($fileName);
    rename('new_' . $fileName, $fileName);
    chmod($fileName, 0777);

    return true;
}

function deleteFileRow(string $fileName, array $rowToDelete): bool
{
    if (!file_exists($fileName)) {
        return false;
    }

    $i = 0;
    $new = fopen('new_' . $fileName, 'ab');
    if (!flock($new, LOCK_EX | LOCK_NB)) {
        return false;
    }
    $old = fopen($fileName, "rb");
    while (($row = fgets($old, 4096)) !== false) {
        if (in_array($i++, $rowToDelete, true)) {
            continue;
        }
        fwrite($new, $row);
    }
    fclose($new);
    fclose($old);
    unlink($fileName);
    rename('new_' . $fileName, $fileName);
    chmod($fileName, 0777);

    return true;
}

// Controller
$fileName = 'tst.log';
$hash = hash_file('sha256', $fileName);
if (isset($_POST['action']) && isset($_POST['hash']) && $hash === $_POST['hash']) {
    switch ($_POST['action']) {
        case 'Добавить':
            if (empty($_POST['row'])) {
                addFileLastRow($fileName, $_POST['value']);
                break;
            }
            addFileRow($fileName, array_keys($_POST['row']), $_POST['value']);
            break;
        case 'Заменить':
            //replaceFileRow($fileName, array_keys($_POST['row']), $_POST['value']);
            break;
        case 'Удалить':
            deleteFileRow($fileName, array_keys($_POST['row']));
            break;
    }
    header("Location:" . $_SERVER['HTTP_REFERER']);
}
$file = getFileContent($fileName);

// View
?>
<html lang="ru">
<header>
    <title>Удаление строк</title>
</header>
<body>
<?php if (isset($_POST['hash']) && $hash !== $_POST['hash']) { ?>
    <p>Обнаружена попытка одновременного изменения файла.</p>
<?php } ?>
<form method="post">
    <input type="hidden" name="hash" value="<?= $hash ?>">
    <?php
    if (!empty($file)) {
        foreach ($file as $key => $row) { ?>
            <label>
                <input type="checkbox" name="row[<?= $key ?>]">
            </label> <?= htmlspecialchars($row) ?> <br/>
        <?php } ?>
        <hr/>
        <p>
            <label>
                <textarea name="value"></textarea>
            </label>
        </p>
        Действие:
        <input type="submit" name="action" value="Добавить">
        <input type="submit" name="action" value="Заменить">
        <input type="submit" name="action" value="Удалить">
    <?php } ?>
</form>
</body>
</html>

Последний раз редактировалось Valick; 17.04.2024 в 19:41.
Valick вне форума Ответить с цитированием
Старый 18.04.2024, 02:20   #9
Grasss
Пользователь
 
Регистрация: 03.11.2017
Сообщений: 32
По умолчанию

Цитата:
Сообщение от Valick Посмотреть сообщение
Спасибо Вам за помощь))
А можно ли сделать, чтобы большой файл отображался по 20 - 50 - 100 результатов на странице, чтоб ее сильно не перегружать?

Что-то вроде этого
Код:
echo '<br>Просмотреть последние <a href=?col=20>20</a> | <a href=?col=50>50</a> | <a href=?col=100>100</a>';
echo '<br>Просмотреть <a href=?col='.sizeof($file).'>все посещения</a>.</center>';
И по возможности, чтобы при двойном клике на строку - копировать ее содержимое.
Изначально использовал такой вариант для таблицы с данными.
Код:
<script>
// You can use any function to copy here
function copyToClipboard(textToCopy) {
    var input = document.createElement("input");
    document.body.appendChild(input);
    input.value = textToCopy;
    input.select();
    document.execCommand("Copy");
    input.remove();
}

function copyLastColumn(tr) {
    copyToClipboard(tr.lastElementChild.innerHTML);
    // alert('copied to clipboard');
}
</script>

<table id="myTable" class="table" width="auto" cellspacing="1" cellpadding="1" border="0" STYLE="table-layout:fixed">

<?php
   for ($si=sizeof($file)-1; $si+1>sizeof($file)-$col; $si--) {
   $string=explode("|",$file[$si]);
   $q1[$si]=$string[0]; // столбец
   echo '<tr ondblclick="copyLastColumn(this)" bgcolor="#B0E0E6"><td class="zz">'.$q1[$si].'</td>';
}
?>

Или альтернативный вариант копирования значений сразу в textarea...
Код:
из <textarea id="result-word"></textarea> 
в <textarea id="replace"></textarea>
<button id="go" class="buttonBad">Скопировать значение</button>
Код:
<script>document.getElementById("go").addEventListener("click", function() {
    document.getElementById("replace").value = document.getElementById("result-word").value;
}, false);</script>

Последний раз редактировалось Grasss; 18.04.2024 в 16:18. Причина: исправить
Grasss вне форума Ответить с цитированием
Старый 18.04.2024, 08:19   #10
ADSoft
Старожил
 
Регистрация: 25.02.2007
Сообщений: 4,179
По умолчанию

можно сделать абсолютно все....
вопрос знаний и умений...
то что вы описали в широком смысле слова называется пагинация...

и прислушайтесь к советам... переходите на БД
ADSoft вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Макрос удаления пустых строк после текста. drongo777 Microsoft Office Excel 8 16.08.2019 20:04
Макрос удаления 300 строк после .... lakcin Microsoft Office Excel 3 31.08.2014 15:04
Удаление лишних строк в memo Gudzik11 Общие вопросы Delphi 7 10.04.2012 06:57
Сохранение файла после изменения/удаления записи (Delphi) Kurai Помощь студентам 2 15.05.2010 23:21
Отсеивание лишних строк V@mpir Общие вопросы Delphi 3 08.06.2009 16:35