[php] explode

Odpowiedz Nowy wątek
2006-11-02 18:09
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?


It's not just about livin' forever Johny.
The trick is livin' with yourself forever.

Pozostało 580 znaków

2006-11-02 20:00
0

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

pozdrawiam
johny


You need to learn how to walk
before you can run

Pozostało 580 znaków

2006-11-02 20:38
0

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


Dwie zasady gwarantujące sukces:
1. Nigdy nie mów nikomu wszystkiego<span style="color: white">

Pozostało 580 znaków

2006-11-02 20:44
0

Fakt, nie doczytalem posta do konca [wstyd]


You need to learn how to walk
before you can run

Pozostało 580 znaków

2006-11-02 23:07
0

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


It's not just about livin' forever Johny.
The trick is livin' with yourself forever.

Pozostało 580 znaków

2006-11-02 23:24
0

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


Dwie zasady gwarantujące sukces:
1. Nigdy nie mów nikomu wszystkiego<span style="color: white">

Pozostało 580 znaków

2006-11-02 23:41
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?


It's not just about livin' forever Johny.
The trick is livin' with yourself forever.

Pozostało 580 znaków

2006-11-02 23:55
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ę ?


Dwie zasady gwarantujące sukces:
1. Nigdy nie mów nikomu wszystkiego<span style="color: white">

Pozostało 580 znaków

2006-11-03 14:46
0

ta linijka:

if(flock($uchwyt, LOCK_EX))

oznacza "Jezeli blokowanie całkowite się powiodło..." więc jak się <ort>niepowiodło</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>niewiedziałem</ort>, że w dany wprowazdaych w formularzu każde przełamanie wiersza się zapisuje jako "\r\n"...

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


It's not just about livin' forever Johny.
The trick is livin' with yourself forever.

Pozostało 580 znaków

2006-11-04 15:58
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


Dwie zasady gwarantujące sukces:
1. Nigdy nie mów nikomu wszystkiego<span style="color: white">

Pozostało 580 znaków

2006-11-04 17:20
maniek_2
0
ciapek888 napisał(a)

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

W windowsie taki zapis obowiazkuje czyli powrót karetki i znak nowej linii. W linuxie jest tylko \n (znak nowej linii). Znowu np. w macOS'ach stosuje sie tylko znak karetki do oznaczania nowej linii.
Podales, ze zapisujesz \r\n a w powyzszym przykladzie masz \n\n. Inna sprawa, czy nie warto uzyc file() aby pobrac zawartosc pliku do tablicy?

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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