P4 58-76

PHP P1 – canalul youtube thenewboston – phpacademy – 200 vids Vid 58-80

58 Timestamps

– functii pentru timpul si data, returnarea zilei, saptamanii, lunii sau anului

Timestamp sau timpul curent reprezinta o valoare numerica ce insumeaza numarul de secunde din 1 ianuarie 1970.

De ex pentru a vedea timpul curent putem afisa valoarea functiei time

echo time();

va afisa o valoarea de forma 1303897146 iar la fiecare reincarcare a paginii se va afisa noua valoare actualizata la secunda.

Daca am avea o pagina web in care dorim sa afisam la ce ora a fost afisat un anumit comentariu scris de un utilizator, o astfel de valoarea a timpului nu are avea nici o semnificatie.

Astfel

<?php
echo "Timpul curent este ".time();
?>
afiseaza
Timpul curent este 1303897146

dar nu reprezinta nimic pentru un utilizator obisnuit

Insa avem la dispozitie functia date() care primeste ca parametru un sir de caractere ce reprezinta formatul datei iar al doilea parametru, optional, este un numar ca cel de mai sus

De exemplu, pentru data de mai sus care nu e neaparat data curenta

<?php
echo date("dD M Y :h i s",1303897146);
?>
obtinem rezultatul
27Wed Apr 2011 :12 39 06

unde

d este parametrul numarul zilei,

D numele zilei,

m  numarul lunii,

M numele lunii

y anul din doua cifre

Y anul din patru cifre

h ora

i minutul

s secunda

Functia date poate fi folosita atat pentru a arata data curenta

<?php
echo date("D M Y");
?>
sau timpul curent
<?php
echo date("h i s");
?>

sau orice fel de combinatie: date(“d”) pentru zi, date(“h”) pentru ora, date(“s”) pentru secunda etc.

De asemeni poate fi folosita pentru extragerea datei dintr-un numar oarecare, de exemplu o data din trecut

<?php
$data= time()-60000000;
echo date("d m Y",$data);
?>
Va afisa 15 05 2009

Folosind date() si functia maketime() se poate crea o valoare reprezentand un moment in timp din trecut sau viitor, in secunde.

<?php
echo $tomorrow  = mktime(0, 0, 0, date("m")  , date("d")+1, date("Y"));
echo "<br>";
echo $lastmonth = mktime(0, 0, 0, date("m")-1, date("d"),   date("Y"));
echo "<br>" ;
echo $nextyear  = mktime(0, 0, 0, date("m"),   date("d"),   date("Y")+1);
?>
Va afisa 1270760400 1267999200 1302210000

 

59 – Modificarea valorilor pentru timp

Sa presupunem ca am aflat timpul curent si apoi il afisam intr-un format usor de inteles:

<?php
$time = time();
$actual_time = date('D M Y @ H :i : s ', $time);
echo $actual_time;
?>

 

Sa modificam timpul cu un minut in urma

<?php
$time = time();
$actual_time = date('D M Y @ H :i : s ', $time);
$time_modified = date('D M Y @ H :i : s ', $time - 60);
echo "Timpul actual este ". $actual_time. " iar timpul modificat cu 60 de secunde in urma este ".$time_modified;
?>
 Se va afisa
Timpul actual este Thu Apr 2010 @ 19 :06 : 23 iar timpul modificat cu 60 de secunde in urma este Thu Apr 2010 @ 19 :05 : 23

Dar daca am dori sa adaugam sau sa scadem din parametrul timp numarul de secunde corespunzator unei saptamani. Ar trebui sa facem noi calculele adica sa adaugam 7 zile * 24 ore * 3600 secunde..

 <?php
$time=time();
echo date('d M Y @ H :i : s ', $time);
echo '<br>';
echo $time_modified = date('d M Y @ H :i : s ', $time - 7*24*60*60);
?>
Va afisa
08 Apr 2010 @ 19 :30 : 53 01 Apr 2010 @ 19 :30 : 53

 

Dar exista o functie care primeste ca parametru un sir de caractere si-l transforma in numarul de secunde corespunzator adaugat la data curenta. De ex. strtotime(“+ 1 week”) va returna numarul de secunde corespunzator datei curente la care se adauga o saptamana.

<?php
$time = time();
$actual_time = date('d M Y @ H :i : s ', $time);
$time_modified = date('d M Y @ H :i : s ', strtotime('-1 week'));
echo "Timpul actual este ". $actual_time. " iar timpul modificat cu o saptamana in urma este ".$time_modified;
?>
 Va afisa
Timpul actual este 08 Apr 2010 @ 19 :17 : 28 iar timpul modificat cu o saptamana in urma este 01 Apr 2010 @ 19 :17 : 28

Putem adauga o ora ‘+1 hour’, un an ‘+1 year’ sau putem face combinatii 1 saptamana 2 ore si 30 de secunde : strtotime(‘+1 week 2 hours 30 seconds’);

Astfel:

<?php
$time = time();
$actual_time = date('d M Y @ H :i : s ', $time);
$time_modified = date('d M Y @ H :i : s ', strtotime('+1 week 2 hours 30 seconds'));
echo "Timpul actual este ". $actual_time. " iar timpul modificat cu o 1 saptamana 2 ore si 30 de secunde este ".$time_modified;
?>
Va afisa
Timpul actual este 08 Apr 2010 @ 19 :22 : 20 iar timpul modificat cu o 1 saptamana 2 ore si 30 de secunde este 15 Apr 2010 @ 21 :22 : 50

 

60 Generarea numerelor aleatoare

Pentru a genera numere aleatoare putem apela simplu rand();

<?php
$rand = rand();
echo $rand;
?>

 

Pentru a gasi limita maxima superioara a numerelor generate aleatoriu apelam functia getrandmax();

<?php
$rand = rand();
$max = getrandmax();
echo $rand.'/'.$max;
?>
 Va afisa 14138/32767

Ceea ce inseamna ca numarul generat 14138 este unul dintre numerele mai mici sau egale cu 32767 care este limita superioara a numerelor aleatorii.

Daca dorim sa generam numere in interiorul unui interval atunci va trebui sa specificam limita de jos si pe cea de sus. De exemplu sa simulam rostogolirea unui zar. Avem nevoie de numerele de la 1 la 6 prin urmare apelam functia rand(1,6);

<?php
if( isset($_POST['roll']) )
{
$rand = rand(1,6);
echo 'you rolled a '.$rand;
}
 ?>
<form action="index.php" method="POST">
<input type="submit" name="roll" value="Roll dice">
</form>

 

61 Variabila $_SERVER Script Name

Variabila $_SERVER este de fapt un vector care contine diferite informatii despre mecanismul de functionare a serverului, a fisierelor php, a userilor care acceseaza serverul..

De exemplu ne intereseaza numele fisierului in care se afla scriptul creat de noi. Este util atunci cand dorim ca fisierul nostru sa poata rula indiferent de numele primit. De exemplu cand avem de-a face cu formulare.

 <?php
echo $script_name = $_SERVER['SERVER_NAME'];
?>

 

Sa cream un fisier care sa contina un formular:

header.inc.php

 <form action="" method="POST">
<input type="submit" name = "submit" value="Submit">
</form>

Sa includem acest fisier in index.php si in anotherpage.php. Fiecare din ele vor verifica daca a fost apasat butonul submit si in caz ca a fost apasat vor afisa: index.php va afisa Process1 iar anotherpage.php va afisa Process2

 index.php:

<?php
include 'header.inc.php';

if( isset($_POST['submit']) )
{
echo 'Process 1';
}
?>

 

anotherpage.php

<?php
include 'header.inc.php';

if( isset($_POST['submit']) )
{
echo 'Process 2';
}
?>

 

Ne intereseaza ca formularul sa functioneze in ambele fisiere. Avem un formular inclus in doua fisiere dar la action=”” nu putem specifica decat un singur fisier.

Sa incercam sa completam in fisierul header.inc.php, in formular,  la action cu numele fisierului index.php

 <form action="index.php" method="POST">
<input type="submit" name = "submit" value="Submit">
</form>

Atunci cand vom apela index.php si vom apasa Submit va afisa Process 1 ceea ce este corect. Dar daca apelam anotherpage.php si apasam submit se va incarca tot index.php pentru ca doar acesta este specificat la action.

Cum putem specifica si index.php atunci cand este apelat fisierul index.php dar si anotherpage.php cand este apelat acesta din urma. Solutia este sa inseram un script php intre ghilimelele de la action : action = “<?php ?>” iar in acest script sa generam dinamic numele fiserului care este apelat.

Vom modifica fisierul header.inc.php astfel incat sa-si updateze dinamic numele de la action.

 <?php
$script_name = $SERVER['SCRIPT_NAME'];
?>
 <form action="<?php echo $script_name; ?>" method="POST">
<input type="submit" name = "submit" value="Submit">
</form>

 

Atunci cand se incarca index.php si se da submit se va afisa Process 1 iar pentru anotherpage.php se va afisa Process 2. Daca verificam codul sursa pentru index.php dupa submit vom vedea ca numele “index.php” apare in formular la action si la fel “anotherpage.php”  pentru fisierul anotherpage.php.

O utilizarea a acestei metode este sa redirectam un user care se logeaza pe aceeasi pagina pe care este formularul cu nume si parola. Deoarece de cele mai multe ori caseta de logare e in partea de sus a paginii vom dori sa utilizam pagina si dupa logare. De aceea dupa ce numele si parola s-au dovedit corecte vom face o redirectare catre aceeasi pagina, eventual cu un mesaj de bun venit cu numele utilizatorului intr-un colt din pagina.

 

62 Variabila Server Host Name

Folosirea variabilei $_SERVER[‘HTTP_HOST’] pentru a utiliza numele host-ului indiferent unde upload-am site-ul. Vom folosi un exemplu pentru un folder de imagini ‘images’

 conf.inc.php:

 <?php
$host = $_SERVER['HTTP_HOST'];
$images = $host . '/images/' ;
?>

 

index.php:

<?php
require 'conf.inc.php';
echo ' <img src=" ' .  $images .  ' header.gif" />';
?>

 

63 Functia header()

pentru modificarea header-ului trimis browser-ului.

O vom folosi pentru redirectarea catre unei alte pagini folosind parametrul Location:

 

index.php:

 

<h1>my page</h1>
<?php
header('Location: http://www.google.com');
?>

nu este corect pentru ca a fost trimis informatie html (<h1>my page </h1>) inainte de functia header

 

 index.php:

<?php

$redirect_page = 'http://www.google.com';
$redirect = true;

if($redirect==true)
{
header('Location: '. $redirect_page);
}
?>

 

64. Functia ob_start

pentru crearea buffer-ului in care se stocheaza header-ul paginii.

Folosind functia ob_start putem scrie inainte de functia header() tag-uri HTML fara sa primim erori cu conditia ca ob_start() sa fie scrisa chiar la inceput inaintea oricarui tag.

 index.php

 <?php
ob_start();
?>

<h1>My page </h1>
This is my page

<?php
$redirect_page = 'http://www.google.com';
$redirect = true;

if($redirect==true)
{
header('Location: '. $redirect_page);
}

ob_end_flush();//sterge buffer-ul dar mai intai afiseaza continutul acestuia in pagina - recomandata

//ob_end_clean();
//sterge buffer-ul si nu afiseaza nimic

?>

 

65. Obtinerea IP-ului vizitatorilor unei pagini

De exemplu dorim sa blocam accesul unui IP

 conf.inc.php:

<?php
$ip_address = $_SERVER['REMOTE_ADDR'];
$ip_blocked = array( '127.0.0.1' , '100.100.100.100' );
?>

index.php
<?php
require 'conf.inc.php';

foreach($ip_blocked as $ip)
{
 if($ip == $ip_address)
  {
   die('Your IP address, ' . $ip_address . ' has been blocked.');
  }
}
//echo $ip_address;
?>
 <h1>Welcome</h1>

 

deoarece IP-ul local este chiar 127.0.0.1 va afisa mesajul ‘Your IP address…’

 

66 O metoda mai buna de a obtine IP-ul unui user

 

<?php
$http_client_ip = $_SERVER['HTTP_CLIENT_IP']; // pentru a verifica daca user-ul este in spatele unui router care ofera un ip extern

$http_x_forwarded_for = $_SERVER['HTTP_X_FORWARDED_FOR']; // pentru a verifica daca userul foloseste un proxy

$remote_addr = $_SERVER['REMOTE_ADDR']; // ip-ul propriu-zis

if( !empty($http_client_ip) )
{
$ip_address = $http_client_ip;
}
else if( !empty($http_x_forwarded_for) )
{
$ip_address = $http_x_forwarded_for;
}
else
{
$ip_address= $remote_addr;
}

echo $ip_address;
?>

 

67 Detectarea browser-ului user-ului

Ne asiguram ca in folderul PHP avem urmatoarele setari

Identificam fisierul browscap.ini. Daca nu-l avem il download-am de pe google.

In php.ini gasim urmatoarea setare pe care o modificam astfel:

 

[browscap]

browscap = “C:xamppphpbrowscap.ini”

Se restarteaza serverul Apache

In editor vom scrie:

index.php:

 <?php
$browser = get_browser(null, true);

//print_r($browser); // afisam toate informatiile oferite de functia get_browser()
//echo $browser['browser']; //afisam exact numele browser-ului

$browser = strtolower($browser['browser']);
if($browser != 'chrome')
{
echo 'You are not using Google Chrome, please do!';
}

?>

 

69 Folosirea variabilelor $_GET

Acestea se preiau din campurile formularelor care au ca metoda valoarea GET. Un formular cu metoda GET va trimite datele introduse in campurile sale si in adresa URL care se formeaza prin apasarea butonului submit si care este afisata mai apoi in bara de adrese.

Inainte de preluarea datelor din formular se verifica urmatoarele:

1. Exista variabilele sau s-a apasat butonul submit?

2. Sunt nevide sau valoarea este NULL?

3. Sunt afisate inapoi in pagina pentru utilizator

 

index.php:

 <?php
if ( isset($_GET['day']) && isset($_GET['date']) && isset($_GET['year']) )
{
$day = $_GET['day'];
$date = $_GET['date'];
$year = $_GET['year'];
if(!empty($day) && !empty($date) && !empty($year) )
  {
   echo 'It is '.$day.' '.$date. ' '. $year;
  }
  else
  {
   echo "Fill in all the fields";
  }
}
?>
<form action = "index.php" method = "GET">
Day: <br> <input type="text" name="day"> <br>
Date: <br> <input type="text" name="date"> <br>
Year: <br> <input type="text" name="year"> <br>
<br> <input type="submit" value="Submit"> <br>
</form>

 

70 Folosirea variabilelor POST

Exista situatii cand nu dorim ca informatiile din formular sa apara in bara de adrese asa cum se intampla in cazul metodei GET. In acest caz folosim POST

Vom crea un camp de tip password si vom verifica daca parola introdusa este egala cu un text predefinit $match

<form action="index.php" method="POST">
Password: <br>
<input type="password" name="password"><br><br>
<input type="submit" value="Submit">
</form>

<?php
$match = 'pass123';

if(isset($_POST['password']))
 {
 $password= $_POST['password'];
 if(!empty($password))
  {
   if($password==$match)
    {
    echo 'That is correct';
    }
  else
   {
    echo 'That is incorrect';
   }
 }
}

 ?>

 

71 Folosirea datelor din formulare.

72 htmlentities() pentru securitate

Pana acum am procesat informatiile din formulare folosind acelasi fisier php specificand numele acestuia la action=”index.php” dar se poate specifica si un alt nume de fisier php care va urma sa prelucreze aceste date

Vom lucra cu formularul de mai sus cu introducerea datei

In interiorul campurilor utilizatorul poate introduce absolut orice informatie de tip text, inclusiv tag-uri HTML. Poate nu intentionat dar se poate si intentionat. Cum tag-urile HTML pot fi interpretate de browser, atunci cand informatiile sunt afisate in pagina, acesta va afisa si obiectele HTML corespunzatoare. De aceea e o situatie periculoasa din punct de vedere a securitatii.

Pentru fiecare variabila $day, $date, $year vom folosi functia htmlentities() care asigura ca tag-urile HTML nu sunt transmise in forma initiala catre browser ci sunt prelucrate pentru a fi afisate caracter cu caracter.

 <?php
if ( isset($_GET['day']) && isset($_GET['date']) && isset($_GET['year']) )
{
$day =htmlentities( $_GET['day']);
$date = htmlentities( $_GET['date']);
$year = htmlentities( $_GET['year']);

if(!empty($day) && !empty($date) && !empty($year) )
{
echo 'It is '.$day.' '.$date. ' '. $year;
}
else
{
echo "Fill in all the fields";
}

}
?>
<form action = "index.php" method = "GET">
Day: <br> <input type="text" name="day"> <br>
Date: <br> <input type="text" name="date"> <br>
Year: <br> <input type="text" name="year"> <br>
<br> <input type="submit" value="Submit"> <br>
</form>

 

In acest mod daca in campul day am scrie <iframe src=”page”> </iframe>, in loc sa afiseze in browser un element iframe asa cum s-ar fi intamplat fara htmlentities, acum afiseaza exact ceea ce am scris in campul din formular: <iframe src=”page”> </iframe>

 

73. Sesiuni php

Sesiunile in php ca si cookie-urile sunt metode de a transimite informatii de la o pagina la alta sau de a regasi anumite informatii atunci cand un utilizator acceseaza o anumita pagina.

Cookie-urile sunt informatii stocate in fisiere pe calculatorul utilizatorului si prin urmare acestea pot fi accesate oricand si chiar li se poate schimba informatia. Deci nu pot fi folosite pentru situatii cand este necesara securizarea informatiilor.

Sesiunile sunt variabile pe server si accesul la acestea nu este direct deci nu pot fi schimbate de un utilizator oarecare

Vom folosi un fisier set.php pentru setarea unei variabile session si fisierul view.php pentru vizualizarea acesteia

set.php:

 <?php
session_start();
$_SESSION['name']='Alex';
?>

Am pornit stocarea de variabile $_SESSION pe server si am setat una cu numele ‘name’ si valoarea ‘Alex’. Din acest moment orice pagina va avea acces la aceasta variabila pentru ca nu va disparea la reincarcarea unei alte pagini.

Este echivalentul unui vector cu informatii din limbajele de programare clasice care este disponibil pe toata durata executiei programului.

 view.php:

 <?php
session_start();
echo $_SESSION['name'];
 ?>

O situatie cand variabilele SESSION sunt utile este atunci cand un user s e logeaza si navigheaza prin toata pagina. Atunci fiecare pagina pe care intra va sti ce utilizator este pe baza informatiilor stocate in $_SESSION care este un vector permanent pe durata logarii.

Vom seta o variabila ‘username’ in fisierul set.php

<?php
session_start();
$_SESSION['user_name']='Alex';
?>

 

Astfel view.php mai poate fi scris:

 <?php
session_start();
if( isset($_SESSION['user_name']) )
{
echo 'Welcome, '. $_SESSION['user_name'];
}
else
{
echo 'Please log in.';
}
?>

 

Daca este incarcat in browser primul fisier set.php care seteaza variabila $_SESSION[‘user_name’] cu valoarea ‘Alex’ atunci din view.php se va putea accesa aceasta variabila si in acest mod se poate afla daca un utilizator care acceseaza pagina este logat.

 

74 Stergerea unei sesiuni – Unsetting sessions

La ce ar putea folosi stergerea unei sesiuni? De exemplu pentru golirea cosului de cumparaturi al unui user intr-un magazin virtual.

Avem deja fisierul set.php

 <?php
session_start();
$_SESSION['user_name']='Alex';
?>

 

Vom crea un fisier unset.php pentru stergerea sesiunii.

<?php
session_start(); // se porneste sesiunea chiar si atunci cand dorim sa stergem
unset($_SESSION['user_name']);
?>

In acest mod am sters variabila ‘user_name’ din $_SESSION.

Dar daca am seta mai multe variabile in $_SESSION? De ex in set.php mai adaugam si varsta utilizatorului

 set.php:

 <?php
session_start();
$_SESSION['user_name']='Alex';
$_SESSION['age']=21;
?>

 

Modificam view.php pentru a afisa si $_SESSION[‘age’]:

 <?php
session_start();
echo 'Welcome, '. $_SESSION['user_name']. '. You are  '. $_SESSION['age']. '! ';
?>

Daca acum vom incarca unset.php se va sterge variabila ‘user_name’ insa va ramane variabila ‘age’. Cand este incarcat view.php acesta va afisa variabila ‘age’.

De aceea vom folosi session_destroy() pentru a sterge toate variabilele.

 unset.php

 <?php
session_start();
session_destroy();
?>

 

75. Crearea cookie-urilor.

Variabilele $_SESSION dureaza cam cat timp este accesata pagina web in timp ce cookie-urile pot dura mult mai mult. In ele pot fi pastrate preferintele privind modul in care este accesat site-ul si alte informatii.

Crearea unui cookie

set.php

<?php
setcookie('username','alex',time()+10);
?>

Am creat un cookie denumit ‘username’ setat cu valoarea ‘alex’ si care va avea durata de viata de 10 secunde

Citirea unui cookie

 view.php

<?php
echo $_COOKIE['username'];
?>

Daca pagina view.php este accesata mai tarziu de 10 secunde dupa crearea cookie-ului atunci valoarea cookie-ului nu va mai fi afisata.

Cum cookie-urile sunt stocate pe calculatorul user-ului, fiind astfel si usor de modificat, nu dorim sa stocam informatii importante privind securitatea logarii sau in general a site-ului.

 

76 Stergerea unui cookie

Vom seta un cookie care sa dureze mai mult, sa spunem 1000 secunde

set.php

<?php
setcookie('username','alex',time()+1000);
?>

Stergerea unui cookie este asemanatoare cu setarea unuia. Doar ca se seteaza ca durata de viata sa fie 0 adica time() sau time() – 1 etc.

De exemplu setam din nou cookie-ul de mai sus dar cu durata de viata cu 1000 de secunde in inapoi in timp si in felul asta l-am sters,

 unset.php

 <?php
setcookie('username','alex',time()-1000);
?>

Daca se doreste ca la logout sa se stearga cookie-urile atunci de butonul logout se poate lega o astfel de operatie pentru a sterge datele utilizatorului ramase pe calculator.