[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

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?

0
maniek_2 napisał(a)

Inna sprawa, czy nie warto uzyc file() aby pobrac zawartosc pliku do tablicy?

dokładnie, a potem usunąć puste linie

0

@Adamo: dzieki za test blokowania
@maniek_2: było "\n\n" bo chcę rozdzielić tylko wtedy gdy jest podwójne przełamanie wiersza, a do tego racazej file() mi nie posłuży. I skoro w linuxie jest tylko znak nowej linii to skoro wysylam z linuxa to dlaczego jak dalem "\r\n\r\n" to działa? poza tym czy to, że z linuxa ma <ort>w ogóle </ort>coś do rzeczyprzy wywyłaniu danych formularzem?

0

no firefox raczej wyśle \r\n i wydaje mi się że to jest objęte standardem więc możesz zastosować w skrypcie spokojnie \r\n
albo zamienić na początku w wejściu \r\n na \n i nie będzie też problemu, albo zastosować file któremu wszystko jedno, np:

$wiedza = explode('<br /><br />',
          implode('<br />',
          file('wiedza.txt')));
0
Adamo napisał(a)
$wiedza = explode('<br /><br />',
          implode('<br />',
          file('wiedza.txt')));

Dzięki, działa tyle, że z małą poprawką:

$wiedza = explode('<br />\n<br />',
          implode('<br />',
          file('wiedza.txt')));

A co jeszcze dziwniejsze, tak już nie działa:

$wiedza = explode('<br />\n<br />\n',
          implode('<br />',
          file('wiedza.txt')));
0
ciapek888 napisał(a)

I skoro w linuxie jest tylko znak nowej linii to skoro wysylam z linuxa to dlaczego jak dalem "\r\n\r\n" to działa?

Dlatego, że powrót karetki jest zwyczajnie ignorowany (system "wie", ze MS i tez inne systemy stosuja powrót karetki).

0

@maniek_2: raczej nie, bo jak daje "\n\n" to nie działa...

0

kur, skończcie już
jest to ustalone standardem, już na pewno bo sprawdziłem
wszyscy happy - koniec dyskusji

0

jeszcze jedna poprawka::

$wiedza = explode("<br /><br />",
          implode("<br />",
          array_map("rtrim",
          file("wiedza.txt"))));

teraz dopiero działa poprawnie :-)

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