P5 77 – 88

77 Lucrul cu fisiere.

Mai intai se deschide fisierul si apoi fie se scrie, fie se citesc date din el. Prin urmare exista diferite atribute corespunzatoare fiecarui mod de interactiune:

w   ritting – scriere

r    eading – citire

a   ppend – adaugare

 

file.php:

 <?php
// Mai intai se creaza un handler pentru fisierul care va fi deschis, in acest caz names.txt.
$handle = fopen('names.txt','w');

fwrite($handle,'Alex'."n");
//daca vrem sa mai adaugam o linie concatenam "n" la linia anterioara
fwrite($handle,'Billy');
fclose($handle);
echo('Written');//un mesaj de confirmare a scrierii in fisier
?>

De fiecare data cand accesam file.php se descide names.txt si se rescrie intreg continutul. Astfel daca am incerca sa rulam file.php inca o data si sa adaugam un nou nume in fisier, toate celelalte se sterg, ramanand ultimul nume adaugat.

 

78 Adaugarea de date intr-un fisier

Sa presupunem ca am adaugat doua linii intr-un fisier text names.txt

Alex

Billy

si am folosit fisierul file.php

 <?php
$handle = fopen('names.txt','w');
fwrite($handle,'Alex'."n");
fwrite($handle,'Billy'."n");
fclose($handle);
echo('Written');
?>

 

Sa incercam sa adaugam un alt nume, ‘Steven':

file.php:

<?php
$handle = fopen('names.txt','a');
fwrite($handle,'Steven'."n");
fclose($handle);
?>

 

In names.txt vom avea

Alex

Billy

Steven

 

Sa adaugam numele dintr-un formular

Vom modifica file.php:

 

<?php
if( isset($_POST['name']) )
{
 $name = $_POST['name'];
 if(!empty($name))
  {
   $handle = fopen('names.txt','a');
   fwrite($handle,$name."n");
  }
else
  {
   echo 'Type a name';
  }
}
?>

<form action="file.php" method="POST">
Name: <br>
<input type="text" name="name"><br><br>
<input type="submit" value = "Submit">
</form>

 

79 Citirea dintr-un fisier

Vom folosi functia file() care transforma toate liniile dintr-un fisier text in elemente ale unui vector:

 

<?php
if( isset($_POST['name']) )
{
$name = $_POST['name'];
if(!empty($name))
{
//scrierea in fisier
$handle = fopen('names.txt','a');
fwrite($handle,$name."n");

//citirea din fisier
echo 'Numele din fisier sunt: ';
$readin = file('names.txt');

 foreach($readin as $fname)
  {
   echo trim($fname). ', ';
  }
// sfarsit citire din fisier
}
else
{
echo 'Type a name';
}

}
?>

<form action="file.php" method="POST">
Name: <br>
<input type="text" name="name"><br><br>
<input type="submit" value = "Submit">
</form>

Pentru a nu apare dupa ultimul nume din lista virgula, vom incerca sa numaram cate nume sunt in fisier si sa nu adaugam virgula dupa ultimul nume. Astfel citirea din fisier poate fi rescrisa:

 

//citirea din fisier
echo 'Numele din fisier sunt: ';

$count = 1;
$readin = file('names.txt');
$readin_count = count($readin);

foreach($readin as $fname)
{
echo trim($fname);
if($count < $readin_count)
{
echo ', ';
}
$count++;
}
// sfarsit citire din fisier

 

80 Functia explode folosind citirea din fisiere

Atunci cand citim dintr-un fisier siruri de caractere si dorim sa le despartim in cuvinte avem nevoie sa eliminam delimitatorii, fie acestia spatii sau virgule sau orice alt caracter.

Sa luam fisierul text names.txt care contine numele mai multor persoane despartite cu virgula

Alex, Billy, Peter, Daniel, Dale, Sandra

 

<?php
$filename='names.txt';
$handle = fopen($filename,'r');
echo fread($handle, filesize($filename) );
?>

Ne afiseaza continutul unui fisier.

Daca am fi dorit sa afisam doar primele 5 caractere am fi putut folosi

echo fread($handle, 5);

In loc sa-l afisam vom prelua sirul de caractere intr-o variabila. Apoi vom folosi functia explode pentru a crea un vector in functie de despartitorii din sir, in cazul nostru virgulele.

 <?php
$filename='names.txt';
$handle = fopen($filename,'r');
$datain = fread($handle, filesize($filename) );

$names_array = explode (',' ,  $datain);

foreach($names_array as $name)
{
echo  $name.'<br>';
}
?>

 

Am putea afisa orice element din vector. De exemplu am putea afisa doar primul nume:

echo $names_array[0];

 

81. Functia implode folosind scrierea in fisiere

Pornind de la un vector de siruri de caractere, dorim sa cream un sir de caractere care sa contina toate sirurile din vector.

 <?php
$names_array = array('Alex','Billy', 'Dale');
$string = implode(', ',$names_array);
echo $string;
//sau inseram intr-un fisier la fel ca in exemplele de mai sus
$file_name='names.txt';
$handle=fopen($file_name,'a');
fwrite($handle,$string);
fclose($handle);
?>

 

82-83 Lucrul cu fisiere – listarea continutului unui folder

Vom lista fisierele dintr-un folder si apoi vom crea cate un link catre fiecare dintre ele

Vom avea un folder denumit ‘files’ cu cateva fisiere text pentru exemplificare

 

<?php
$directory = 'files';
if($handle =opendir($directory.'/'))
{
echo 'Looking inside ''. $directory.'':<br>';
while($file=readdir($handle)){
echo $file.'<br>';
}
}
?>

Va afisa
.
..
firstfile
secondfile
thirdfile

 

Daca dorim sa nu afisam si cele doua linii . si .. atunci vom pune conditii la afisare

 

<?php
$directory = 'files';
if($handle =opendir($directory.'/'))
  {
  echo 'Looking inside ''. $directory.'':<br>';
  while($file=readdir($handle)){
    if($file!='.' && $file !='..') {
     echo $file.'<br>';
    }
  }
 }
?>

Sa adaugam si link-urile

<?php
$directory = 'files';
if($handle =opendir($directory.'/'))
 {
 echo 'Looking inside ''. $directory.'':<br>';
 while($file=readdir($handle)){
  if($file!='.' && $file !='..') {
   echo '<a href="' . $directory . '/' . $file . '">' . $file . '</a><br>';
  }
}

}
?>

 

Se poate folosi si pentru imagini prin schimbarea modului de afisare

in loc de

echo ‘<a href=”‘ . $directory . ‘/’ . $file . ‘”>’ . $file . ‘</a><br>';

se va afisa

echo ‘<img src=”‘ . $directory . ‘/’ . $file . ‘”><br>';

 

Sau putem afisa imaginile ca link-uri

 

<?php
$directory = 'files';
if($handle =opendir($directory.'/'))
 {
  echo 'Looking inside ''. $directory.'':<br>';
    while($file=readdir($handle)){
      if($file!='.' && $file !='..') {
     echo '<a href="' . $directory . '/' . $file . '">' . '<img width=100 src="' 
. $directory . '/' . $file . '">'  . '</a><br>';
      }
    }
 }
?>

 

84 Verificarea daca exista un fisier inainte de a-l incarca pe server

Util de exemplu cand cream nume aleatoare pentru fisiere. Este bine sa verificam daca nu cumva exista deja un nume la fel.

 

<?php
$filename_or='image.jpg';
echo $filename = rand(1000,9999).md5($filename_or).rand(1000,9999);
?>

 

Trebuie acum sa verificam daca in timp nu cumva a mai fost generat un nume de fisier identic, oricat ar parea de improbabil. Pentru aceasta vom folosi functia file_exists().

 

<?php
$filename = 'file.txt';
if(file_exists($filename)){
echo 'File already exists';
}
else{
$handle = fopen($filename, 'w');
fwrite($handle,'Nothing');
fclose($handle);
}
?>

 

 85-86 Lucru cu fisiere – stergerea si redenumirea fisierelor

 

Vom avea pentru exemplificare doua fisiere: filetodelete.txt si filetorename.txt

pentru stergere folosim functia unlink()

 

<?php
$filename= 'filetodelete.txt';
if(unlink($filename) ){
echo 'File <strong>'. $filename .' </strong> has been deleted';
}
else{
echo 'File cannot be deleted';
}

?>

 

Dupa ce se sterge fisierul, daca mai incarcam o data file.php vom primi un warning. De aceea putem pune in fata functiei de stergere caracterul @ pentru a evita warning-urile

if(@unlink($filename)…

 

Vom redenumi acum cel de-al doilea fisier folosind generarea aleatorie de caractere.

 

<?php
$filename= 'filetorename.txt';
$rand = rand(10000,99999);

//trebuie sa adaugam noi extensia fisierului, nu este adaugata automat

if( @rename($filename, $rand.'.txt') ){
echo 'File <strong>'.$filename. '</strong> has been renamed to <strong>' . $rand.'.txt </stong>';
} else {
echo 'Error renaming';
}
?>

 

87-88 Upload-area fisierelor Basics

Vom crea un folder ‘uploads’ pentru exemplificare unde vom stoca fisierele upload-ate

Vom folosi vectorul global $_FILES pentru a prelua numele fisierului, dimensiunea, tipul, numele stocat in locatia temporara

Pentru aceasta vom accesa un vector asociativ din interiorul lui folosind numele campului input din formular, in acest caz ‘file’.

 

<?php
echo $name = $_FILES['file']['name'];
//$size =  $_FILES['file']['size'];
//$type =  $_FILES['file']['type'];

$tmp_name = $_FILES['file']['tmp_name'];
//echo $tmp_name;

if(isset($name)){
    if(!empty($name)){
       $location = 'uploads/';

         if(move_uploaded_file($tmp_name, $location.$name))
         {
        echo 'Uploaded';
         }
        else
        {
        echo 'There was an error';
        }

     //echo 'ok';
   } 
  else //if(!empty($name)
   {
     echo 'Please choose a file. ';
   }
}
?>

<form action ="file.php" method="POST" enctype="multipart/form-data">
<input type="file" name="file"><br><br>
<input type="submit" value = "Submit">
</form>