Малко рамо за функцията $fopen()

Smirnoff

Registered
Значи функцията е :
fopen("file.txt", "r");

Но ей тия модове :

r
r+
w
w+
a
a+
x
x+

дето се слагат след файла "file.txt", немога да ги запомня.
Чел съм ги на английски и пак нестава. Някой да може да ми ги обесни на чист, роден, майчин Български ще съм му истински благодарен!
 

bafitu

Registered
r само за четене
r+ за четене и записване
w само за записване създава файла ако го няма, изтрива предишните данни и записва новите.
w+ за записване и четене,ъздава файла ако го няма, изтрива предишните данни и записва новите.
a само за записване, записва данните след текущите във файла т.е. неизтрива предишните данни.
a+ за записване и четене, записва данните след текущите във файла т.е. неизтрива предишните данни.

x и x+ не ти трябват :)
 

bafitu

Registered
е добре ти какво иска?
r+ почва от началото на файла да записва.
имаш файл file.txt
в него има текста : 456
като искаш да запишеш нещо примерно 123 искаш да е преди този запис т.е. да стане 123456 ?
 

Smirnoff

Registered
bafitu каза:
е добре ти какво иска?
r+ почва от началото на файла да записва.
имаш файл file.txt
в него има текста : 456
като искаш да запишеш нещо примерно 123 искаш да е преди този запис т.е. да стане 123456 ?

А точно това искам, но като погледна файла е записано само последните данни които съм въвел :shock:
 

bafitu

Registered
Код:
<?
$FileToReadFrom = "file.txt";
$anothertext = "123";
$FileToOpen = fopen($FileToReadFrom, 'r');
$infile = @fread($FileToOpen, filesize($FileToReadFrom));
fclose($FileToOpen);
$FileToOpen = fopen($FileToReadFrom, 'w');
$all = $anothertext.$infile;
fwrite($FileToOpen, $all);
fclose($FileToOpen);
?>

пробвай това.
 

Smirnoff

Registered
bafitu каза:
Код:
<?
$FileToReadFrom = "file.txt";
$anothertext = "123";
$FileToOpen = fopen($FileToReadFrom, 'r');
$infile = @fread($FileToOpen, filesize($FileToReadFrom));
fclose($FileToOpen);
$FileToOpen = fopen($FileToReadFrom, 'w');
$all = $anothertext.$infile;
fwrite($FileToOpen, $all);
fclose($FileToOpen);
?>

пробвай това.

Това стана :?:
Но защо като заменя $infile = @fread($FileToOpen, filesize($FileToReadFrom));

със : $infile = "<br>";

и се получава пак старата песен на нов глас.. пак трие всичко и записва на ново :?
 

bafitu

Registered
защото fread();
чете съдържанието на файла.
Принципа на този скрипт е следния :
Код:
<?
$FileToReadFrom = "file.txt"; //  файла 
$anothertext = "123"; // текста който ще е преди този във файла
$FileToOpen = fopen($FileToReadFrom, 'r'); // отваряме файла 
$infile = @fread($FileToOpen, filesize($FileToReadFrom)); // четем съдържанието и го предаваме на $infile
fclose($FileToOpen); // затваряме файла
$FileToOpen = fopen($FileToReadFrom, 'w'); // отваряме файла с параметър за записване "w" 
$all = $anothertext.$infile; // $all получава стойноста на : Новият текст ($anothertext) + текста който е в момента (от fread го взимаме) 
fwrite($FileToOpen, $all); // записваме 
fclose($FileToOpen); // затваряме
?>
защо ти е <br> какво искаш да направиш?
 

Smirnoff

Registered
Щото ми трябва след сяко записване да слага <br> и после като include файла, съдържанието му да става едно под друго демек ако във файла имам

bafitu<br>Smirnoff<br>bafitu<br>smirnoff

като го инклудна ще стане така :

bafitu
Smirnoff
bafitu
Smirnoff
:wink:

Но като сложа <br> съвсем ми се оплесква скрипта... :(
 

Smirnoff

Registered
ооо.. НЕ!

Отказвам се вече, и тва нестава.
Ще пробвам да го напрая с база данни.
Но ако мога да попитам как да записвам инфото в таблиците и после да го искарвам в сайта.
Ясно е че с тия прости файлове няма да стане :(
 

sizif

Registered
Здравейте!

Smirnoff, много бързо се отказваш. :( Ако не става по един начин, търсиш друг. Поне аз почувствах, че напредвам, едва когато започнах да упорствам с грешките. :)
Кода на bafitu би трябвало да ти свърши работа, макар да не ми се струва много удачен, ако се налага работа с дълги низове (първо четеш, после отново записваш прочетенето + новия низ), но щом при добявяне на някакъв таг ти дава проблем, може би имаш грешка в синтаксиса.
Ако искаш, пусни целия код тук и ще се опитам да го подкарам.

Иначе пробвах r+ при запис и при мен не се получи, така както смятах (правил съм, какви ли не операции с файлове, но се оказа, че все съм ползвал или а+ или w+), затова ми хрумна че съдържанието на файла може да се прехвърли в масив като всеки ред е елемент в него.

Ето ти демо: http://probna.awardspace.com/demo3/forma.htm

А ето и кода, който изпълнява задачата:

forma.htm (стандартен хтмл):

<BR><CENTER><FORM METHOD="POST" ACTION="http://probna.awardspace.com/demo3/zapis.php">
<INPUT TYPE="TEXT" NAME="ime" size="30" maxlenght=25>
<INPUT TYPE="SUBMIT" VALUE="Изпрати!" NAME="">


zapis.php (тук синтаксисът е типов, отваряме файла "tekstovi.txt" за запис със стойност "а+". За да можем след това да отделим записите, всеки запис е на нов ред)

<?
$filelocation="/home/www/probna.awardspace.com/demo3/tekstovi.txt";
$newfile = fopen($filelocation,"a+");
fwrite($newfile, "\n$ime");
fclose($newfile);
echo "Запис!";
?>
<BR><A HREF="http://probna.awardspace.com/demo3/list.php">Виж списъка!</A>


list.php (разковничето е при листването, а не при записа. Тук правя няколко проверки защото в демото има опция за изтриване. Кода в червено е важния, ще го обясня по-долу)

<HTML>
<HEAD>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=windows-1251">
</HEAD>
<BODY>

<BR><B> ПОТРЕБИТЕЛИ:</B>
<BR>
<?
if (file_exists ("tekstovi.txt")) {

$filelocation="/home/www/probna.awardspace.com/demo3/tekstovi.txt";
$fm=file("$filelocation");

$spisyk=array_reverse($fm);
$kolko=count($spisyk);

for ($i=0; $i<$kolko; $i++){
$red=$spisyk[$i];
echo "<BR>$red";
}

}
else {
echo "<BR>Няма направени записи!";
}
?>
<BR><A HREF="forma.htm"><B>Нов запис!</B></A>
<BR><A HREF="del.php"><B>Изчисти списъка! (изтрива файла)</B></A>
</BODY>
</HTML>


И del.php, който изтрива текстовия файл, в който се правят записите:

<HTML>
<HEAD>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=windows-1251">
<META HTTP-EQUIV="refresh" CONTENT="5;URL=http://probna.awardspace.com/demo3/list.php" >
</HEAD>
<BODY>
<?
$filelocation="/home/www/probna.awardspace.com/demo3/tekstovi.txt";
if (!@unlink ($filelocation)) {
echo "Няма направени записи, за да бъдат изтрити! (в нашия случай файлът не съществува)";
}
else {
echo "Списъкът бе изтрит успешно!";
}
?>

</BODY>
</HTML>


Ето и обяснението на кода в червено:

<?
$filelocation="/home/www/probna.awardspace.com/demo3/tekstovi.txt";
\\пътят до файла, името на променливата е прозивлоно, на нейното място в долния ред може да бъде и самия файл
$fm=file("$filelocation"); \\отваряме файла за четене - функцията file(); връща масив - в нашия случай $fm[], в който всеки елемент е ред от файла. Името на масива е избрано произволно. Ако обходим този масив и го принтираме ще получим същото, което и при четене на файла, т.е. този масив в този си вид не ни върши работа, тъй като последният запис във файла е на последна позиция, а ние искаме обратното.

$spisyk=array_reverse($fm);\\пренареждаме масива $fm[] чрез функцията array_reverse();. Тя създава нов масив, наричаме го $spisyk[]. Този масив вече е подреден "правилно" - в него последният запис от файла е на първо място
$kolko=count($spisyk);\\преброяваме елементите на масива $spisyk[], за да можем да го обходим изцяло.

for ($i=0; $i<$kolko; $i++){\\с цикъл фор обхождаме масива. По подразбиране, индексирането му е цифрово и започва от нула. Конструкцията на цикъла е типова
$red=$spisyk[$i];
echo "<BR>$red";\\листваме масива елемент по елемент като му слагаме и новия ред
}
?>


Това е основното. Ако съм преповторил неща, които знаеш, извинявай - стремях се към изчерпателност. За БД не мога да помагам, защото сега навлизам в тях. Ако имаш въпроси по кода или за работа с файлове, пиши!
Надявам се, че съм бил полезен. Успех!
 

Горе