Enuntul urmator, adaptat din tema unui curs de PHP
procedural, cere, practic, relationarea a doua fisiere php care contin functii
pentru generarea si validarea unor valori numerice.
"Creati un mini-proiect PHP cu fisiere, plasat intr-un director accesibil prin URL-ul http://localhost/.../ . In acel director se vor afla urmatoarele fisiere/directoare:
1) directorul include, care contine fisierul utils.php, in care se definesc:
a) o constanta NR_DATE, cu o valoare numerica la alegere;
b) o functie validareData() ce valideaza o data calendaristica. Functia primeste 3 argumente: zi, luna si an (toate numerice) si verifica daca ziua se incadreaza in numarul maxim de zile ale lunii specificate;
2) fisierul statistici_date.php, in care:
a) se include utils.php, pentru a avea disponibile constanta si functia de validare. Se va folosi o cale relativa (require "include/utils.php"), pentru a nu face site-ul dependent de sistemul local de fisiere;
b) se realizeaza o bucla in care se genereaza NR_DATE date calendaristice (se genereaza ziua, luna si anul folosind functia rand() ). Fiecare data generata se va afisa pe ecran: cele valide cu verde, cele invalide cu rosu. Pentru validare se va folosi functia validareData() scrisa anterior. Anul se va genera intre 1900* si 2100;
c)la sfarsit se va afisa statistica: X date valide, Y date invalide."
In solutia propusa, validarea porneste
de la criteriul lunii generate aleator. Domeniul acoperitor de generare a
valorilor pentru zile este (1, 31). Daca luna este prima, a treia, a cincea, a
saptea, a opta, a zecea sau a douasprezecea, corectitudinea datei este
asigurata de insasi domeniul fixat pentru zile.
Daca luna este februarie (a doua) si daca valoarea este
superioara lui 28 (in cod, $d > 28) atunci, daca anul ($y) este bisect (test prin functia isLeap()) si
daca ziua $d == 29 inseamna ca data este valida. In cazul contrar ultimei clauze if (<==>
$ > 29), data e invalida.
Daca luna este a 2-a si ziua este mai mica sau egala cu
28, data generata este valida, indiferent de an, ordinar sau bisect.
Daca luna este a patra, a sasea, a noua si a unsprazecea,
orice zi $d <=30 implica o data valida, indiferent de an.
Instructiunea switch si gruparea case-urilor pentru
lunile cu 30 de zile simplifica functionalitatea codului.
Pentru afisare, s-a folosit o lista neordonata intr-un
element de pagina pozitionat stanga si un tabel pozitionat in dreapta listei.
Domeniul pentru anii generati cu functia rand a fost
fixat la (1920, 2100). Nu ca ar avea importanta prea mare, dar in 1919, in
primavara, s-a introdus in Romania reforma calendarului gregorian, astfel incat
de la 14 aprilie (1 aprilie pe stil vechi) anul respectiv, datele calendaristice
pot fi in mod consistent corelate cu zilele saptamanii ;-)
In continuare, codul si prinscreen-ul, cu mentiunea ca, spre exemplu, daca fisierul date_statistice.php este rezident intr-un alias numit practice1, atunci utils.php se afla in …/practice1/include.
1) Fisierul .../include/utils.php:
------------------------------------------------------------------------------------------------------
<?php
define("NR_DATE", 100);
function validareData($d, $m, $y = NULL)
{
switch($m)
{
case 2:if($d > 28)
{
if(isLeap($y))
{
if($d == 29) return true;
else return false;
}
} else return true;
case 4:
case 6:
case 9:
case 11: if($d > 30) return false;
else return true;
}
}
function isLeap($y)
{
if($y%4) return false;
else if($y%100) return true;
else if($y%400) return false;
else return true;
}
?>
------------------------------------------------------------------------------------------------------
2) Fisierul
date_statistice.php:
------------------------------------------------------------------------------------------------------
<!DOCTYPE HTML>
<head>
<title>Stats</title>
<style>
#rside {
width:20%;
float:left;
}
#lside{
float:left;
}
table, td, tr {
border: 2px solid red;
text-align:center;
}
table{
width:100%;
}
</style>
</head>
<body style =
"background-color:Antiquewhite;color:DarkOrchid">
<div id="rside">
<ul>
<?php
require "include/utils.php";
$id = 0;
$vd = 0;
$arr =array();
for($i = 0; $i < NR_DATE; $i++)
{
global $id, $vd, $arr;
$d = rand(1, 31);
$m = rand(1, 12);
$y = rand(1920, 2100);
if(validareData($d, $m, $y) === false)
{
echo "<li><h3 style =
\"color:red\">$d.$m.$y: data
invalida!</h3></li>";
$id++;
$arr[] = $i;
}
else
{
echo "<li><h3 style =
\"color:green\">$d.$m.$y: data valida.</h3></li>";
$vd++;
}
}
?>
</ul>
</div>
<div id="lside">
<br/>
<table>
<tr>
<td><h4>Date
valide</h4></td><td><h4>Date
invalide</h4></td>
</tr>
<?php
echo "<tr>
<td><h4>$vd</h4></td><td><h4>$id</h4></td>
</tr>
</table>";
echo "<br><h4>S-au generat date invalide la
extragerea/extragerile: ";
foreach($arr as $v) echo ($v + 1)."; ";
echo "</h4>";
?>
</div>
</body>
</html>
No comments:
Post a Comment