Файлове (Част 3)

Записване на данните във файл


За да прочетем информация от даден файл, първо е необходимо да я запишем в него. Записването на файл на сървъра преминава през четири етапа:
  1. Проверка дали файлът съществува и дали в него може да се записва информация.
  2. Отваряне на файла.
  3. Запис на данните.
  4. Затваряне на файла.
В РНР, за изпълнение на всяко от тези действия, има вградена функция: is_writable (), fopen (), fwrite (), fclose ().

Функция is_writable ()

Функцията is_writable () проверява дали файлът съществува и в него може да бъде записвана информация. Синтаксисът на функцията е:

bool is_writable ( string $filename)

$filename- задължителен параметър, съдържащ името на файла (или директорията), който (която) ще проверяваме дали съществува и, дали е записваем (записваема).

Забележка:

Резултатът, който връща функцията is_writable () се кешира. За да изтриете кеша е необходимо да използвате функцията clearstatcache().

Повече информация: http://php.net

Функция fopen ()

Функцията fopen () служи за създаване или отваряне на файл или URL. Синтаксисът ѝ е следния:

fopen ( string $filename , string $mode
[, bool $use_include_path [, resource $context ]])

Какво e значението на всеки един от параметрите на функцията?

$filename- задължителен параметър. Съдържа името на файла или URL-а, който ще се отваря.

$mode- задължителен параметър. Определя типа на достъп до файла или потока. Списък за възможните режими при работа ($mode) на функцията fopen() можете да намерите на адрес: http://php.net/

$use_include_path- незадължителен параметър. Изберете стойност 1, ако искате да търсите файла и по пътя, указан в include_path (на php.ini файла).

$context- незадължителен параметър. Този параметър може да промени режима на работа на потока (stream).

Забележка:

Знакът за край на ред е различен в зависимост от операционната система, с която работите. Когато се опитате да пишете във файл, но това е невъзможно, най-вероятно нямате права за писане. При операционни системи, които правят разлика между двоични и текстови файлове (като Windows), файлът трябва да е отворен с флаг "b" при извикването на fopen().

Повече информация: http://php.net

Функция fwrite ()

Тази функция се прилага за двоично безопасно записване във файл.

Синтаксисът ѝ е следния:

int fwrite (resource $handle, string $string[, int $length])

$handle- задължителен параметър, определящ кой е файлът, в който ще пишем.

$string- задължителен параметър, съдържащ стринга, който ще се впише във файла.

$length- незадължителен параметър. Определя максималния брой байтове, които могат да бъдат записани. Ако сме задали стойност на този параметър, опцията magic_quotes_runtime в php.ini файла, ще бъде игнорирана, в резултат на което, ако в $string има наклонени черти, те няма да бъдат изрязани.

Повече информация: http://php.net

Функцията fclose ()

Тази функция служи за затваряне на вече отворен файл. Синтаксисът ѝ е следния:

bool fclose ( resource $handle )

$handle- задължителен параметър. Съдържа името на файла, който искаме да затворим.

Повече информация: http://php.net

Запис във външен файл


Какво се случи, когато създадох тестов файл, с който опитах да добавя стринг във файла date.txt?
В екрана на браузъра получих следното съобщение:

access_forbidden.png

Защо нямам достъп до файла? Защото нямам права за писане в съответната директория. Повече за правата на достъп до директория или файл: http://dreamlandpoly.blogspot.com/p/files-2.html

Ще създадем форма, която съхранява въведените от потребителя име, фамилия, URL адрес и коментар в отделен файл (date.txt), който се съхранява на сървъра. Ще ползваме файла form_2.html (http://dreamlandpoly.blogspot.com/p/regularexpression-4.html#form2)
  1. Отворете текстовия редактор.
  2. Създайте нов документ и го наименовайте form_3.html.
  3. Променете стойността на атрибута action от ред 9 така:
<form  action="HandleForm_3.php" method="post" target="_blank">
Съдържанието на файла form_3.html ще бъде:
<!Doctype html>
<html>
<head>
<title>HTML Форма</title>
<meta http-equiv="Content-Type" content="text/html"; charset="UTF-8">
</head>
<body>

<form  action="HandleForm_3.php" method="post" target="_blank">
Име: <br/><input type=text name="firstname" /> <br/><br/>
Фамилия: <br/><input type=text name="lastname" /> <br/><br/>
URL:<br/> <input type=text name="url"/> <br/><br/>
Описание: <br/><textarea name="description" ></textarea><br/><br/>
<input type=submit name="submit"  formenctype="multipart/form-data" value="Напред >>"/>
</form>

</body>
</html>
Съхранете файла и го качете на сървъра.

Ще създадем файл HandleForm_3.php, който ще обработва данните, генерирани от form_3.html.
  1. В текстовия редактор създайте нов документ.
  2. Дайте му наименование HandleForm_3.php.
  3. Създаваме функция Write_to_file (), чиято роля ще бъде да провери дали файлът date.txt съществува, да отвори файла, да впише желаната информация и да го затвори.
  4. В текстовия редактор въвеждаме:
  5. Първото нещо, което трябва да направи функцията Write_to_file () е да провери дали са подадени име, фамилия, URL и коментар от формата. В текстовия редактор въвеждаме:
<?php   
function Write_to_file (){

if (isset($_POST['submit'])) {  
    $firstname = $_POST['firstname'];  
    $lastname = $_POST['lastname'];  
    $url = $_POST['url'];
    $description = $_POST['description'];
За да може работата ни с файлове да е удобна, в началото винаги присвояваме отделни променливи за името на файла и пътя до него (точните координати на файла на сървъра).

$file = '/opt/lampp/htdocs/phpbegin/date.txt';
$handle = fopen($file, 'a+');

С първата променлива $file задаваме името на файла, а с втората го отваряме за запис (ако файлът не съществува, функцията fopen () го създава, в противен случай новите данни се добавят в края му). Добавяме и още две променливи $day и $hour, които ще извеждат дата и час:

$day = date("Y/m/d");
$hour = date("h:i:sa");

Променливата $somecontent държи стринга, който съдържа дата, час и данните, получени от формата:

$somecontent =
"Дата: $day
Час: $hour
Име: $firstname
Фамилия: $lastname
URL: $url
Описание: $description";

Следват условни конструкции if, с които проверяваме дали файлът е записваем:
if (is_writable($file)) {
    
    if (!$handle) {
         echo "Не мога да отворя ($file)";
         exit;
    }

    if (fwrite($handle, $somecontent) === FALSE) {
        echo "Не мога да записвам ($file)";
        exit;
    }

    echo "Данните са записани във файл $file";

    fclose($handle);

} else {
    echo "Не може да се пише във файл $file";
}
}
}//край на функцията Write_to_file
?>
Ако файлът се отвори успешно, новите данни ще се добавят към старите.

Създаваме HTML заглавие и извикваме функцията:
<html>
<head>
<title><Работа с файлове</title>
</head>
<body>
 
<?php
Write_to_file ();
?>

</body>
</html>
Съхранете файла и го качете на сървъра в същата директория, където се намират файловете form_3.html и date.txt.

Крайният файл HandleForm_3.php ще изглежда така:
<?php
//Записва данните, получени от form_3.html, 
//във файл date.txt  
function Write_to_file (){

if (isset($_POST['submit'])) {  
    $firstname = $_POST['firstname'];  
    $lastname = $_POST['lastname'];  
    $url = $_POST['url'];
    $description = $_POST['description'];

//Посочва пътя до файла, в който ще записваме
$file = '/opt/lampp/htdocs/phpbegin/date.txt';

//Отваря файла в режим за добавяне
$handle = fopen($file, 'a+');

//Извежда текущата дата
$day = date("Y/m/d");

//Извежда час
$hour = date("h:i:sa");

//Тази променлива съдържа стринга, 
//който ще се съхрани във файла date.txt
$somecontent = 
"Дата: $day 
Час: $hour 
Име: $firstname 
Фамилия: $lastname 
URL: $url 
Описание: $description";

//Проверява дали файлът е записваем   
if (is_writable($file)) {
 
 
     
    if (!$handle) {
         echo "Не мога да отворя ($file)";
         exit;
    }

    // Записва $somecontent в  отворения файл
    if (fwrite($handle, $somecontent) === FALSE) {
        echo "Не мога да записвам ($file)";
        exit;
    }
    //Файловия указател е в края на файла и там ще 
    //отидат данните записани с fwrite()
 //Извежда съобщение, че данните са успешно записани
    echo "Данните са записани във файл <b>$file</b>";
    
 //Затваря файла date.txt
    fclose($handle);

} else {
    echo "Не може да се пише във файл <b>$file</b>";
}
}
}//край на функцията Write_to_file
?>

<html>
<head>
<title>Работа с файлове</title>
<meta http-equiv="Content-Type" content="text/html"; charset="UTF-8">
</head>
<body>

<?php
Write_to_file ();
?>

</body>
</html>
Тествайте в браузъра.

form_3.png


HandleForm_3.png


date_txt.png


sign.png

Няма коментари:

Публикуване на коментар