[php] explode

0

mam sobie formularz i jedno z jego pol nazywa się "wiedza" i po wyslaniu taki kod zapisuje do pliku:

if($_POST["wiedza"]!="wiedza..."||$_POST["wiedza"]!="") {
    $this->wiedza = rtrim($_POST["wiedza"]);
    zapisz($this->katalog."wiedza.txt", $this->wiedza);
}

a potem taki fragment kodu odczytuje:

$wiedza = explode("\n\n", file_get_contents("wiedza.txt"));
for($i=0;$i<count($wiedza);$i++) $wiedza[$i] = implode("<br />", explode("\n", $wiedza[$i]));

i działa oprócz pierwszej funkcji explode :/
Wyświetla mi tekst z zamienionymi podwójnymi znakami nowego wiersza na podwójne tagi
, czemu?

0

Moze zapisany jest jako html - bo innego pomyslu nie mam.

pozdrawiam
johny

0

pewnie dlatego że plik wejściowy ma znaki nowej linii zapisany w windowsowskim stylu tj \r\n a nie \n

0

Fakt, nie doczytalem posta do konca [wstyd]

0

wniosek z tego taki, że rtrim dodaje do każdego znaku nowego wiersza powrót karetki
powinni pisać takie rzeczy w manualu :/

0

ale nie dodaje, on usuwa puste znaki z prawej strony
jak wygląda funkcja zapisz nawet nie napisałeś

0

oto funkcja zapisz:

function zapisz($sciezka, $zapis) {
    $uchwyt = fopen($sciezka, "a");
    do {
        if(flock($uchwyt, LOCK_EX)) {
            ftruncate($uchwyt, 0);
            fwrite($uchwyt, $zapis);
            flock($uchwyt, LOCK_UN);    
            $r = 0;
        }
        else $r = 1;
    } while($r==1);
    fclose($uchwyt);
}

nie wiem co to ma do rzeczy, ale napiszcie przy okazji czy dobrze zrobiłem blokowanie pliku?

0

no to w ogóle nie rozdzielasz na linijki
blokowanie chyba dobrze no ale wydaje mi się że pętla jest niepotrzebna i już php sam sobie oczeka aż plik będzie dostępny

chodzi o to że znaki linii są normalnie w całym tekście \r\n a rtrim usuwa puste znaki (\r, \n, \t, spacje) z końca stringa, a nie z każdej linii w stringu, rozumiesz różnicę ?

0

ta linijka:

if(flock($uchwyt, LOCK_EX))

oznacza "Jezeli blokowanie całkowite się powiodło..." więc jak się ort! to parser olewa to co po warunku i leci dalej z kodem, więc pętla chyba potrzebna...

Do czego służy rtrim, to raczej wiem, tylko ort!, że w dany wprowazdaych w formularzu każde przełamanie wiersza się zapisuje jako "\r\n"...

"nie" z czasownikami piszemy osobno... - Cold

0

bo nie jestem pewien ale to chyba zależy od systemu / przeglądarki, w każdym razie na pewno większość wysyła \r\n (chyba że jest to ustalone standardem, nie znam sie)

i nie musisz raczej stosować pętli przy flock bo zrobiłem test - 3 skrypty bardzo podobne, pierwszy miał za zadanie zablokować plik na 30 sekund, drugi normalnie odwołać się do pliku zapisując coś do niego, trzeci to samo ale w pętli podobnej do powyższej

<?php
function nlog($s){
  echo date('H:i,s') . ' - ' . $s . "<br>\r\n";
}

$f = fopen('plik.txt', 'a');
nlog('Oczekuję na dostęp do pliku');
flock($f, LOCK_EX);
nlog('Blokuję plik');
sleep(30);
flock($f, LOCK_UN);
nlog('Zwalniam plik');
fclose($f);

?>

drugi bardzo podobny:

<?php
<?php
function nlog($s){
  echo date('H:i,s') . ' - ' . $s . "<br>\r\n";
}

$f = fopen('plik.txt', 'a');
nlog('Oczekuję na dostęp do pliku');
flock($f, LOCK_EX);
nlog('Blokuję plik');
fwrite($f, 'Costam');
sleep(10);
flock($f, LOCK_UN);
nlog('Zwalniam plik');
fclose($f);

?>

a trzeci jeszcze bardziej:

<?php
function nlog($s){
  echo date('H:i,s') . ' - ' . $s . "<br>\r\n";
}

$f = fopen('plik.txt', 'a');
nlog('Oczekuję na dostęp do pliku');
while(!flock($f, LOCK_EX))
  nlog('Ponawiam próbę');
nlog('Blokuję plik');
sleep(10);
flock($f, LOCK_UN);
nlog('Zwalniam plik');
fclose($f);

?>

wszystkie skrypty potem wypisały log który wyglądał następująco:

Skrypt 1:
15:55,43 - Oczekuję na dostęp do pliku
15:55,43 - Blokuję plik
15:56,13 - Zwalniam plik

Skrypt 2:
15:55,48 - Oczekuję na dostęp do pliku
15:56,13 - Blokuję plik
15:56,23 - Zwalniam plik

Skrypt 3:
15:55,50 - Oczekuję na dostęp do pliku
15:56,23 - Blokuję plik
15:56,33 - Zwalniam plik

jak widać funkcja flock grzecznie czeka na dostęp do pliku, nie trzeba jej robić pętli
pętla nie zrobiło ani jednego dodatkowego obrotu bo inaczej w 3 skrypcie pisałoby "Ponawiam próbę", więc flock zwraca false kiedy nie może naprawdę uzyskać dostępu do pliku i wypadałoby zakończyć działanie skryptu, inaczej może dojść do nieskończonej pętli

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0