Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailem PHP - při zápisu dat do souboru, přidá prázdný řádek.

Ahoj,
řeším doufám že maličkost. Mám to trochu složitější a nechce se mi sem dávat všechny scripty, atd. Ale třeba bude stačit jen kousek. Mám kód kterým ukládám proměnou, která je složena z více proměnných, do souboru který neexistuje, ale vytvoří se, je soubor .cgi vlastně ho beru jako csv. Ale při uložení mi ty data hodí na jeden řádek, to je OK, ale když dám šipku dolů (v editaci toho souboru) tak je tam další řádek (prázdný), ten mi pak zobrazuje prázdnou buňku v table, když jej pomocí while a fgets zobrazuji.
Ten kód:

$fp = FOpen ("soubor.cgi", "w"); 
FWrite ($fp, $write); 
FClose ($fp);

A kód na zobrazování:

$soubor1=fopen("soubor.cgi", "r");     
	while (!feof($soubor1)){ 	
		$radek = fgets($soubor1,5000); 
			$radek2 = str_replace(';','</td><td>',$radek);
      $radek3 = str_replace('"'," ",$radek2); 	
      $novy = ('<tr align="center"><td>'.$radek3.'</td></tr>');	
      echo $novy;
	}
echo ('</table>');

Já nevím co mám dělat. Kdyžtak více vysvětlím.

Předmět Autor Datum
a proč nepoužiješ (un)serialize()? Místo řešení nějakých čachrů. A je nějaký důvod vypisovat to v t…
Fuka 27.05.2014 23:22
Fuka
No serialize neznám, myslíš jako třeba? $write2 = unserialize ($write); To mi nefunguje. Momentál…
Vlk89 28.05.2014 07:42
Vlk89
Prečítaj si dokumentáciu k funkciám feof a fgets, aby si ich používal správne. Pretože kým si nenačí…
los 28.05.2014 08:27
los
Jo to jsem četl, základ jsem pochopil, ale co víc se s tím dá dělat, nějak nevím, třeba fgets přečte… poslední
Vlk89 28.05.2014 12:31
Vlk89

a proč nepoužiješ (un)serialize()? Místo řešení nějakých čachrů.

A je nějaký důvod vypisovat to v tabulce, když už si na paškál beru ten slepenec HTML a PHP?

Jinak máš tedy dost rustikální coding standard, ... fopen, FOpen; indenty, mezery.

No serialize neznám, myslíš jako třeba?

$write2 = unserialize ($write);

To mi nefunguje.

Momentálně to zkouším do tabulky, zkusím to zobrazit jinak, ale mám obavy, že to furt bude dělat zmatek s tím prázdným řádkem.

Je mi jasný, že vzhled kódu není to pravý ořechový, a celkově mám takovou patlaninu, ale učím se, a zkouším. Samozdřejmě jestli z toho něco vznikne tak kód upravím.

Prečítaj si dokumentáciu k funkciám feof a fgets, aby si ich používal správne. Pretože kým si nenačítal koniec súboru cez fgets, tak feof ti vráti FALSE. Ten kód by mohol vyzerať skôr nejako takto (nepotrebuješ ani použiť feof):

while (($radek = fgets($soubor, 5000)) !== FALSE) {
	...
}

Pokiaľ ale máš v súbore ten prázdny riadok naozaj zapísaný, tak sa pozri aj na to, čo máš v premennej $write. Ináč na takéto jednoduché veci by som skôr použil file_get_contents a file_put_contents, ktoré prečíta/zapíše celý súbor naraz.

Jo to jsem četl, základ jsem pochopil, ale co víc se s tím dá dělat, nějak nevím, třeba fgets přečte řádek, while to opakuje, !==FALSE to znamená asi že když dojede na konec souboru (textu) tak fgets hodí False a while skončí, je to tak nějak?

Kód jsem zkusil a je to super, ale nechápu jak může rozdělit z jednoho řádku od sebe jednotlivá data? Teď mám kód:

while (($radek = fgets($soubor, 5000)) !== FALSE) {		  			
$radek2 = str_replace(";","</td><td>",$radek);
$radek3 = str_replace('"',"",$radek2);
$novy = ('<tr align="center"><td>'.$radek3.'</td></tr>');
echo $novy;
}

Když na zkoušku oddělám nahrazení středníku těma tagama pro tabulku, tak se samozdřejmě rozhodí, ale proč, jedině, že nějak pozná že právě chci udělat řádky, no nechápu to :-)

V proměnné $write mám jen data, které mi script oddělí středníkem, a když dám echo hned pod proměnnou $write, tak mi to zobrazí správně, ale do souboru se uloží řádek navíc a ještě k tomu $data2 s uvozovkama. I když dám jen čistě, půl kódu viz. dole, uložení jenom samotného $write do souboru který zrovna i vytvoří.

define('S', ";");
$write = $data1.S.$data2.S.$data3.S.$data4; 

if (file_exists ("soubor.cgi")){
$fp = fopen ("soubor.cgi", "r");
$data = fread ($fp, filesize("soubor.cgi"));
fclose($fp);
}
$fp = fopen ("soubor.cgi", "w");
fwrite ($fp, $data.$write); 
fclose ($fp); 

No a používám fopen, fread a fwrite, protože soubor se musí vytvořit sám v tomto scriptu, do té doby neexistuje.

Zpět do poradny Odpovědět na původní otázku Nahoru