• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

czat w php, usuwanie danego diva z pliku txt

Object Storage Arubacloud
0 głosów
460 wizyt
pytanie zadane 24 lipca 2023 w PHP przez darknode Początkujący (450 p.)
Witam, chciałbym spytać, czy jest taka możliwość aby za pomocą funkcji php można było usunąć danego całego div'a w pliku txt?

wiem, że daną linijkę można, ale mi chodzi o to, by usunąć cały 1 wpis który ma indywidualny identyfikator ID

Wiem, że najlepiej byłoby nowe wpisy umieszczać w bazie danych... ale z tym sobie na chwile obecną nie bardzo mogę poradzić...

Nowe wpisy zapisywane są w pliku wpisy.php i właśnie z niego za pomocą kodu php chciałbym usunąć wybrany wpis. Pozdrawiam.
komentarz 24 lipca 2023 przez wizarddos Nałogowiec (25,930 p.)

Wiem, że najlepiej byłoby nowe wpisy umieszczać w bazie danych... ale z tym sobie na chwile obecną nie bardzo mogę poradzić...

Skoro wiesz że to lepsze, ale nie możesz sobie z tym poradzić to czemu nie zapytasz tutaj na forum, albo nie pogooglojesz tego?

komentarz 24 lipca 2023 przez VBService Ekspert (254,480 p.)
edycja 24 lipca 2023 przez VBService

@darknode, możesz pokazać, proszę kawałek kodu tego pliku z div-ami, jak masz to zapisane?

 

Wiem, że najlepiej byłoby nowe wpisy umieszczać w bazie danych ...

... Nowe wpisy zapisywane są w pliku wpisy.php i właśnie z niego za pomocą kodu php chciałbym usunąć wybrany wpis.

Twój wybór, ale z zapisem w pliku, też można sobie poradzić przez użycie np. file (lub file_get_contents i file_put_contents) i preg_replace

 

sprawdź  [ on-line ]

    function removeById($id) {
        $fileContent = file_get_contents('wpisy.dat');
        
        $pattern = '/<div\s+data-id="' . preg_quote($id, '/') . '">.*?<\/div>/si';
        $fileContent = preg_replace($pattern, null, $fileContent); // usuwa div
        $fileContent = preg_replace('/^\h*\v+/m', '', $fileContent); // usuwa pustą linie
        
        file_put_contents('wpisy.dat', $fileContent);
    }

 

komentarz 24 lipca 2023 przez darknode Początkujący (450 p.)

dziekuje za kod, w domu go przetestuje, jesli chodzi o baze danych, z czasem to na pewno zrobie, chyba, ze bedzie mozna usuwac 1 wybrany post bez ingerencji w caly plik.  przesylam kod. 

<div id="00374ea1">
<div class="post">
<div class="logo"></div>
<div class="id">User: 00374ea1</div>
<div class="time">00:17</div>
<div class="data">poniedziałek, 24 lipca 2023r</div>
<div class="text">aaa</div>
</div>
</div>

kazdy nowy post ma dany losowy id generowany przez random bytes 

komentarz 24 lipca 2023 przez darknode Początkujący (450 p.)

@VBService,  Niestety, w  moim przypadku skrypt nie działa, owszem, usuwa wpisy ale całą zawartość pliku wpisy.php

komentarz 24 lipca 2023 przez darknode Początkujący (450 p.)
Dziękuję za pomoc! wszystko działa tak, jak chciałem :)

mam jeszcze jedno pytanie, czy da się to połączyć jakoś, by poprzez input na stronie wkleić dany ID i go usunąć? po prostu połączyć go z input html.
komentarz 24 lipca 2023 przez darknode Początkujący (450 p.)
Już sobie poradziłem! jeszcze raz dziękuję za pomoc! :)
komentarz 24 lipca 2023 przez VBService Ekspert (254,480 p.)
edycja 24 lipca 2023 przez VBService

@darknode, można zrobić, żeby po kliknięciu usuwał,. coś w stylu

<section id="99374e01">
<div class="post">
<div class="logo"></div>
<div class="id">User: 99374e01</div>
<div class="time">00:17</div>
<div class="data">poniedziałek, 24 lipca 2023r</div>
<div class="text">aaa</div>
<div><button>Usuń</button></div>
</div>
</section>

przycisk 

<button>Usuń</button>

może być dodany w trakcie wyświetlania strony do każdego posta, nie musi być przechowywany w pliku (mniejszy plik na serwerze wink)

no i oczywiście "kawałek" kodu js-a do "obsługi" tego "ficzera", ale nie podaje na razie bo nie wiem czy Ciebie to interesuje.

komentarz 24 lipca 2023 przez VBService Ekspert (254,480 p.)
edycja 24 lipca 2023 przez VBService

W ogóle zamiast całego html-a, w pliku możesz przechowywać tylko podstawowe dane zapisane w formacie JSON

[{id:"99374e01",logo:"99374e01.png",name:"Lorem99374e01",time:"00:17",data:"24.07.2023",text:"Lorem ipsum set 99374e01"},
{id:"00374ea1",logo:"00374ea1.png",name:"Lorem00374ea1",time:"00:18",data:"24.07.2023",text:"Lorem ipsum set 00374ea1"}]

i za jego pomocą dopiero tworzyć kod html w trakcie wywołania strony, włącznie z dodaniem przycisku

<button>Usuń</button>

 jak napisałem wyżej.

1
komentarz 24 lipca 2023 przez darknode Początkujący (450 p.)

@VBService, Oczywiście, możesz podać kod js do tego zastosowania, na pewno zerknę i (pobawię) się nim.

ogólnie zrobiłem to w taki sposób

 $delete = $_POST['delete'];
 function removeById($id) {
 $fileContent = file_get_contents('wpisy.php');
 $pattern = '/<section\s+id="' . preg_quote($id, '/') . '">.*?<\/section>/si';
 $fileContent = preg_replace($pattern, null, $fileContent);
 $fileContent = preg_replace('/^\h*\v+/m', '', $fileContent);
 file_put_contents('wpisy.php', $fileContent);
 }
 removeById(''.$delete.'');
 echo str_repeat ('-', 50) . PHP_EOL;


<input name="delete" type="text"/>




wszystko działa, tylko nie działa gdy index jest zabezpieczony hasłem (hasło również zapisane w php w pliku)

 

$password = $_POST['password'] == 'haslo';
if ($password){
}
else
{
echo 'STRONA LOGOWANIA';
    exit();
}

w tedy powyższy plik z inputem już niestety nie reaguje.

A takie wpisy chciałbym usuwać w oddzielnej podstronie do której mam dostęp tylko ja, poprzez login i hasło, tak jak zrobiłem zapisywanie logów oraz blokowanie adresu ip który jest zapisywany do pliku również za pośrednictwem input.

komentarz 25 lipca 2023 przez VBService Ekspert (254,480 p.)

wszystko działa, tylko nie działa gdy index jest zabezpieczony hasłem (hasło również zapisane w php w pliku)

A takie wpisy chciałbym usuwać w oddzielnej podstronie do której mam dostęp tylko ja, poprzez login i hasło

poczytaj , jak przenosić dane między stronami php np.: 

komentarz 26 lipca 2023 przez darknode Początkujący (450 p.)

dziękuję, już sobie z tym poradziłem, mam jeszcze jedno pytanie, chciałbym zrobić tak, by posty się usuwały na głównej stronie (to działa) jak i na podstronie która jest zabezpieczona hasłem dla moderacji, sam kod :

<?php
 $usun = $_POST['usun'];
 function removeById($id) {

 $fileContent = file_get_contents('../wpisy.php');
 $pattern = '/<section\s+id="' . preg_quote($id, '/') . '">.*?<\/section>/si';
 $fileContent = preg_replace($pattern, null, $fileContent);
 $fileContent = preg_replace('/^\h*\v+/m', '', $fileContent);
 file_put_contents('../wpisy.php', $fileContent);

 }
 removeById(''.$usun.'');
 echo str_repeat ('-', 50) . PHP_EOL;
?>

usuwa ze strony głównej, ale gdy chcę, aby usuwał posty zapisane również na podstronie w logach i tworzę coś takiego:

<?php
 $usun = $_POST['usun'];
 function removeById($id) {

 $fileContent = file_get_contents('../wpisy.php');
 $fileContent = file_get_contents('../logi.php');
 $pattern = '/<section\s+id="' . preg_quote($id, '/') . '">.*?<\/section>/si';
 $fileContent = preg_replace($pattern, null, $fileContent);
 $fileContent = preg_replace('/^\h*\v+/m', '', $fileContent);
 file_put_contents('../wpisy.php', $fileContent);
 file_put_contents('logi.php', $fileContent);

 }
 removeById(''.$usun.'');
 echo str_repeat ('-', 50) . PHP_EOL;
?>

to owszem, usuwa na stronie głównej jak i na podstronie z logami, jednak że na stronie głównej pod każdym postem znajduje się część z logów, czyli adres ip jak i useragent gdzie nie powinno to być na stronie głównej, jest jakiś sposób, by temu zaradzić? Pozdrawiam.

komentarz 26 lipca 2023 przez darknode Początkujący (450 p.)

Powyższe pytanie nie aktualne, poradziłem sobie takim sposobem:

<?php
 $_GET = array_map("htmlentities", $_GET);
 $post = $_GET['post'];
 $dane= '
 '.$post.'
 ';
 $new = $dane;
 $odczytaj= file_get_contents("../txt/block-ip.php");
 $otworz= fopen("../txt/block-ip.php", "w+");
 $dane = $new.$odczytaj;
 fwrite($otworz, $dane);
 fwrite($otworz, "\r");
 fclose($otworz);

 $post = $_GET['post'];
 function removeById($id) {

 $fileContent = file_get_contents('../wpisy.php');
 $pattern = '/<section\s+id="' . preg_quote($id, '/') . '">.*?<\/section>/si';
 $fileContent = preg_replace($pattern, null, $fileContent);
 $fileContent = preg_replace('/^\h*\v+/m', '', $fileContent);
 file_put_contents('../wpisy.php', $fileContent);

 $filelogs = file_get_contents('logi.php');
 $pattern = '/<section\s+id="' . preg_quote($id, '/') . '">.*?<\/section>/si';
 $filelogs = preg_replace($pattern, null, $filelogs);
 $filelogs = preg_replace('/^\h*\v+/m', '', $filelogs);
 file_put_contents('logi.php', $filelogs);

 }
 removeById(''.$post.'');
 echo str_repeat ('-', 50) . PHP_EOL;
?>

:)

komentarz 26 lipca 2023 przez VBService Ekspert (254,480 p.)
edycja 26 lipca 2023 przez VBService

Po pierwsze, nie musisz stosować tego zapisu

echo str_repeat ('-', 50) . PHP_EOL;

w pierwszym przykładzie użyłem go tylko po to, żeby ułatwić czytanie na ekranie przykładowych danych. To jest zapis bardziej dla danych wyświetlanych w konsoli, w html możesz użyć zamiast str_repeat ('-', 50) np. <hr> a zamiast PHP_EOL po prostu <br>

<hr>
hr {
  border: none;
  border-top: 2px dashed black; /* styl linii przerywany (dashed) */
  width: 50%; /* Szerokość linii */
}
komentarz 26 lipca 2023 przez VBService Ekspert (254,480 p.)
edycja 26 lipca 2023 przez VBService

Czemu ma służyć ten zapis z dodawaniem (concatenation) pustego stringa '' przed i po zmiennej $post

 $post = $_GET['post'];
 $dane= ''.$post.'';
 $new = $dane;

 

ten cały zapis

 $_GET = array_map("htmlentities", $_GET);
 $post = $_GET['post'];
 $dane= ''.$post.'';
 $new = $dane;

zapisz np.

$_GET = array_map("htmlentities", $_GET);
$new = $_GET['post'];

 

ten kawałek kodu

 $_GET = array_map("htmlentities", $_GET);
 $post = $_GET['post']; // pierwsze odczytanie
 $dane= '
 '.$post.'
 ';
 $new = $dane;
 $odczytaj= file_get_contents("../txt/block-ip.php");
 $otworz= fopen("../txt/block-ip.php", "w+");
 $dane = $new.$odczytaj;
 fwrite($otworz, $dane);
 fwrite($otworz, "\r");
 fclose($otworz);
 
 $post = $_GET['post']; // niepotrzebne ponowne odczytanie 

 

spróbuj zapisać np. tak

 $_GET = array_map('htmlentities', $_GET);
 $post = $_GET['post']; 
 
 $dane = file_get_contents('../txt/block-ip.php');
 $dane = $post.$dane.'\n\r';
 file_put_contents('../txt/block-ip.php', $dane);

 

komentarz 26 lipca 2023 przez VBService Ekspert (254,480 p.)

Kolejna sprawa, staraj się nie powtarzać kodu (zasada DRY)

function removeById($id) {
 
 $fileContent = file_get_contents('../wpisy.php');
 $pattern = '/<section\s+id="' . preg_quote($id, '/') . '">.*?<\/section>/si';
 $fileContent = preg_replace($pattern, null, $fileContent);
 $fileContent = preg_replace('/^\h*\v+/m', '', $fileContent);
 file_put_contents('../wpisy.php', $fileContent);
 
 $filelogs = file_get_contents('logi.php');
 $pattern = '/<section\s+id="' . preg_quote($id, '/') . '">.*?<\/section>/si';
 $filelogs = preg_replace($pattern, null, $filelogs);
 $filelogs = preg_replace('/^\h*\v+/m', '', $filelogs);
 file_put_contents('logi.php', $filelogs);
 
 }

 

zapisz np.

 function removeById($id, $file) { 
    $fileContent = file_get_contents($file);
    $pattern = '/<section\s+id="' . preg_quote($id, '/') . '">.*?<\/section>/si';
    $fileContent = preg_replace($pattern, null, $fileContent);
    $fileContent = preg_replace('/^\h*\v+/m', '', $fileContent);
    file_put_contents($file, $fileContent); 
 }
 
removeById($post, '../wpisy.php'); 
removeById($post, 'logi.php');

 

komentarz 26 lipca 2023 przez VBService Ekspert (254,480 p.)

Czyli całość

<?php

  $_GET = array_map('htmlentities', $_GET);
  $post = $_GET['post']; 
 
  $dane = file_get_contents('../txt/block-ip.php');
  $dane = $post.$dane.'\n\r';
  file_put_contents('../txt/block-ip.php', $dane);

  function removeById($id, $file) { 
    $fileContent = file_get_contents($file);
    $pattern = '/<section\s+id="' . preg_quote($id, '/') . '">.*?<\/section>/si';
    $fileContent = preg_replace($pattern, null, $fileContent);
    $fileContent = preg_replace('/^\h*\v+/m', null, $fileContent);
    file_put_contents($file, $fileContent); 
  }
  
  removeById($post, '../wpisy.php'); 
  removeById($post, 'logi.php');
  echo '<hr>'; // zamiast str_repeat ('-', 50) . PHP_EOL;

?>
komentarz 26 lipca 2023 przez darknode Początkujący (450 p.)

@VBService, Dziękuję za radę, poprawiłem już kod.

 

$dane= ''.$post.'';

ten kawałek skryptu służy do przenoszenia samego adresu ip do dokumentu block-ip.php by móc dany adres ip zablokować wpisując go w input.

 

Tak przy okazji spytam jeszcze, ponieważ nowe logi widzę w czasie rzeczywistym przez funkcję

<script>
 new Ajax.PeriodicalUpdater('posty', 'logi.php',
  {
 method: 'get',
 frequency: 4,
 decay: 1
  });
</script>

wszystko działa, jednak problem jest taki, że gdy wejdę w sam plik poprzez adres url   adresstrony pl/logi/logi.php to sam plik z logami wyświetli się każdemu w przeglądarce, zastosowanie skryptu php :

<?php
 header('Location:../');
?>

nie działa, wyświetla się w podstronie logi jako strona główna a nie strona logowania

stosując skrypt w pliku logi.php na końcu:

 

<?php
header('Content-Type: application/json');
echo json_encode(['location'=>'/logi']);
exit;
?>

działa, generalnie logów nie widać pod adresem /logi/logi.php ale wciskając ctrl + u już widać w źródle strony, istnieje jakiś sposób by ukryć lub automatycznie przekierować na stronę główną po wejściu w /logi/logi.php?

komentarz 26 lipca 2023 przez VBService Ekspert (254,480 p.)
edycja 26 lipca 2023 przez VBService

pliki z rozrzedzeniem .php nie mogą być blokowane, bo straciłbyś możliwość i uruchomienia przez wywołanie np. adresstrony.pl/logi/logi.php, ale zapisz logi w pliku z rozszerzeniem np. .log i w folderze głównym utwórz plik .htaccess w którym zrób taki zapis

.htaccess

<FilesMatch "\.(dat|txt|log|xml)$">
  Order allow,deny
  Deny from all
</FilesMatch>

a pliki z tymi rozszerzeniami będą blokowane do odczytu z poziomu adresu url.

Zobacz na obrazku

index.php

<style>
  body {
    margin: 2em;
  }
  li {
    padding: .25em;
  }
</style>

<ul>
  <li><a href="logi.log">Logi.log</a></li>
  <li><a href="logi.txt">logi.txt</a></li>
  <li><a href="logi.dat">Logi.dat</a></li>
  <li><a href="logi.xml">Logi.xml</a></li>
</ul>

logi.log

test logi.log

logi.txt

test logi.txt

logi.dat

test logi.dat

logi.xml

<?xml version="1.0" encoding="UTF-8"?>
<root>
  <log_file>logi.xml</log_file>
</root>

dostęp do nich będzie miał kod php tylko.

komentarz 26 lipca 2023 przez darknode Początkujący (450 p.)
Po zastosowaniu tego rozwiązania owszem, pliku nie widać z poziomu url, ale logów na podstronie po zalogowaniu się również nie widać, komunikat:

Forbidden

You don't have permission to access this resource.
komentarz 26 lipca 2023 przez VBService Ekspert (254,480 p.)
edycja 27 lipca 2023 przez VBService

Spróbuj do podanego wyżej Mojego przykładu zastosować teraz taki np. plik

index.php

<?php
  $message = null;
  $files = [ null, 'logi.log', 'logi.txt', 'logi.dat', 'logi.xml' ];
  $demo_password = 'admin';

  if ($_SERVER["REQUEST_METHOD"] == "POST") {
    //var_dump($_POST);
    $password = $_POST['password'] ?? null;
        $file = $_POST['file'] ?? null;

    if ($password == $demo_password && $file) {
      $file = $files[(int)$file];
      $message = '<p class="allowed">'
               . '  Dostęp do pliku: <span>'.$file.'</span>'
               . '</p>'
               . '<pre>'.htmlspecialchars(file_get_contents($file)).'</pre>'; 
    } else {
      if (!$password)
        $message .= '<p class="error">'
                 . '  Podaj hasło aby wyświetlić plik'
                 . '</p>';
      else if ($password != $demo_password)
        $message .= '<p class="error">'
                  . '  Podane hasło jest nieprawidłowe'
                  . '</p>';
      if (!$file)
        $message .= '<p class="error">'
                  . '  Nie wybrano pliku.'
                  . '</p>';
    }
  }
?>

<style>
  body {
    margin: 2em;
  }
  ul {
    list-style: none;
    padding: 0;
  }
  li {
    padding: .25em;
  }
  pre {
    padding: 1em;
    background-color: black;
    color: limegreen;
    font: 400 .85em/1 system-ui, monospace;
  }
  label {
    cursor: pointer;
  }
  input[type="password"]::placeholder {
    font: 400 .85em/1 system-ui, monospace;
    color: rgb(0, 0, 0 / .4);
    padding-left: .25em;
  }
  .allowed {
    color: green;
  }
  .allowed span {
    font-weight: bold;
    color: black;
  }
  .error {
    color: red;
  }
</style>

<form method="post">
  <div>Zaznacz aby wyświetlić zawartość pliku</div>
  <ul>
    <li><label><input type="radio" name="file" value="1">Logi.log</label></li>
    <li><label><input type="radio" name="file" value="2">logi.txt</label></li>
    <li><label><input type="radio" name="file" value="3">Logi.dat</label></li>
    <li><label><input type="radio" name="file" value="4">Logi.xml</label></li>
  </ul>

  <label for="password">Hasło</label>
  <input type="password" id="password" name="password" placeholder="wpisz <?=$demo_password?>">
  <button type="submit">Pokaż</button>
</form>

<div>
  <?php echo $message;?>
</div>

<script>
  window.onload = () => {
    document.getElementById('password').focus();
  }
</script>

możesz teraz czytać pliki z poziomu php za pomocą np.

  • file_get_contents, file_put_contents itp.
  • include, require itp.

htmlspecialchars(...) - użyty tylko, żeby pokazać w <pre> kod xml z pliku logi.xml jako tekst.

komentarz 27 lipca 2023 przez darknode Początkujący (450 p.)
Niestety nie działa, nie wiem, moze robie coś źle, po zalogowaniu się wciąż widnieje komunikat Forbidden

You don't have permission to access this resource.

 

zamiast wyświetlać logi
komentarz 28 lipca 2023 przez VBService Ekspert (254,480 p.)
możesz pokazać, proszę zrzut ekranu Twojego głównego katalogu i kod tego skryptu do logowania się żeby mieć dostęp do logów
komentarz 28 lipca 2023 przez darknode Początkujący (450 p.)

Przesyłam zrzut ekranu podstrony w której są logi: https://ibb.co/3vRHh8D

Kod do logowania w pliku index.php wygląda tak:

<?php
 $username = $_POST['username'] == 'login';
 $password = $_POST['password'] == 'haslo';
 if ($username && $password){
}
else
{
echo '
<div id="strona">
<div class="login">
<form method="POST">
<div class="icon"></div>
<h1>Zaloguj się</h1>
<div class="password">
<div class="key"></div>
 <input placeholder="Login" name="username" type="text" autocomplete="off" required>
 <input placeholder="Hasło" name="password" type="password" autocomplete="off" required>
</div>
<div class="loguj">
 <button type="submit">Loguj</button>
</div>
</form>
</div>
</div>

</body>
</html>';
    exit();
}
?>

logi są wyświetlane za pomocą skryptu :

<script>
 new Ajax.PeriodicalUpdater('posty', 'logi.log',
  {
 method: 'get',
 frequency: 4,
 decay: 1
  });
</script>

zaraz za skryptem php od logowania.
Zauważyłem, że skrypt w php do logowania różni się podany przez Pana, w moim są chyba drobne błędy, nie chciałem w całym skrypcie umieszczać całej zawartości strony, i możliwe, że tu jest problem?  tylko zaraz za skryptem : exit(); }

komentarz 29 lipca 2023 przez darknode Początkujący (450 p.)

@VBService, Gdy wprowadzam odczyt logów poprzez php:

$otworz= fopen("logi.log", "a+");
$odczytaj= file_get_contents("logi.log");
echo $odczytaj;
fclose($otworz);

wszystko działa, ale gdy chcę wyświetlać logi poprzez ajax, żeby nowe wpisy pojawiały się bez odświeżania strony:

 new Ajax.PeriodicalUpdater('posty', 'logi.log',
  {
 method: 'get',
 frequency: 2,
 decay: 1
  });

już nie działa

komentarz 30 lipca 2023 przez VBService Ekspert (254,480 p.)

chcę wyświetlać logi poprzez ajax

rozumiem, że te logi mają być tylko wyświetlane dla Ciebie, jako administratora strony, tak?

komentarz 30 lipca 2023 przez darknode Początkujący (450 p.)
edycja 30 lipca 2023 przez darknode

dokładnie tak, widoczne tylko po wpisaniu loginu i hasła.

Poradziłem sobie już z tym, użyłem funkcji php zamiast ajax, jedyny minus, to to że logi nie będą wyświetlane na żywo tylko po odświeżeniu strony.

do tego zrobiłem funkcję usuwania wpisu poprzez 1 klikniecie <button> jak i poprzez 1 klikniecie blokowania adresu ip, w dość prymitywny sposób przyznam, plik z logami musi być wyświetlany poprzez rozszerzenie php ponieważ pod każdym logiem jest skrypt html do wykonania akcji usuwania wpisu jak napisałem wyżej, a sam plik zabezpieczyłem w taki sposób, że z każdym nowym logiem jest dodawane przekierowanie php na stronę główną, tak więc wyświetlić pliku się już nie da poprzez adres url :)  zapewne zrobiłem to źle, ale działa i to najważniejsze, nie zastosowałem javascriptu tak, jak proponowałeś wyżej (do usuwania wpisów) ponieważ javascript idzie mi opornie... lepiej przyswajam php :/ póki co, zostawie to tak jak jest, bo jest na prawde dobrze, szkoda tylko, że w takim przypadku nie mogę użyć ajax'a do automatycznego odświeżania logów. w każdym razie, dziękuję za pomoc! :) przesyłam troche kodu, jak to mniej więcej rozwiązałem.

$time = date('H:i');
$dzien = date('d');
$dzien_tyg = date('l');
$miesiac = date('n');
$rok = date('Y');
$miesiac_pl = array(1 => 'stycznia', 'lutego', 'marca', 'kwietnia', 'maja', 'czerwca', 'lipca', 'sierpnia', 'września', 'października', 'listopada', 'grudnia');
$dzien_tyg_pl = array('Monday' => 'poniedziałek', 'Tuesday' => 'wtorek', 'Wednesday' => 'środa', 'Thursday' => 'czwartek', 'Friday' => 'piątek', 'Saturday' => 'sobota', 'Sunday' => 'niedziela ');
$zawartosc= '
<section id="'.$id.'">
<?php header("location: / ");?>
<div class="post">
<div class="logo"></div>
<div class="id">User: '.$id.'</div>
<div class="time">'.$time.'</div>
<div class="data">'.$dzien_tyg_pl[$dzien_tyg].', '.$dzien.' '.$miesiac_pl[$miesiac].' '.$rok.'r'.'</div>
<div class="ip">IP: <a href="https://db-ip.com/'.$ip = $_SERVER['REMOTE_ADDR'].'" target="_blank"> '.$ip = $_SERVER['REMOTE_ADDR'].'</a></div>
<div class="user">UserAgent: '.$przegladarka=$_SERVER['HTTP_USER_AGENT'].'</div>
<div class="text">'.$post.'</div>
<div class="left">
<form action="wykonaj.php" method="get" onsubmit="return chat(this)">
<textarea name="usun" hidden>'.$ip.'</textarea>
<button type="submit">Blokuj</button>
</form>
</div>
<div class="right">
<form action="wykonaj.php" method="get" onsubmit="return chat(this)">
<textarea name="usun" hidden>'.$id.'</textarea>
<button type="submit">Usuń</button>
</form>
</div>
</div>
</section>
';
$new = $zawartosc;
$odczytaj= file_get_contents("../administrator/main/logi.php");
$plik = fopen("../administrator/main/logi.php", "w+");
$zawartosc = $new.$odczytaj;
fwrite($plik,$zawartosc);
fwrite($plik, "\r");
fclose($plik);

komentarz 31 lipca 2023 przez VBService Ekspert (254,480 p.)
edycja 31 lipca 2023 przez VBService

jak do logowania użyjesz session w php to w ajax-ie dla 

<script>
  new Ajax.PeriodicalUpdater('posty', 'logi.php?f=logi.log', {
    method: 'get',
    frequency: 4,
    decay: 1
  });
</script>

logi.php (coś w tym stylu, piszę z głowy)

<?php
  session_start();

  if ($_SESSION['admin_password'] == 'twoje haslo') {
    if ($_SERVER['REQUEST_METHOD'] == 'GET') {
      // Ścieżka do pliku, który chcesz przesłać
      // ?f=logi.log
      $filePath = $_GET['f'] ?? null; // w tym przypadku powinno być: logi.log

      if ($filePath) {
        // Sprawdzenie, czy plik istnieje
        if (file_exists($filePath)) {
          // Ustawienie nagłówków dla przeglądarki
          header('Content-Type: application/octet-stream');
          header('Content-Disposition: attachment; filename="' . basename($filePath) . '"');
          header('Content-Length: ' . filesize($filePath));

          // Odczytanie pliku i przesłanie zawartości do przeglądarki
          readfile($filePath);
          exit;
        } else {
          // Obsługa błędu, gdy plik nie istnieje
          echo 'Plik nie istnieje';
          exit;
        }
      } else {
        echo 'Brak nazwy pliku';
        exit;
      }
    }
  }
?>

 

 

BTW, pierwszy raz widzę użycie do tego <textarea> wink (wiem, że działa)

<textarea name="usun" hidden>'.$ip.'</textarea>

ale może lepiej do tego użyć <input>

<input type="hidden" name="usun" value="'.$ip.'">

 

komentarz 31 lipca 2023 przez VBService Ekspert (254,480 p.)

Poradziłem sobie już z tym, użyłem funkcji php zamiast ajax, jedyny minus, to to że logi nie będą wyświetlane na żywo tylko po odświeżeniu strony.

jak wrzucisz to do <iframe> możesz z poziomu js odświeżać tę ramkę umieszczoną w kodzie co daje efekt podobny do użycia ajax-a. wink

1
komentarz 31 lipca 2023 przez darknode Początkujący (450 p.)

Dziękuję, użyłem już wczoraj session

index.php :

<?php
 session_start();
 include("haslo.php"); //plik z hasłem
 $password = $_POST["password"];

 if (isset($dane[$password])) {

 $_SESSION["password"] = $password;
 header("Location: {$dane[$password]}");
 exit;
}

?>

 

<?
$dane["admin"] = "main";
?>

po zalogowaniu przekierowuje mnie na podstronę main (bez podania hasła nie da się podstrony odwiedzić)

a co do textarea to faktycznie, nie przemyślałem, użyłem już inputa :D

 

o iframe nie pomyślałem, może z czasem się pobawię z tym, jak na razie wyświetlanie logów poprzez skrypt php ma swoje plusy, można spokojnie przejrzeć wpisy, zablokować lub usunąć i nie przeszkadzają nowe wpisy w przypadku większego ruchu na stronie ;)

 

komentarz 1 sierpnia 2023 przez darknode Początkujący (450 p.)

@VBService, Miałbym jeszcze pytanie, czy istnieje jakiś prosty sposób, na napisanie prostego skryptu na polubienie wpisu? chodzi mi bardziej o kliknięcie lubie lub nie lubie, i zliczanie tego, oczywiście poprzez adres ip, nie przez ciasteczka, i również zapisywane w pliku na serwerze, coś jak licznik odwiedzin poprzez adres ip

komentarz 1 sierpnia 2023 przez darknode Początkujący (450 p.)

@VBService, Chodzi mi o coś takiego jak z tej strony: https://likebtn.com/en/like-button-generator

 

komentarz 1 sierpnia 2023 przez VBService Ekspert (254,480 p.)

@darknode, chodzi Tobie o "polubienia" pod danym postem?

<section id="99374e01">
  <div class="post">
    <div class="logo"></div>
    <div class="id">User: 99374e01</div>
    <div class="time">00:17</div>
    <div class="data">poniedziałek, 24 lipca 2023r</div>
    <div class="text">aaa</div>
    <div class="like">
      <span>ikona up vote</span><span>0</span>
      <span>ikona down vote</span><span>0</span>
    </div>
    <div><button>Usuń</button></div>
  </div>
</section>

 

komentarz 1 sierpnia 2023 przez darknode Początkujący (450 p.)
tak, dokładnie tak, coś jak reakcja na fb pod postem, tylko tutaj pod każdym wpisem lubie to lub nie lubie, żeby 1 klik polubienia lub nie polubienia był zapisywany przez 1 adres ip
komentarz 1 sierpnia 2023 przez VBService Ekspert (254,480 p.)

Jak u Ciebie wstawia się posty anonimowo i lub po zalogowaniu, czy tylko po zalogowaniu, czy tylko anonimowo?

Pytam bo po samej ip-ce może nie do końca zadziałać, bo np. w bloku mogą mieć różne mieszkania zewnętrzny wspólny adres ip ten sam, jak mają np. internet od osiedlowego tego samego dostawcy.

komentarz 1 sierpnia 2023 przez darknode Początkujący (450 p.)
edycja 1 sierpnia 2023 przez darknode
tylko anonimowo, każdy dodany wpis zbiera ip do logów

i tak wiem, że dynamiczne ip może się zmienić, że w 1 sieci lan może być pare osób itp, ale mimo to, chciałbym to zrobić w taki sposób, niestety nie mam jeszcze na stronie możliwość rejestrowania kont by podpiąć polubienia pod danego użytkownika, chyba, ze istnieje lepsza możliwość polubienia od samego adresu ip?
komentarz 16 września 2023 przez darknode Początkujący (450 p.)

@VBService,  Miałbym jeszcze jedno pytanie, wracając do tematu, zastosowałem do tych logów kod: <?php header("Content-Type: image/x-icon");?> który ma za zadanie wyświetlić obraz, ale to nie o to chodzi, chodzi mi o to, czy jest to na tyle bezpieczne, by uniemożliwić podejrzenie logów z pliku za pomocą adresu url ../../logi.php?  po wejściu na sam adres pliku, wyświetla się informacja, że obraz nie może zostać wykryty ponieważ wykrywa błędy, wciśnięcie przycisku ctrl + u by wejść w źródło strony, również nic nie daje, i jak dla mnie, jest to plus, tylko pytanie, czy ten kawałek skryptu jest na tyle skuteczny, by nie można było podejrzeć logów za pomocą przeglądarki?  Pozdrawiam.

1 odpowiedź

0 głosów
odpowiedź 24 lipca 2023 przez VBService Ekspert (254,480 p.)
edycja 24 lipca 2023 przez VBService

Dziękuję za pomoc! wszystko działa tak, jak chciałem :)

 

bo RegExp patern jest "ustawiony" dla div-a, bez kolejnych div-ów w "środku"

$pattern = '/<div\s+data-id="' . preg_quote($id, '/') . '">.*?<\/div>/si'

 

ale taki zapis już daje radę z zagnieżdżonym kodem html we wnętrzu tym razem np. <section>

 [ on-line ]

    function removeById($id) {
        $fileContent = file_get_contents('wpisy.dat');
        
        $pattern = '/<section\s+id="' . preg_quote($id, '/') . '">.*?<\/section>/si';
        $fileContent = preg_replace($pattern, null, $fileContent); // usuwa <section>...</section>
        $fileContent = preg_replace('/^\h*\v+/m', '', $fileContent); // usuwa puste linie po kasowaniu <section>
        
        file_put_contents('wpisy.dat', $fileContent);
    }

dla np

<section id="99374e01">
<div class="post">
<div class="logo"></div>
<div class="id">User: 99374e01</div>
<div class="time">00:17</div>
<div class="data">poniedziałek, 24 lipca 2023r</div>
<div class="text">aaa</div>
</div>
</section>
<section id="00374ea1">
<div class="post">
<div class="logo"></div>
<div class="id">User: 00374ea1</div>
<div class="time">00:17</div>
<div class="data">poniedziałek, 24 lipca 2023r</div>
<div class="text">aaa</div>
</div>
</section>
<section id="00454eff">
<div class="post">
<div class="logo"></div>
<div class="id">User: 00454eff</div>
<div class="time">00:17</div>
<div class="data">poniedziałek, 24 lipca 2023r</div>
<div class="text">aaa</div>
</div>
</section>
<section id="ab454eff">
<div class="post">
<div class="logo"></div>
<div class="id">User: ab454eff</div>
<div class="time">00:17</div>
<div class="data">poniedziałek, 24 lipca 2023r</div>
<div class="text">aaa</div>
</div>
</section>

 

Podobne pytania

0 głosów
1 odpowiedź 655 wizyt
pytanie zadane 18 czerwca 2021 w C# przez disaster Bywalec (2,120 p.)
0 głosów
1 odpowiedź 790 wizyt
pytanie zadane 17 czerwca 2017 w PHP przez ThePatrykOOO Dyskutant (8,400 p.)
0 głosów
1 odpowiedź 262 wizyt
pytanie zadane 21 lutego 2018 w JavaScript przez Alan1221 Użytkownik (950 p.)

92,632 zapytań

141,500 odpowiedzi

319,879 komentarzy

62,013 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...