Proiectarea Unui Site Educational Web

CUPRINS

Introducere

Capitolul I – Apache Server – Instalare și configurare

Generalitati

Instalare si configurare

Pentru sisteme Unix/Linux

Pentru sisteme Windows

Capitolul II – Limbajul de Scripting PHP

2.1 Introducere

2.2 Istorie

2.3 Instalare

2.3.1 Instalarea pe Windows

2.3.1.1 Instalarea pe Windows – metoda avansata, pas cu pas:

2.3.1.2 Instalarea pe Windows – metoda usoara folosind kituri de instalare:

2.3.2 Instalare pe Linux.

2.4 Elemente sintactice de bază

2.4.1 Modalități de ieșire ("escape") din HTML 2.4.2 Scrierea comentariilor

2.4.3 Tipuri de date:

2.4.4 Variabile:

2.4.5 Operatori:

2.4.6 Structuri de control:

2.5 Exemple de scripturi

2.5.1 Exemplu de script complex în PHP

2.5.2 Exemplu de procesare PHP pentru document X

Capitolul III – Sisteme de Gestiune a Bazelor de Date Relaționale MYSQL (SGBDR)

Capitolul IV – Aplicații(e)

Bibliografie

BIBLIOGRAFIE

[1] ADLNet (Advanced Distributed Learning Network), rețea distribuită de învățare – http://www.adlnet.org/

[2] IEEE LTSC – Learning Technology Standards Committee – http://ltsc.ieee.org

[3] ISO/IEC JTC1/SC36 – Information Technology for Learning, Education, and Training – http://jtc1sc36.org/

[4] Leidig T. (2001). “L 3 –Towards an Open Learning Environment”, ACM Journal of Educational Resources in Computing, Vol. 1, No. 1, Spring 2001.

[5] MySQL by Paul DuBois, Michael Widenius, – http://www.newriders.com

[6]PHP and MySQL Web Development, Second Edition by Luke Welling , Laura Thomson © copyright by Sams Publishing, 2003

[7] PHP Manual by Stig Sæther Bakken, Alexander Aulbach, Egon Schmid, Jim Winstead, Lars Torben Wilson, Rasmus Lerdorf, Zeev Suraski, Andrei Zmievski, Edited by Stig Sæther Bakken, Egon Schmid Copyright © 1997, 1998, 1999, 2000 by the PHP Documentation Group

[8] Apache: The Definitive Guide (3rd Edition) – by Ben Laurie (Author), Peter Laurie (Author); Edited by O’REILLY

Introducere

Convergența tendințelor ce evoluează acum în cadrul societății bazate pe cunoaștere pe tărâmul tehnologiei și educației o reprezintă fuziunea activităților implicate în achiziționarea și managementul cunoștințelor, învățare și performanță. Astfel, aceste patru elemente reprezintă legătura dintre cel ce învață și tehnologie, în efortul de susținere a procesului de învățare permanentă (life-long learning) într-o societate și economie bazate pe cunoaștere.

Pentru a realiza această perspectivă vizionară este imperios necesară dezvoltarea și aplicarea standardelor în tehnologia educațională. Alături de standardele Internet existente (TCP/IP, HTTP, HTML, etc.), noile standarde bazate pe PHP (un puternic limbaj de scripting server-side, open-source, multi-platformă ce ofera suport pentru acces la aproape 20 de servere de baze de date diferite printre care MySQL) și XM,L furnizează mijloace de structurare a conținutului paginilor de Web, reprezentarea vizuală a conținutului (CSS, XSL), etichetarea conținutului și programarea aplicațiilor de Web (Java). Aceste standarde permit o interoperabilitate crescută, dar și obligația utilizatorului de a-și perfecționa experiența de lucru pe Web.

În scopul achiziționării și managementului cunoștințelor prin programe specializate ce rulează în Internet, ce sunt bazate pe standardele amintite, este necesară o abordare integrată a unui site de Web, numită “arhitectură Internet pe trei niveluri” (three-tier Internet architecture). Această abordare se evidențiază prin cele trei aspecte prezente în proiectarea oricărui site de Web: prezentare, logică și date. Un astfel de sistem constă dintr-un nivel de interfață cu utilizatorul, un nivel intermediar – al arhitecturii sistemului și un nivel al integrării bazelor de date. Aceste niveluri acceptă tranzacții, management de conținut, flux de lucru, precum și șablonarea.

Arhitectura unui sistem educațional

În scopul achiziționării și managementului cunoștințelor educaționale prin programe specializate ce rulează în Internet, ce sunt bazate pe standardele amintite, este necesară o abordare integrată a unui site de Web, numită “arhitectură Internet pe trei niveluri” (three-tier Internet architecture). Această abordare se evidențiază prin cele trei aspecte prezente în proiectarea oricărui site de Web: prezentare, logică și date. Un astfel de sistem constă dintr-un nivel de interfață cu utilizatorul, un nivel intermediar – al arhitecturii sistemului și un nivel al integrării bazelor de date. Aceste niveluri acceptă tranzacții, management de conținut, flux de lucru, precum și șablonarea.

În figură sunt evidențiate aplicațiile care rulează, de partea client și respectiv, de cea server cu interacțiunile dintre ele. Practic, de partea serverului, elementele de bază sunt:

serverul WWW (de Internet), care interacționează cu serverul educațional (de module de curs) prin intermediul unei interfețe (API). La rândul lui serverul educațional are acces la bazele de date (Metadata DB și Content DB). Partea client este reprezentată de un browser de Web. Elementele adiționale din schemă (program CGI, servleți Java, SSI1, Applet-uri Java, coduri limbaj script PHP) au rol în generarea dinamică a paginilor de Web.

Măsuri necesare pentru România în adoptarea noior tipuri de sisteme educaționale

Problemele care se pun în acest moment sunt pe de o parte, dezvoltarea tehnologiilor și unificarea standardelor educaționale în Internet, iar pe de altă parte, aplicarea lor adecvată de cât mai mulți utilizatori. Utilizatorul din societatea actuală, bazată pe cunoaștere este orice persoană dornică de instruire, într-un anumit domeniu, potrivit nivelului său de cunoaștere și a necesităților sale cognitive dintr-un anumit context.

În România au fost desfășurate cercetări de nivel internațional în domeniul sistemelor educaționale, în diverse contracte europene (exemplu Programele Leonardo de Vinci) care au ca obiectiv dezvoltarea învățământului continuu. Soluții specifice românești sunt deja integrate în universități, utilizate ca metode complementare învățământului clasic.

Cadrul tehnologic standardizat de instruire asistată ARIADNE a fost deja implementat în unele medii universitare (Universitatea “Dunărea de Jos”, Galați).

Următorii ani sunt decisivi pentru România în dezvoltarea tehnologiilor informaționale pentru educație. Cei care lucrează direct în acest domeniu (fie în cadrul unor institute de cercetări, fie în mediul universitar sau al unor firme specializate) trebuie să utilizeze adecvat standardele pentru caracterizarea paginilor de Web, să construiască ontologii, prin clasificarea informațiilor pentru un învățământ cognitiv.

Cunoștințele celor ce lucrează într-o organizație reprezintă un factor important în economia începutului acestui mileniu. Motivul este simplu: productivitatea și creativitatea lucrătorilor vor conduce procesul inovativ al companiei. Angajații știu că pot da randament maxim, numai lucrând împreună, prin utilizarea în comun a cunoștințelor.

Ei trebuie însă stimulați să pună la dispoziția colegilor propriile cunoștințe dobândite.

Găsirea modalităților de stimulare a celor ce lucrează într-o organizație, pentru a efectua această operație, trebuie să reprezinte o preocupare centrală a conducerilor marilor companii, alături de dezvoltarea mijloacelor tehnologice care să ajute la eficientizarea managementului de cunoștințe organizațional.

Ca urmare a celor prezentate în această lucrare, în perspectiva integrării europene a țării noastre, pentru a asigura cetățenilor României accesul la noile tipuri de sisteme educaționale, sunt necesare:

Asigurarea accesului la Internet a populației (sprijinirea de către stat, prin reducerea taxelor, a cumpărării de calculatoare și a subvenționării accesului la Internet).

Pregătirea corespunzătoare cetățenilor pentru utilizarea eficientă a resurselor informaționale (facilitarea unor astfel de cursuri atât pentru elevi, cât și pentru persoanele mature).

Finanțarea unor proiecte naționale de cercetare pentru proiectarea și implementarea unor astfel de sisteme educaționale (de exemplu, în Germania se desfășoară proiectul „L3” [12], la care colaborează 7 parteneri, din care 4 instituții de cercetare și 3 universități).

Inițierea profesorilor în accesarea, utilizarea și crearea bazelor de cunoștințe științifice și didactice pe Web, prin identificarea pentru fiecare domeniu de cunoaștere a ierarhiilor de concepte.

Susținerea învățământului universitar informatic.

Popularizarea și introducerea standardelor educaționale în cadrul comunităților bazate pe învățare (comunități universitare, dar și productive sau de afaceri – B2B).

Sistemele de învățare prin Internet vor deveni instrumente de formare a personalității și creativității utilizatorilor. Prin instruire personalizată și colaborare distribuită se vor putea eficientiza toate activitățile umane în societatea bazată pe cunoaștere a acestui început de secol.

Principalele avantaje ale sistemelor de învățare prezentate sunt motivarea celui ce învață și stimularea proceselor de învățare. În cadrul procesului de învățare continuă, noile tehnologii educaționale vizează o largă parte a populației, ceea ce face ca aplicarea lor adecvată să poată fi valorificată în contextul societății cunoașterii. Beneficiarul potențial principal este însă sfera economică (producție și servicii), care prin intrarea în zona economiei cunoașterii și-a manifestat interesul special în competența, gradul de instruire, cunoștințele și priceperile (skills) personalului ei.

=== Aplicatie teste_on-line ===

Capitolul IV

TESTE ON-LINE

MySQL & PHP & Apache Server

4.1 Scopul aplicației

Proiectul supus analizei are ca scop realizarea unor teste de tip grilă dinamice, prietenoase, intuitive pentru utilizator, teste grilă care rulează sub Internet pe un server de tip Apache. Testele pot fi accesate on-line de către utilizator. Se vor realiza 3 teste de tip grilă pentru trei materii: Rețele de Calculatoare, Comunicații de date, Sisteme de operare.

4.2 Programe și limbaje folosite pentru realizarea proiectului

Pentru acest proiect vom folosi programul MySQL. Ca limbaje vom folosi PHP respectiv limbajul HTML clasic. Vom opta pentru programul MySQL pentru a realiza o bază de date pe care o vom interoga sub PHP. Limbajul PHP permite manipularea conținutului bazei de date din MySQL numai dacă PHP rulează pe un server de tip Apache. Cel mai important aspect al limbajului este însa capabilitatea acestuia de a fi imbricat cu codul HTML clasic. Printr-o riguroasă corelare între PHP și limbajul HTML clasic se pot realiza sub rețeaua Internet multe aplicații dinamice pe serverele de tip Apache și nu numai. Paginile WEB pot fi astfel personalizate, mai ales că sub PHP se pot trimite headere HTTP pentru autentificare, redirecționa utilizatorii, securiza paginile prin parole etc. Browser-ul poate interpreta fără probleme aceste surse datorită serviciilor locale oferite de server. În paginile de WEB create cu PHP și HTML se pot deasemenea introduce imagini, animație Macromedia Shockwave Flash și se poate face download la fișiere de tip pdf (Acrobat Reader) sau documente de tip text sau office (Microsoft Office). Astfel din multimea de posibilități oferită de limbajul PHP și folosindu-ne de limbajul HTML cunoscut respectiv de programul MySQL vom opta pentru acestea pentru realizarea aplicației noastre.

4.3 Realizarea interfeței de evaluare a testului.

Aspecte de programare

Lucrarea conține 7 fisiere de tip PHP și un fisier de tip SQL. Aceste fișiere sunt enumerate în tablelul de mai jos:

Fișierul sursă de care depind celalalte fișiere este index.php. Proiectul se deschide printr-o primă pagina, “index.php”, care conține un combobox prin care se poate alege materia asupra căreia se efectuează testul grilă. Combobox-ul este obținut prin intermediul unei forme ce conține mai multe optiuni. Valorile acestor optiuni reprezintă de fapt linkuri către celalalte fișiere de tip PHP, fișiere corespunzatoare materiei selectate.

<FORM NAME="AlegeGrila">

<SELECT NAME="Materii">

<OPTION SELECTED VALUE>Alege Materia

<OPTION VALUE="retele.php">Retele de Calculatoare

<OPTION VALUE="com.php">Comunicatii de Date

<OPTION VALUE="so.php">Sisteme de operare

</SELECT>

<INPUT TYPE="BUTTON" VALUE="START !!" ONCLICK="AlegeGrilaLink()" language="JavaScript">

</FORM>

După alegerea materiei, la apăsarea unui click pe buttonul cu numele START! va fi apelată funcția AlegeGrilaLink() de tip JavaScript, care permite alegerea optiunii selectate. Corpul functiei AlegeGrilaLink() este prezentat mai jos:

function AlegeGrilaLink()

{

var optiune=document.AlegeGrila.Materii.options[document.AlegeGrila.Materii.selectedIndex].value +"";

if(optiune != '')

{

if(parent!=self)

{

var f = self; while(f!=window.top)

{

f = f.parent;

}

if(optiune.indexOf("://")!=-1) {

f.body.window.location.href = optiune;

} else { window.top.location.href = optiune; } } else { window.top.location.href = optiune;

} document.AlegeGrila.Materii.selectedIndex=0;

} }

Fișierele “retele.php”,”com.php”,”so.php” realizează testul propriu-zis cu grilele corespunzatoare. Fișierele “eval_retele.php”, ”eval_com.php”, ”eval_so.php” realizează evaluarea testului grilă. Aici intră: calculul punctajului respectiv valoarea procentuală a raspunsurilor corecte corespunzatoare testului curent. Rezultatele corecte vor fi colorate în roșu iar cele incorecte în albastru. După alegerea optiunii (ex:Retele de Calculatoare ) vom avea:

Pentru a realiza această pagină se vor folosi butoane de tip RADIO, cod HTML respectiv PHP. Întrebarile le vom nota cu Q1…Q5 (Question) iar starea butoanelor o vom încarca într-un tablou array (notat de noi cu Tab) în PHP. Răspunsurile corecte se validează Tab[0], iar cele greșite Tab[1]. Suma răspunsurilor corecte se va face prin folosirea unui tabloul care asociază variabilei $Tab[0] valoarea “verificata” iar variabilei $Tab[1]=”” .

$Tab = array ("verificata", "");

Răspunsurile corecte le considerăm Tab[0]=”verificata” iar cele incorecte Tab[1]=””.Astfel, de ex. pentru întrebarea 1 avem:

///********************** Intrebarea 1 ****************************

$Q1="1. Reteaua Ethernet este o retea de tip :";

$Q1_1="broadband";

$Q1_1R= $Tab[1];

$Q1_2="baseband";

$Q1_2R= $Tab[0];

$Q1_3="broadband si baseband";

$Q1_3R= $Tab[1];

$Q1_4="Noband";

$Q1_4R= $Tab[1];

Se observă că răspunsul corect este $Q1_2 (adică întrebarea 1 raspunsul 2). Se va memora in $Q1_2R valoarea lui $Tab[0]=”verificata”, restul răspunsurilor sunt vide.

Pentru a pune butoane radio cu răspunsul aferent lui se folosesc secvențele de cod HTML imbricate cu PHP, prezentate mai jos:

<p>

<tr align="left">

<td><input type="radio" name="Q1" value="<?php echo("$Q1_1R") ?>">&nbsp;

<font Color="#333399" face="arial" size="2"></td> <?php echo("$Q1_1"); ?>&nbsp; </tr>

</p>

În campul value se va folosi secventa urmatoare de tip PHP <?php echo("$Q1_1"); ?>,secventa ce va afisa in PHP variabila $Q1_1 adica textul “broadband”.

Pentru a pune butonul EVALUEAZA! de tip submit se foloseste secventa de cod :

<form name="abc" method="post" action="eval_retele.php">

<p align="center"><input type="submit" name="abc" value="Evalueaza !"></p>

La activarea acestui buton se va accesa fișierul de evaluare a testului curent “eval_retele.php”

În fișierul “eval_retele.php” se face calculul de evaluare a testului curent, astfel:

<?php

If ($Q1 == "verificata") { $Q1r = 1; }

else

{ $Q1r = 0; }

?>

Pentru a atribui valoarea de corect sau incorect și respectiv culoarea asociată (corect=roșu iar incorect=albastru) se folosesc secvențe de tipul :

<?php

$cor="corect";

$inc="incorect";

$Culc="red";

$Culi="blue";

?>

Decizia de a selecta varianta corectă sau incorecta pentru raspunsul 1 (de ex.) respectiv culoarea asociată este implementată prin codul PHP de mai jos:

<center>

<font face="Arial" size="3">

<b>

<?php

If ($Q1r == "1")

{

print("1.<font color=\"$Culc\">$cor</font>");

}

else

{

print("1.<font color=\"$Culi\">$inc</font>");

}

?>

</font>

</b>

</center>

Calculul rezultatului testului curent, precum și valoarea procentuală a acestuia se calculează în PHP, astfel:

<?php

$Suma=0;

$maxim=50;

$Suma= $Q1r+$Q2r+$Q3r+$Q4r+$Q5r;

$Eval= $Suma * 10;

$Procent=$Eval*20/10;

If ($Eval == $maxim)

{

echo("Punctaj maxim , FELICITARI ! ");

}

else

{

echo("Mai invatati !");

}

?>

Deoarece folosim numai 5 grile pentru un test din fiecare materie, valoarea maximă a testului va fi de 50 de puncte, ceeace reprezintă 100%. Pentru a afișa valoarea procentuală a testului se folosește cod HTML imbricat cu PHP, astfel:

<font color="red" face="Times New Roman" size="4">

<?php echo("$Procent %"); ?>

</font>

Pentru a afișa întrebarile și răspunsurile corecte se accesează sub PHP baza de date scrisă în MySQL, bază de date ce poartă numele “corect”. Se interoghează baza de date pentru fiecare tabel în parte. De exemplu pentru testul grilă la materia Retele de Calculatoare se interogheaza baza de date cu privire la tabelul “tblretele“ printr-o linie PHP de tipul:

$query = "SELECT * FROM tblretele";

Astfel:

<?php

/* Performing SQL query */

$query = "SELECT * FROM tblretele";

$result = mysql_query($query) or die("Query failed");

/* Printing results in HTML */

print "<table>\n";

while ($line = mysql_fetch_array($result, MYSQL_ASSOC))

{

print "\t<tr>\n";

foreach ($line as $col_value) {

print "\t\t<td>$col_value</td>\n";

}

print "\t</tr>\n";

}

print "</table>\n";

/* Free resultset */

mysql_free_result($result);

/* Closing connection */

mysql_close($link); ?>

4.4 Rezultate

Pentru afișarea textelor se folosește cod HTML de tipul:

<center>

<b><i><u>

<font color="#000000" face="Times New Roman" size="5">

REZULTATELE TESTULUI LA RETELE DE CALCULATOARE

</i></b></u>

</center>

Dacă grila oferă un punctaj mai mic decât punctajul maxim avem posibilitatea de a relua același test prin folosirea butonului : RELUARE TEST CURENT

Dacă grila este corectă și s-a obtinut punctajul maxim avem posibilitatea de a trece la alt test, pentru altă materie, prin folosirea butonului : ALEGE ALTA MATERIE

În final vom avea rezultatele testului precum și valoarea procentuală a răspunsurilor corecte:

=== CapI+II ===

Capitolul I.

Apache Server – Instalare și configurare

1.1. Generalități

Serverul web APACHE își are originea in “batranul” server de web dezvoltat de NCSA pentru sistemele Unix. El este într-o concurență acerbă în lumea serverelor profesionale cu serverul IIS produs de Microsoft. Multi webmaster-i preferă numele de Microsoft celui de Apache Group, neavând încredere într-un server web ce se poate descarca gratuit de pe Internet.

Numele de APACHE vine de la “A Patchy Server”, aceasta din cauză că serverul este într-adevăr unul “peticit”. Supus licentei GPL (General Public License) care îi face sursele publice Apache a suferit multe modificări de-alungul timpului, ajungând la performanțe ce egalează și câteodată chiar întrec serverul IIS.

Avantajele acestui server sunt multiple:

– este gratuit

– poate rula pe mai multe platforme, cu performanțe asemanatoare (Unix, Linux, Solaris, Windows)

– nu necesită resurse hardware deosebite.

1.2. Instalare si configurare

În cele ce urmează vor fi descrise cele două proceduri de instalare a server-ului, cea pentru sisteme Unix/Linux si cea pentru sisteme Windows, procedurile de configurare fiind aceleași pentru ambele sisteme de operare

1.2.1. Pentru sisteme Unix/Linux:

Introducere. Acest document explică cum se instalează Apache in Linux. Acest tutorial este pentru instalarea Apahe-ului 1.x.x pe un Red Hat 7.0

Instalare Apache:

Se loghează ca root. Putem face asta din terminal dacă nu suntem logați ca root prin comanda:

su root

Vom instala Apache în /usr/local/etc.

cd /usr/local/etc

Se descarcă ultima versiune stabilă de apache de la apache.org. Pentru kiturile pe care le descărcăm se folosește următorul director

/usr/local/kituri

Dacă dorim să creăm un astfel de director:

mkdir /usr/local/kituri

Comenzile ftp pentru a descărca o versiune apache sunt:

cd /usr/local/kituri

ftp ftp.apache.org

cd dist

bin

get apache_1.x.x.tar.gz

bye

Se dezarhivează fisierul cu : (trebuie sa fiim atenți la C mare)

tar xzf apache_1.x.x.tar.gz -C ../etc

Această ultimă comandă a creat un director numit apache_1.x.x. Și ca să fie mai frumos vom face si un link:

cd /usr/local/etc

ln -s apache_1.x.x httpd

Structura Apache-ului: – acum este timpul să explicăm puțin structura lucrurilor instalate de Apache.

Toate binarele și fișierele specifice versiunii vor fi instalate în:

/usr/local/etc/apache_1.3.14

Momentam avem:

/usr/local/etc/httpd

legat către acest director specificând astfel ce versiune folosim. Cel mai bine este ca atunci când facem up-grade la Apache sa-l instalam într-un nou director iar link-ul httpd să-l oreintăm către directorul cu versiunea cea nouă.

Toate fisierele care nu sunt specifice versiunii cum ar fi cele de configurare, log sau paginile web ale site-urilor ce vor fi găzduite le vom pune într-un director

/www

Pentru efieciență vom organiza astfel acest director:

/www

/www/conf – fisierele de configurare

/www/logs – logurile serverului web

/www/logs/site1 – logurile pentru site1

/www/logs/site2 – logurile pentru site2

/www/sites – site-urile găzduite

/www/sites/site1 – paginile web pentru site1

/www/sites/site2 – paginile web pentru site2

Apache: configurare și compilare.

Pentru început vom construi structura de directoare de mai sus:

cd /

mkdir www

Daca avem probleme de spațiu sau vrem să folosim un alt disk mai rapid putem crea /www ca fiind un link către locația dorită. De exemplu:

cd /u01

mkdir www

cd /

ln -s /u01/www www

Acum vom crea directoarele pentru fișierele de configurare, loguri și site-uri:

cd /www

mkdir conf logs sites

Înainte de compilare trebuie să configuram fișierele de instalare ale Apache-ului.

cd /usr/local/etc/httpd

./configure –prefix=/usr/local/etc/httpd

–sysconfdir=/www/conf –

enable-module=rewrite –enable-module=status

Ultima comandă setează ca binarele să fie instalate în

/usr/local/etc/httpd și fișierele de configurare în /www/conf.

Pentru a vedea și alte opțiuni care se pot folosi pentru configurare dăm comanda:

./configure –help

Acum putem face executabilul pentru Apache. Acest lucru poate lua ceva timp pe masini mai vechi:

make

Și instalăm toate fișierle Apache cu:

make install

de observat este că atunci când instalăm un nou apache fișierele de configurare existente nu sunt înlocuite.

Setarea serverului web Apache

De obicei Apache este deja instalat pe linux. Putem verifica dacă rulează pe calculator prin comanda:

top

top va afișa o lista cu tote procesele care rulează pe calculator. Trebuie să avem grijă să putem vedea întreaga listă în fereastră. Apache rulează lini de genul (ultima valoare să fie httpd):

475 nobody 0 0 1388 1388 1232 S 0 0.0 1.0 0:00 httpd

Dacă vrem să vedem ce face Apache pe calculatorul nostru, cea mai simplă cale este să mergem (de pe calculator) cu browser-ul la:

http://localhost

Fișierele de configurare pentru instalarea noastră sunt la:

/www/conf/httpd.conf

Mergem acolo:

cd /www/conf

Dacă avem Apache instalat și deja îl folosim pentru a indica unele site-uri atunci probabil vom prefera să păstrăm fișierle de configurare. De obicei aceste fișiere se găsesc la:

/etc/httpd/conf/httpd.conf

Dacă facem un upgrade și vrem să păstrăm aceleași configurări (pornind de la ideea că este o versiune Apache compatibilă) atunci copiem peste cea nouă:

cp /etc/httpd/conf/httpd.conf .

Deasemenea s-ar putea să avem nevoie de existentele fișiere de configurare pentru acces și srm:

cp /etc/httpd/conf/access.conf .

cp /etc/httpd/conf/srm.conf .

Dacă configurăm pentru prima dată pe sistemul respectiv va trebui să edităm fișierul http.conf. Urmatoarele linii vor fi editate.

Dacă vrem ca apache să ruleze pe alt port decât cel obișnuit(80) atunci vom schiba la linia 238. Porturile mai mici de 1024 pot fi pornite numai de root. Port-ul 80 este cel mai convenabil de folosit pentru că toate celelalte porturi trebuie explicate în browser eg: http://localhost:81.

Port 80

Am putea schinba adresa de mail al administratorului 260:

ServerAdmin [anonimizat]

În linia 278 va trebui să specificăm numele calculatorului, s-ar putea să trebuiască să stergem semnul # . Dacă vom configura "virtual hosts" cum vor fi descrise mai jos atunci Apache va folosi "the virtual server" pe care îl numim aici ca default pentru site.

ServerName linux.ro

se modifică "document root" (va indica adresa unde ținem site-urile):

DocumentRoot "/www/sites"

și la linia 310:

<Directory "/www/sites">

Dacă vrem să putem schimba configurațiile apache pentru diferite directoare atunci va trebui să dăm voie fisierelor .htaccess . Pentru a face asta se setează AllowOverride ca All la linia 326:

AllowOverride All

Fișierul default va fi index.html. Putem modifica sau adăuga alte fișiere la linia 365:

DirectoryIndex index.html index.htm

Dacă nu avvem prea mulți vizitatori și vrem să știm de unde sunt ei atunci seteaza la linia 450 ca fiind on. Setandu-l on va încărca mai mult serverul pentru a afla ip-ul calculatoarelor care se conectează.

HostnameLookups ON

Rularea programului Apache: – dacă o altă versiune apache ruleză pe calculator va trebui sa fie oprită pentru a merge mai departe.. Există multe cai pentru a face asta, însa o cale mai rapida ar fi:

killall httpd

Pornirea noului server este simplă:

d /usr/local/etc/httpd/bin

./apachectl start

apachectl este cea mai simplă cale pentru a porni sau opri serverul manual. Ne putem ajuta de help-ul sau dacă ne încurcăm pe undeva:

./apachectl help

1.2.2. Pentru sisteme Windows

În cazul sistemelor Windows Apache necesită instalarea protocolului TCP/IP. După instalarea protocoalelor (dacă nu sunt deja instalate) se poate instala și serverul. Începând cu versiunea 1.3.20 acesta folosește noul Microsoft Installer care oferă la instalare și posibilitatea unei configurări minime a serverului. Totuși această configurare nu este suficientă în cele mai multe dintre cazuri, după cum vom vedea.

După instalare Apache poate rula ca serviciu pe sisteme Windows NT/2000 sau ca aplicație consola (MS-DOS Prompt) pe sisteme Windows 98.

Configurare

Configurarea serverului Apache se face, ca în cazul tuturor aplicațiilor proiectate pentru mediu Unix, prin intermediul unui fișier de configurare. Acest fișier se găsește în directorul /etc în cazul sistemelor Unix/Linux sau in c:\Program Files\Apache Group\Apache\conf în cazul sistemelor Windows 9x/NT/2000 și se numeste httpd.conf. Ca mai toate programele Open Source Apache beneficiază de un fișier de configurare foarte bine organizat și cu comentarii ce ajută foarte mult utilizatorul în configurarea serverului.

Fișierul este strucurat pe trei secțiuni. Prima secțiune conține configurarea mediului de lucru al serverului, a doua secțiune diverse opțiuni de securitate și suport pentru scripting, opțiunile pentru direcotare etc., iar a treia secțiune conține opțiuni de configurare privind sistemele virtuale (virtual hosts). Fișierul este organizat în directive și directive-container. Directiva reprezintă o opțiune de configurare, de forma <nume directiva> <optiune>, iar directivele containr pot conține mai multe directive de configurare. În cele ce urmează vom descrie configurarea serverului pentru un sistem Windows.

Secțiunea 1: Mediul de lucru (global environment)

Prima opțiune de interes este ServerRoot. Aceasta reprezintă directorul în care sunt stocate jurnalele de configurare, eroare și acces ale serverului. Implicit este directorul de instalare.

Timeout reprezintă numarul de secunde în care o conexiune ramane inactivă (idle). Implicit este stabilit la 300.

Secțiunea 2: Configurarea propriu-zisa (‘Main’ server configuration)

Port reprezintă numarul portului “ascultat” de server pentru stabilirea de conexiuni. Implicit (și recomandat) este 80.

ServerAdmin indică adresa de e-mail a administratorului server-ului. Este folosită în cazul generării erorilor, oferind posibilitatea celor ce accesează serverul să intre în contact cu webmasterul pentru corectarea erorilor.

ServerName reprezintă numele serverului (ex. www.rau.ro). ATENȚIE !!! Aceste nume nu pot fi inventate. Ele trebuie să fie bine determinate de serviciul DNS pentru ca cei care doresc accesarea serverului să ajungă exact la serverul dvs. Se poate trece și adresa IP a sistemului. În cazul în care folosim Apache doar pentru testare (fară a avea o conexiune la o retea) se poate folosi adresa localhost.

DocumentRoot este directorul fizic aflat pe hard-disk-ul sistemului unde vor fi stocate documentele (ex. C:\webroot). Implicit este setat pe c:\program files\…\htdocs.

Urmează apoi stabilirea proprietăților pentru directoare. Începând de la directorul “ / “ (radacină) al site-ului fiecare director are regulile sale. Prin intermediul acestor reguli se stabilesc niște drepturi de acces ale utilizatorilor asupra directoarelor site-ului (drept de citire, scriere, executie de scripturi etc.). De obicei regulile implicite sunt bine stabilite, necesitând modificari doar în cazuri exceptionale.

DirectoryIndex reprezintă pagina implicită a site-ului. Pagina implicită este acea pagină care se deschide la apelarea adresei web cu http://www.rau.ro . Implicit, această pagină este index.html, dar ea poat fi modificată sau se pot adauga noi pagini. De exemplu putem “pune” serverul să caute ca pagină implicită index.html, index.htm, index.php, default.htm, main.html etc.

ScriptAlias controlează directoarele care conțin scripturi (CGI sau SSI). Implicit este c:\program files\…\cgi-bin

AddType specifică tipuri de documente care necesită aplicații externe serverului pentru procesare (ex. scripturi PHP sau ASP). În formatul intern al serverului ele se definesc ca application/<tip>. Aici li se asociază un alias. De exemplu lui application/x-httpd-php (scriptul php) i se asociază .php.

AddHandler lasă utilizatorul să adauge diverse extensii la anumite aplicații interne sau externe serverului. Astfel putem stabili ca extesiile .php, .php3, .phtml etc. să fie folosite de aplicația php.

Action specifică ce program extern este rulat în cazul apelării unui alias descris de AddType. În cazul scripturilor php acesta este (evident) php.exe.

Sectiunea 3: Site-uri virtuale (virtual hosts)

În aceastș secțiune utilizatorul poate definii mai multe adrese virtuale pentru serverul sau. Aceasta lasă posibilitatea găzduirii mai multor site-uri pe un singur sistem. Un site virtual este încadrat de directivele:

<VirtualHost <adresa ip> >

ServerName …

ServerAdmin …

DocumentRoot …

.

.

.

</VirtualHost>

După cum vedem în directiva-container <VirtualHost> se poate scrie orice altă directivă de configurare, permițând astfel configurare separată a site-urilor.

Capitolul II

Limbajul de Scripting PHP

2.1 Introducere

PHP, acronim care provine din "PHP: Hypertext Preprocessor", este un limbaj de scripting utilizat pe scară largă, realizat și distribuit în sistem Open Source, care este special realizat pentru a dezvolta aplicații web, prin integrarea codului PHP în documente HTML. Sintaxa sa provine din C, Java și Perl și este ușor de învățat. Scopul principal al limbajului este acela de a scrie rapid pagini web dinamice, dar cu PHP se pot realiza mult mai multe. Pentru ultimele distribuții sau documentații php putem apela la site-ul http://www.php.net . De asemenea există și un manual php tradus parțial in romana la adresa http://www.php.net/docs.php de unde il putem extrage în mai multe formate (pdf,html,chm) sau vizualiza online.

2.2 Istorie

Prima versiune de PHP s-a numit PHP/FI. Ea a fost creată de Rasmus Lerdorf în 1995. Initial versiunea continea o colectie simplă de scripturi Perl scrisă pentru considerente proprii și care se numea ‘Personal Home Page Tools’. Cu timpul Rasmus a dezvoltat acest pachet adaugând cât mai multe facilități, cum ar fi comunicarea cu bazele de date, ceea ce ducea la dezvoltarea unor aplicații web dinamice, simple dar eficiente. Rasmus a hotarat să facă publice sursele PHP/FI pentru ca fiecare să beneficieze de avantajele lor și pentru a îmbunătăți codul. PHP/FI (Personal Home Page / Forms Interpreter) avea functionalitatea codului PHP din ziua de azi. Avea variabile ca în Perl, interpretare de formulare HTML, cod HTML integrat în sintaxe. Însusi sintaxa era similară cu cea din Perl, însa mult mai limitată, simplă și într-un fel inconsistentă.

În 1997 apare PHP/FI 2.0, și deja începe să câștige în popularitate, un grup de câteva sute de utilizatori din întreaga lume deja se arătau interesați de acest proiect iar aproximativ 50.000 de domenii aveau instalat PHP (ceea ce însemna 1% din totalul domeniilor de pe Internet la vremea aceea). Cu toate că un grup restrâns de persoane participau la development, totuși munca principală era făcută tot de un singur om (Rasmus Lerdorf). PHP/FI 2.0 a fost lansat oficial in Noiembrie 1997, după o lungă perioadă de releas-uri beta. La scurt timp își fac apariția și primele versiuni alpha de PHP 3.0.

PHP 3.0 este prima vesiune care era asemănătoare cu versiunile din zilele noastre. A fost creată și dezvoltată de Andi Gutmans si Zeev Suraski in 1997 care au rescris complet codul după ce și-au dat seama că PHP/FI 2.0 nu putea face față unei aplicații eCommerce la care ei lucrau la un proiect pentru universitate. Unindu-și eforturile cei doi au hotărât să participe la developmentul PHP și să creeze PHP 3.0

Una dintre cele mai mari proprietăți ale PHP 3.0 era extensibilitatea. Acest lucru a atras foarte mulți developeri care au contribuit cu noi module (comunicarea cu majoritatea tipurilor de baze de date, protocoale, API-uri). Un alt element cheie în PHP 3.0 a fost suportul pentru sintaxa orientată pe obiect care era în acest fel mult mai consistentă și flexibilă.

Noul limbaj a fost lansat sub un nume nou, care înlocuia ideea de aplicație cu uz personal din PHP/FI 2.0 și aducea una mai mare și disponibilă tuturor, la o scară mai mare: PHP: Hypertext Preprocessor.

La sfârșitul anului 1998, PHP se dezvoltase foarte mult, deja existau rapoarte care estimau zeci de mii de utilizatori și sute de mii de site-uri web care rulau PHP. În acest moment PHP constituia 10% din potențialul web al Internetului la vremea aceea.

PHP 3.0 a fost lansat pe piață oficial în Iunie 1998 după ce petrecuse 9 luni de testing public. În iarna lui 1998 la foarte scurt timp după PHP 3.0 a fost lansat Andi Gutmans și Zeev Suraski au început să rescrie codul PHP. Scopurile principale acum erau de a îmbunătăți performanța aplicațiilor mai complexe și de a extinde modularitatea codului PHP.

Noul engine a fost numit ‘Zend Engine’ (compus din numele Zeev si Andi) iar acesta putea face față aplicațiilor complexe cu succes. Acesta a fost prezentat pentru prima oara la mijlocul anului 1999. PHP 4.0 se bază pe acest engine care împreuna cu mai multe addonuri și îmbunătățiri a fost lansat în Mai 2000 la aproape 2 ani de la predecesorul sau PHP 3.0.

Noua versiune includea suport pentru majoritatea platformelor și serverelor web, sesiuni http, output buffering, moduri mai securizate de a manipula input-urile user-ilor, etc. PHP 4 este în prezent cea mai stabilă versiune de PHP. Deja s-a început developmentul la PHP 5.0 din care au fost facute publice câteva versiuni alpha.

În prezent PHP este folosit de sute de mii de programatori web și cateva milioane de site-uri care îl au instalat (estimari de 20% din domeniile de pe Internet existente în prezent). PHP 5.0 va include noua versiune a noului engine Zend Engine 2.0.

2.3. Instalare

Având în vedere extensibilitatea PHP-ului, de care am vorbit mai sus, acesta poate fi instalat pe o mare varietate de platforme fie că sunt de tip Unix, Microsoft, Sun, etc.

Vom discuta pe scurt despre instalarea pe platformele de tip Linux și Microsoft căci ele sunt cele mai utilizate de către enduseri.

2.3.1 Instalarea pe Windows

2.3.1.1. Instalarea pe Windows – metoda avansată, pas cu pas:

În primul rând avem nevoie de un server web. Cel mai recomandat pentru toate platformele este Apache http://httpd.apache.org, dar în funcție de situație putem alege IIS, PWS, nuSphere, OmniHTTPd, etc.

Dacă vom folosi Apache pe Windows atunci vom extrage ultima versiune ‘apache_x.x.xx-win32-x86-no_src.msi’ de la secțiunea Downloads.

Rulăm aplicația dăm ‘Next’ până screenul cu Server Information. Presupunând că rulăm apache pe calculatorul propriu și pentru uz propriu vom completa datele astfel:

Network domain: localhost

Server name: localhost

Administrators email: [anonimizat]

Install Apache HTTP Server programs and shortcut to: recomandat să selectaăm ‘Run as a service for all users’ (presupunând că nimeni nu mai are acces fizic la calculatorul nostru).

După aceasta vom fi introdusî în ecranul ‘Setup Type’ și avem două opțiuni ‘Complete’ sau ‘Custom’. Pentru un utilizator începător se selectează Complete pentru a nu exista probleme. Urmează ecranul ‘Destination Folder’ care este bine să fie lasat cel default adică C:\Program Files\Apache Group\.

După aceasta apasăm încă o data Next și apoi Install. Instalarea ar trebui să ruleze fără nici o problemă.

Din meniul Start ne uităm în Programs Apache HTTP Server . Observăm linkurile către documentatii și către ajutor rapid și 3 foldere cu linkuri către.

Configurarea și testarea configurării, Rulare/Oprire/Restart server, Log-urile serverului (acces.log si error.log). !Atentie! acestea din urma sunt foarte importante și ajută foarte mult la rezolvarea unor probleme de configurare deoarece ele dezvaluie problema și cauza ei.

Lasăm de-o parte serverul Apache și ne vom orienta după ultima dar și cea mai stabilă versiune de PHP pentru Windows de pe: http://www.php.net/downloads.php și vom extrage ‘php-x.x.x-package.exe’.

Rulăm executabilul, ne vom lovi automat de screenul ‘Instalation type’ unde avem două opțiuni ‘Standard’ și ‘Advanced’. Este recomandat selectarea instalării Standard după care vom fi întrebați despre folderul în care vrem să instalăm PHP.

Acest lucru este oarecum indiferent însa pentru comoditate vom instala PHP în același folder group cu Apache adică în C:\Program Files\Apache Group\PHP.

Click next, și apare screen-ul cu ‘Server Type’. Având în vedere că mai inainte am instalat Apache este logic ca să selectam optiunea ‘Apache’. Apare ultimul screen cu mesajul ‘You are ready to install PHP x.x.xx’ după care click pe Install. Instalarea trebuie să decurgă fără probleme, la sfârșit vOM avea parte de un mesaj însa care ne va înștiința că încă nu există un soft care să configureze automat Apache și PHP, instalate separat, împreună și de aceea va trebui să umblăm singuri în httpd.conf (fișierul de configurare al serverului Apache).

Iată cum se face configurarea manuala Apache + PHP pe platformele de tip Windows:

Configurare PHP – vom edita fisierul ‘php.ini’

– în primul rând ne asigurăm că DLL-urile (php4apache.dll, php4ts.dll – care este folosit tot timpul) necesare rulării PHP sunt regăsite de catre Windows. Pentru a face acest lucru posibil ne asigurăm că ele exista în Windows/System (WINNT/System) sau Windows/System32 sau că ele există în același director cu php.exe (în cazul de față în C:\Program Files\Apache Group\PHP)

– php4ts.dll este căutat în urmatoarea ordine:

1. în același director cu apache.exe

2. în același director cu php4apache.dll

3. în directoarele din Windows de mai sus

Concluzie este bine să avem ambele DLL-uri în același director.

– în directorul Windows vom găsi un fișier numit php.ini care trebuie editat. Deschidem acest fișier cu Notepad.

În continuare vom descrie pe rand modificările ce trebuie facute:

1. Cautăm ‘extension_dir’ și schimbăm setările directorului către calea unde am instalat PHP, în cazul de fata în “C:\Program Files\Apache Group\PHP”.

2. Cautăm ‘doc_root' și schimbăm setările cu calea către directorul unde este instalat Apache. În cazul de față “C:\Program Files\Apache Group\Apache”.

3. Acest pas nu este obligatoriu. Cautăm ‘extension=php_’ . Vom observa o listă cu extensii php. Putem decomenta liniile pentru care dorim să activăm extensia respectivă. Se recomandă să se citească documentația de instalare cu care vine PHP cu privire la extensiile pentru Windows.

Este recomandat ca mai întâi să rulăm Apache si PHP cu succes cu minim de efort și apoi să luăm în considerare extensiile sau alte module.

Salvăm fișierul php.ini.

Configurare Apache – vom edita fișierul httpd.conf

Deschidem httpd.conf cu Notepad și adăugăm urmatoarele linii:

#Inceput configurare Apache + PHP

LoadModule php4_module C:/Program Files/Apache Group/PHP/sapi/php4apache.dll

AddModule mod_php4.c

AddType application/x-httpd-php .php

Sfarsit configurare Apache + PHP

Notă: noile versiuni de Apache nu mai au nevoie de directiva ‘AddModule’.

Observație: se observă ca am folosit două tipuri de ‘slash-uri’ când am editat httpd.conf . De reținut că acesta poate accepta ambele tipuri de slash de exemplu: C:/Program Files\Apache Group\sapi/php4apache.dll.

Pentru developeri: este important de știut că dacă se adaugaă urmatoarea linie în httpd.conf se va obține sintax highlight la fișierele care se termină cu extensia .phps :

AddType application/x-httpd-php-source .phps

Acest procedeu este foarte bun pentru debugging online. De asemenea acest procedeu se poate efectua și printr-un fișier .htaccess.

Salvăm noul fișier httpd.conf.

Probleme frecvente de instalare:

– pot apărea pe platformele cu tehnologie NT unde un anume user (cu anume privilegii) nu poate avea acces la directorul Windows.
– apar des atunci când PHP rulează cu IIS sau PWS (Personal Web Server)
– paginile cu extensia .php sunt goale. Verificăm din nou configurația serverului.
– paginile cu extensia .php dau mesaje de eroare 500. Browse către directorul care conține php.exe, rulăm din command prompt “php.exe –i” (fără ghilimele). Dacă există probleme înseamnă că vor aparea erori explicite pe ecran și vom ști ce să facem.

Dacă însă pe ecran apar multe taguri html (echivalentul outputului funcției phpinfo() in html) atunci totul este în regula și trebuie verificată înca o data configurația serverului.

2.3.1.2 Instalarea pe Windows – metoda ușoara folosind kituri de instalare:

Sunt sigur multi dintre voi nu au rabdarea nici timpul sa instaleze Apache si PHP (eventual si MySQL) pe Windows prin metoda grea, de aceea exista pentru voi solutia salvatoare.

Nota: totusi mai tarziu daca veti rula un server online va trebui sa optati pentru varianta manuala fie ca sunteti pe windows sau pe unix. Este riscant sa aveti incredere in installere precompilate atunci cand le rulati online, de aceea trebuie sa tineti bine minte ca cele descrise mai sus si in continuare sunt pentru uz personal sau ‘offline’.

Exista mai multe pachete disponibile pe internet care ofera Apache cu PHP deja instalat si configurat. Dumneavoastra nu trebuie decat sa rulati un fisier gen ‘setup.exe’ si sa dati calea unde vreti sa fie instalat totul. Voi descrie numai cateva dintre aceste pachete care le-am testat si eu si pe care vi le recomand, restul le voi insira doar.

Firepages phpdev – pachetul contine PHP4.x.x, MySQLx, Apache 1.x.xx, and phpMyAdmin x.x.x + mod_perl(1.xx) 5.x.x bundle (+ Cerebus FTP). Este preconfigurat pentru orice Windows 9x/2K/XP, nu necesita nici un efort din partea utilizatorului, include gata instalate InvisionBoard Forum, PhpWebSite, PhpMyAdmin, plus diferite module pentru Apache. Este unul dintre cele mai bune kit-uri de instalare, stabil, din pacate in prezent contine versiuni mai vechi de PHP sau MySQL, iar pentru unii acest lucru poate fi o problema.

PHPtriad – ruleaza si pe Windows 9x/NT si pe Linux. Instaleaza PHP, Apache, Perl, Mysql si PhpMyAdmin.

Linux Easy Installer – Recomandat pentru enduseri care sunt incepatori in Linux. Pachetul este un script scris in Perl care iti da voie sa instalezi rapid Apache 2.x.xx, PHP 4.x.x, MySQL 3.xx.xx, phpMyAdmin 2.x.x de asemenea el contine si sursele kit-ului care pot fi modificare in functie de preferinte

Alte installere pentru windows,linux,mac sunt: Cowpack (apache2+php4), Appserv (PHP+GD2+gif read suport+zend optimizer+zend encoder+ming module+xml+zip module+mysql+phpmyadmin), PHPstar (installer pentru 4DwebStar, include GD libs, PNG, JPEG, T1LIB, IMAP, gettext, cURL, Mcrypt, Zlib, FreeType2, XML, PostgreSQL, MySQL, EXIF, OpenSSL, FTP, Ldap, sendmail, CGI, fastCGI – ruleaza pe MacOS), Apache2Triad (Apache, PHP, MySQL, Perl, OpenSSL, Tcl, Python, + manuale + PHPnuke, PhpMyAdmin, Awstats), FoxServ (Apache+MySQL+PHP, MyPHPadmin, zend optimizer, Python, MySQL FrontEnd), Apache Friends XAMPP, e-novative PHP, IBserver, EasyServ, Phperl, BigApache, Apache ToolBox, Fox Installer, PHP EasyWindows Installer, Fast-Pitch, SpaceServer, WinServ, microHOST, eZ Publish Installer, Maya PHP Update, Abria MySQL Lite, Instant Web Server, Apache Compile Kit, Install Webserver, Sokkit, LSN-Webmail, MAPis.

Dupa cum puteti observa mai sus aveti o gramada de optiuni la indemana, alegeti-o pe ce-a mai lejera si sigura.

2.3.2 Instalare pe Linux.

Probabil va intrebati cum este instalarea pe linux. Ea este la fel ca in windows difera insa pachetele apache si php. Pe scurt:

1. Descarcati cea mai stabila versiune de Apache: lynx

2. Dezarhivare: gzip -d httpd-2_0_NN.tar.gz sau tar xvf httpd-2_0_NN.tar

3. Configurare: ./configure –prefix=PREFIX

4. Compilare: make

Instalare: make install

6. Customizare: vi PREFIX/conf/httpd.conf

7. Testare server: PREFIX/bin/apachectl start

2.4. Elemente sintactice de bază

2.4.1. Modalități de ieșire ("escape") din HTML:

1. <? echo ("cea mai simpla modalitate – procesare de tip SGML\n"); ?>

2. <?php echo("modalitate recomandata pentru documente XHTML sau XML\n"); ?>

3. <script language="php">

echo ("pentru unele editoare (ca de exemplu FrontPage) ");

</script>

4. <% echo ("Taguri ASP"); %>

<%echo "$variabila …" %>

2.4.2. Scrierea comentariilor:

PHP implementează mai multe tipuri de comentarii: C, C++, shell-uri Unix.

<?php

echo "Testul numarul 1"; // Comentariu stil C++

/* Comentariu pe mai

multe linii stil C */

echo "Testul numarul 2";

echo "Testul numarul 3"; # Comentariu stil shell Unix

?>

2.4.3. Tipuri de date:

PHP suportă opt tipuri "primitive" de date: patru tipuri scalare (boolean, integer, floating-point și string); două tipuri agregate (vectori – arrays și obiecte) și două tipuri "speciale" (resource și null).

2.4.4. Variabile:

Variabilele în PHP sunt reprezentate de semnul dolar ($) urmat de numele variabilei.

$var = "Ion";

$Var = "Gheorghe";

echo $var, $Var"; //iesirea in browser este "Ion, Gheorghe"

2.4.5. Operatori:

Operatorii aritmetici obișnuiți: "+"; "-"; "*"; "/"; "%" (modul).

Operatori de atribuire și compuși (similar cu C): "="; "+="; ".=" (concatenare) etc.

Operatori relaționali: "=="; "===" (identitate); "!="; "!==" (neidentitate); ">"; "<"; "<="; ">=".

Operatori de (post și pre) incrementare/decrementare: "++"; "–".

Operatori logici: "and"; "or"; "xor"; "!" (not), sau "&&" (and); "||" (or).

2.4.6. Structuri de control:

1. Structura if

if (expresie logică) {

bloc de instrucțiuni pentru TRUE

} [else sau elseif {

bloc de instrucțiuni pentru FALSE

}]

Se poate folosi și o sintaxă alternativă:

if (expresie logică):

bloc de instrucțiuni pentru TRUE

[else:

bloc de instrucțiuni pentru FALSE]

endif;

2. Structura while

while (expresie logică) {bloc de instrucțiuni}

sau, în sintaxă alternativă:

while (expresie logică):

bloc de instrucțiuni

endwhile;

3. Structura do … while

do {

bloc de instrucțiuni

}

while (expresie logică);

4. Structura for

for (expr1; expr2; expr3) {

bloc de instrucțiuni

}

sau, în sintaxă alternativă:

for (expr1; expr2; expr3):

bloc de instrucțiuni

endfor;

expr1, expr2 și expr3 au semnificația cunoscută din C.

5. Structura switch … case

switch (expresie) {

case valoare0:

bloc de instrucțiuni

case valoare1:

bloc de instrucțiuni

…..

default:

bloc de instrucțiuni

}

sau, în sintaxă alternativă:

switch (expresie):

case valoare0:

bloc de instrucțiuni

case valoare1:

bloc de instrucțiuni

…..

default:

bloc de instrucțiuni

endswitch;

2.5. Exemple de scripturi

2.5.1 Exemplu de script complex în PHP

La apăsarea pe butonul "OK" din formular se execută pe serverul Web scriptul "mailadd.php3" cerut cu metoda "post". În continuare sunt prezentate, din acest script, porțiuni relevante privind funcționalitatea PHP.

<?

// PROGRAM PT. ADAUGAREA DE CONTURI DE POP3

//

// FUNCTII

//

function lock ($seconds)

{

$i=0;

while (1):

$s=exec ("…..", $d, $r);

if ($r == 0) return 0;

sleep (1);

$i++;

if ($i==$seconds) return 1;

endwhile; // asteapta expirarea time/aut

}

//

// functie pentru verificarea existentei unui cont

//

function chkuser ($np, $buf)

{

$np = chr (10) . $np . ":"; // stringul de cautare are forma LF"nume cont propus":

$rs = strstr ($buf, $np); // stringul rezultat

if (strlen($rs) == 0) return 1; // nu exista

return 0; // exista

}

//

// PROGRAMUL PRINCIPAL

// ESTE APELAT DIN BROWSER

// verificarea datelor primite de la browser (din form)

//

// verifica daca a fost apelat prin form (cimp ascuns)

if ($C1 != "ON"):

readfile("mailadd.htm");

exit;

endif;

// daca scriptul a fost apelat prin parametri (si nu prin form), verifica

// parametrii

if (($profstud_f != "stud" and $profstud_f != "prof") or

($facultate_f != "com" and $facultate_f != "rei" and

$facultate_f != "alte" and $facultate_f != "cib" and $facultate_f != "sels" and $facultate_f != "col") or

($anulstudii_f != "1" and $anulstudii_f != "2" and $anulstudii_f != "3" and $anulstudii_f != "4" and $anulstudii_f != "5")):

readfile("mailadd.htm");

exit;

endif;

// verifica cimpurile completate de utilizator

$nume_f=trim($nume_f);

$prenume_f=trim($prenume_f);

$parola_f=trim($parola_f);

$verifparola_f=trim($verifparola_f);

if (strlen($nume_f) < 3 or

strlen($nume_f) > 15 or

strlen($prenume_f) < 3 or

strlen($prenume_f) > 15 or

strlen($parola_f) < 5 or

strlen($parola_f) > 7 or

strlen($verifparola_f) != strlen($parola_f) or

$parola_f != $verifparola_f):

print "<html>

<head>

<title>Eroare de completare</title>

</head>

<body bgcolor=#00FFFF text=#FF0000>

<p><strong><blink>EROARE! </blink></strong></p>

<p><strong>TOATE CIMPURILE DIN FORMULAR TREBUIESC COMPLETATE CONFORM<br> SPECIFICATIILOR DIN FORMULAR. </strong></p><p><strong>RELUATI.</strong></p>

</body>

</html>";

exit;

endif;

if ($profstud_f == "stud" and $facultate_f == "alte"):

print "<title>Eroare</title><BR><B>EROARE! Serviciu de e-mail numai pentru studentii de la ….";

exit;

endif;

//

// verifica non blancuri in cimpurile de parola

//

$blanc = strstr ($parola_f, " ");

if (strlen($blanc) != 0):

print "<title>Eroare</title><BR><b>EROARE! NU SE ADMIT BLANCURI IN CIMPURILE DE TIP TEXT";

exit;

endif;

// numai litere in numele de cont viitor

//

$n= strtolower($nume_f) . strtolower($prenume_f);

$n1= strtolower($prenume_f) . strtolower($nume_f);

$eroare=0;

// Verifica numai litere

for ($i = 0; $i < strlen($n); $i++)

{

if (ord(substr($n,$i,1)) < 97 or ord(substr($n,$i,1)) > 122): $eroare=1;

break;

endif;

}

if ($eroare):

print "<title>Eroare</title><BR><b>EROARE! NU SE ADMIT DECIT CARACTERE ALFABETICE, FARA ….. ";

exit;

endif;

// construieste identificatorul

//

// numarul de telefon interior

//

$id3=$telefon_f;

if (strlen($telefon_f) != 3):

$id3="";

else:

for ($i = 0; $i < strlen($telefon_f); $i++)

{

if (ord(substr($telefon_f,$i,1)) < 48 or ord(substr($telefon_f,$i,1)) > 57): $id3="";

break;

endif;

}

endif;

if ($profstud_f == "stud") $id3="";

$id1=strtoupper($nume_f) . "." . strtoupper($prenume_f) . ",";

$id1_1="";

if ($profstud_f == "stud") $id1_1= "Anul." . $anulstudii_f;

$id2=$profstud_f . "," . $facultate_f . "," . "Telefon." . $id3 . "," . $id1_1 . "," . $id=$id1 . $id2;

// construieste grupul tip Unix

//

if ($profstud_f == "prof" and $facultate_f == "com") $grp=150;

if ($profstud_f == "prof" and $facultate_f == "rei") $grp=200;

if ($profstud_f == "prof" and $facultate_f == "cib") $grp=450;

if ($profstud_f == "prof" and $facultate_f == "sels") $grp=500;

if ($profstud_f == "prof" and $facultate_f == "col") $grp=550;

if ($profstud_f == "prof" and $facultate_f == "alte") $grp=250;

if ($profstud_f == "stud" and $facultate_f == "com") $grp=300;

if ($profstud_f == "stud" and $facultate_f == "rei") $grp=350;

if ($profstud_f == "stud" and $facultate_f == "cib") $grp=400;

if ($profstud_f == "stud" and $facultate_f == "sels") $grp=600;

if ($profstud_f == "stud" and $facultate_f == "col") $grp=650;

//

// criptare parola

//

$ever = 1;

while ($ever):

$p=crypt($parola_f);

$qm = strstr ($p, "?");

if (strlen($qm) == 0) $ever = 0;

endwhile;

// lungime trebuie sa fie 8 caractere!

if ($profstud_f == "prof"):

$n = substr($n, 0, 8);

$n1 = substr($n1, 0, 8);

switch (strlen($n))

{

case 6 :

$n .= "00";

$n1 .= "00";

break;

case 7 :

$n .= "0";

$n1 .= "0";

break;

default : // deja sunt 8 caractere!

break;

}

else:

$n="s." . substr($n, 0, 6); // pentru studenti

$n1="s." . substr($n1, 0, 6);

endif;

// construieste contul

//

// blocheaza server

//

$timeout=5; // secunde de time/aut

if (lock($timeout)):

print "<title>Eroare</title><BR>SERVERUL ESTE MOMENTAN OCUPAT. REVENITI MAI TIRZIU.";

exit;

endif;

$fid = fopen ("….", "r"); // deschide fisier

$buffer = fread ($fid, filesize ("…."));

$retur = fclose ($fid);

// verifica daca nu cumva exista contul

// si eventual creeaza sinonime

// verifica cu nume+prenume

if (chkuser($n, $buffer) == 0):

// verifica cu prenume+nume

if (chkuser($n1, $buffer) == 0):

$last=substr($n,7,1);

$rest=substr($n,0,7);

while (chkuser($n, $buffer) == 0):

if ($last <= "9"):

// construieste sinonim

$last++;

if ($last > "9"):

print "<title>Eroare</title><p><strong>PREA MULTE SINONIME. PENTRU REZOLVAREA PROBLEMEI CONTACTATI PERSOANELE RESPONSABILE CONFORM </strong><ahref=http://mailcom.ase.ro/mailuser.htm#respons><strong>LISTEI DIN PAGINA PRINCIPALA.</"; // acceptam numai 10

unlock();

exit;

endif;

else:

$last="0";

endif;

$n=$rest . $last;

endwhile;

else:

$n = $n1;

endif;

endif;

$s = exec ("……", $nutrebuie, $stare);

if ($stare):

print "<title>Eroare</title><p><strong>EROARE SOFTWARE. PENTRU REZOLVAREA PROBLEMEI CONTACTATI PERSOANELE RESPONSABILE CONFORM </strong><ahref=http://mailcom.ase.ro/mailuser.htm#respons><strong>LISTEI DIN PAGINA PRINCIPALA.</";

unlock();

exit;

endif;

else:

$last="0";

endif;

$n=$rest . $last;

endwhile;

else:

$n = $n1;

endif;

endif;

$s = exec ("…..", $nutrebuie, $stare);

if ($stare):

print "<title>Eroare</title><p><strong>EROARE SOFTWARE. PENTRU REZOLVAREA PROBLEMEI CONTACTATI PERSOANELE RESPONSABILE CONFORM </strong><a

href=http://mailcom.ase.ro/mailuser.htm#respons><strong>LISTEI DIN PAGINA PRINCIPALA.</";

unlock();

exit;

endif;

unlock();

// PRINT MESAJ – CONT CREAT OK

print "<html>

<head>

<title>OK-cont creat</title>

</head>

<body bgcolor=#0000FF text=#FFFF00>

<p><font size=6><strong>OK.</strong></font></p>

<p><font size=4>Va rugam sa va notati</font></p>

<p><font size=4>Contul dvs. este:</font></p>

<p><font size=6><strong>$n</strong></font><font size=4>@</font><fontsize=6><strong>mailcom.ase.ro</strong></font></p></body>

</html>";

exit;

// SFIRSIT PROGRAM PRINCIPAL

?>

2.5.2. Exemplu de procesare PHP pentru document XML

Lucrul cu documente XML este oarecum similar cu lucrul cu o tabelă dintr-o bază de date.

Funcțiile de acces XML din PHP permit specificarea a trei tipuri de acțiuni care prelucrează date dintr-un fișier XML: deschiderea tagurilor; pasarea datelor între taguri; procesarea tagurilor de sfârșit.

În exemplul care urmează sunt definite următoarele taguri în documentul XML: STORY, TITLE, URL, TIME, AUTHOR, DEPARTMENT, TOPIC, COMMENTS, SECTION și IMAGE.

În unele cazuri ar putea exista atribute (de exemplu HREF este un atribut a tagului A din HTML). PHP procesează aceste atribute în mod simplu și, practic, automat.

Scriptul PHP trebuie să definească tagurile din documentul XML:

<?php

$open_tags = array(

'STORY' => '<STORY>',

'TITLE' => '<TITLE>',

'URL' => '<URL>');

$close_tags = array(

'STORY' => '</STORY>',

'TITLE' => '</TITLE>',

'URL' => '</URL>');

?>

În continuare sunt prezentate funcțiile PHP corespunzătoare:

<?php

// procesarea tagurilor de deschidere.

// $attrs este un vector (array) multidimensional indexat cu atributul

// name și primește valoarea acelui atribut

function startElement($parser, $name, $attrs=''){

global $open_tags, $temp, $current_tag;

$current_tag = $name;

if ($format = $open_tags[$name]){

switch($name){

case 'STORY':

echo 'New Story: ';

break;

default:

break;

}

}

}

// variabila $current_tag specifică tagul curent.

// la întâlnirea unui tag </STORY> se eliberează variabilele temporare

// și se trece la următorul element

function endElement($parser, $name, $attrs=''){

global $close_tags, $temp, $current_tag;

if ($format = $close_tags[$name]){

switch($name){

case 'STORY':

return_page($temp);

$temp = '';

break;

default:

break;

}

}

}

// această funcție pasează datele între elemente

// de exemplu, variabila $data va primi valoarea 'Title Here'

// din linia <TITLE>Title Here</TITLE>

function characterData($parser, $data){

global $current_tag, $temp, $catID;

switch($current_tag){

case 'TITLE':

$temp['title'] = $data;

$current_tag = '';

break;

case 'URL':

$temp['url'] = $data;

$current_tag = '';

break;

default:

break;

}

}

?>

Urmează codul PHP pentru parsingul fișierului XML:

<?php

function return_page(){

global $temp;

echo 'o <A HREF="'.$temp['url'].'">'.$temp['title'].'</A><BR>';

}

// descrierea fișierului

$xml_file = 'slashdot.xml';

// declararea setului de caractere

$type = 'UTF-8';

// se creează parserul

$xml_parser = xml_parser_create($type);

// diverse opțiuni ale parserului

xml_parser_set_option($xml_parser, XML_OPTION_CASE_FOLDING, true);

xml_parser_set_option($xml_parser, XML_OPTION_TARGET_ENCODING, 'UTF-8');

// funcțiile apelate la întâlnirea unui nou element

xml_set_element_handler($xml_parser, 'startElement','endElement');

// funcția apelată pentru prelucrarea datelor de tip caracter

xml_set_character_data_handler($xml_parser, 'characterData');

if (!($fp = fopen($xml_file, 'r'))) {

die("Nu se poate deschide $xml_file pentru parsing!\n");

}

// ciclează prin tot fișierul

while ($data = fread($fp, 4096)) {

if (!($data = utf8_encode($data))) {

echo 'EROARE'."\n";

}

if (!xml_parse($xml_parser, $data, feof($fp))) {

die(sprintf( "Eroare XML: %s la linia %d\n\n",

xml_error_string(xml_get_error_code($xml_parser)),

xml_get_current_line_number($xml_parser)));

}

}

xml_parser_free($xml_parser);

?>

=== Capitolul III ===

Capitolul III

Sisteme de Gestiune a Bazelor de Date

Relaționale MYSQL (SGBDR)

3.1 Introducere

De ce să optez pentru MySQL?

Dacă sunteți în căutarea unui sistem gratuit sau necostisitor de gestiune a bazelor de date, puteți alege din mai multe opțiuni: MySQL, mSQL, Postgres, unul din motoarele gratuite (dar fără suport) furnizate de producătorii comerciali și așa mai departe. Când comparați MySQL cu alte sisteme de baze de date, gândiți-vă la ceea ce este cel mai important pentru dumneavoastră. Performanță, suport, caracteristici (conformantă cu SQL, extensii etc.), condiții si restricții de licențiere, preț; toate acestea constituie factori care trebuie luați în considerare. Date fiind aceste considerații, MySQL are de oferit numeroase caracteristici atractive:

• Viteză. MySQL este rapid. Programatorii pretind că MySQL este cel mai rapid sistem de baze de date pe care îl puteți găsi. Puteți verifica această afirmație vizitând http: //www. mysql. com/benchmark. html, o pagină de comparație a performanțelor din situ! Web MySQL.

• Ușurință în utilizare. MySQL este un sistem de baze de date cu performanțe ridicate, dar relativ simplu, a cărui configurare și administrare sunt mult mai simple decât în cazul sistemelor mai mari.

• Cost. MySQL este gratuit pentru majoritatea utilizărilor interne. Vezi secțiunea „MySQL este gratuit?" ulterior în această introducere.

• Suport pentru limbaje de interogare. MySQL înțelege SQL (Structured Query Language – limbaj de interogare structurat), limbajul preferat al tuturor sistemelor moderne de baze de date. De asemenea, puteți avea acces la MySQL folosind aplicații care acceptă ODBC (Open Database Connectivity), un protocol de comunicație cu bazele de date creat de Microsoft.

• Caracteristici. La server se pot conecta mai mulți clienți simultan. Clienții pot folosi mai multe baze de date simultan. Puteți obține acces la MySQL în mod interactiv, folosind numeroase interfețe care vă permit să introduceți interogări și să vizualizați rezultate: clienți în linie de comandă, browsere Web sau clienți X Window System. De asemenea, este disponibilă o varietate de interfețe de programare pentru limbaje precum C, Perl, Java, PHP și Python. Astfel, aveți opțiunea de a folosi programe client preambalate sau de a vă scrie propriile programe client pentru aplicații personalizate.

• Conectivitate și securitate. MySQL poate fi folosit integral în rețele, iar bazele de date sunt accesibile de oriunde din Internet, deci vă puteți partaja datele cu oricine, oriunde. Dar MySQL are controlul accesului, astfel încât persoanele care nu au dreptul să vă citească datele nu vor avea această posibilitate.

• Portabilitate. MySQL rulează pe numeroase varietăți de UNIX, precum și pe alte sisteme non-UNIX, ca Windows și OS/2. MySQL rulează pe echipamente de la calculatoare de birou la servere cu performanțe ridicate.

• Distribuție liberă. MySQL este ușor de obținut; pentru aceasta, folosiți-vă browserul de Web. Dacă nu înțelegeți funcționarea unei componente sau sunteți curios cu privire la un algoritm, vă puteți procura codul sursă si îl puteți examina. Dacă nu vă place modul de funcționare a unei componente, îl puteți modifica.

Dar suportul? Bună întrebare; o bază de date nu este de prea mare folos dacă nu puteți obține asistență în raport cu ea. Natural, mi-ar plăcea să cred că această carte conține tot ajutorul de care aveți nevoie. Realist vorbind, însă, veți avea întrebări la care nu m-am gândit niciodată sau pentru care nu am avut spațiu suficient. Veți descoperi că mai există și alte resurse, dar și că MySQL este dotat cu un sistem de asistență performant:

• MySQL include un manual de referință de mari dimensiuni (450 de pagini si mai crește…)

• Sunt disponibile contracte de asistență tehnică de la dezvoltatorii MySQL, pentru cei care preferă un acord formal.

• Există o listă de corespondență activă, la care se poate înscrie oricine. Această listă conține numeroși participanți utili, inclusiv dezvoltatorii MySQL. Ca resursă pentru asistență, mulți o găsesc suficientă pentru necesitățile proprii.

Comunitatea MySQL, programatori si ne-programatori, este extrem de cooperantă. Răspunsurile la întrebările din lista de corespondență sosesc, de regulă, în câteva minute. La semnalarea unor hibe, programatorii lansează un remediu în câteva zile (uneori ore!), iar remediile sunt disponibile imediat prin Internet. Comparați aceasta cu experiența deseori frustrantă a navigării prin canalele „bizantine" de suport ale marilor producători. (Ați fost pe-acolo? Și eu am fost. Știu ce alternativă să folosesc atunci când am o întrebare despre un produs. Nu se poate face comparație între a fi pus pe „apel în așteptare" la discreția unui producător si posibilitatea de a publica o întrebare într-o listă de corespondență și a verifica existența răspunsurilor atunci când îmi convine.)

MySQL este un candidat ideal pentru evaluare dacă vă aflați în procesul de selectare a sistemelor de baze de date. Puteți încerca MySQL fără nici un pericol de implicare financiară. Totuși, dacă vă încurcați, puteți folosi lista de corespondență pentru a fi ajutat. O evaluare costă o parte din timpul dumneavoastră, dar acest lucru este valabil indiferent de sistemul de baze de date pe care îl aveți în vedere – si este perfect adevărat că timpul de instalare si configurare pentru MySQL este mai redus decât pentru multe alte sisteme.

Folosiți deja un alt SGBDR?

Dacă în prezent utilizați un alt sistem de baze de date, trebuie să treceți la MySQL? Nu în mod necesar. Dacă sunteți satisfăcut de sistemul dumneavoastră actual, de ce să vă deranjați cu o atare tranziție? Dar dacă vă simțiți limitat de sistemul folosit, trebuie categoric să aveți în vedere MySQL. Poate că performanțele sistemului dumneavoastră curent reprezintă o problemă, sau poate că sistemul respectiv este „de firmă" și nu vă place să fiți „blocat" de acesta. Poate ați prefera să folosiți componente hardware care nu sunt acceptate de sistemul dumneavoastră actual sau poate că programul este furnizat în format binar, iar dumneavoastră preferați să aveți la dispoziție codul sursă. Sau poate că pur și simplu e prea costisitor! Toate acestea reprezintă motive pentru a lua în considerare MySQL. Folosiți această carte pentru a vă familiariza cu posibilitățile sistemului MySQL, puneți câteva întrebări în lista de corespondență MySQL si probabil că veți găsi răspunsurile necesare pentru a lua o decizie.

Dacă aveți în vedere trecerea de la un alt sistem de baze de date SQL la MySQL, examinați pagina de comparație din situl Web MySQL, la adresa http://www.mysql.com/ crash-me-choose. htmy. Apoi, consultați capitolele care tratează tipurile de date MySQL și dialectul SQL. Puteți ajunge la concluzia că versiunea de SQL acceptată de sistemul dumneavoastră curent de gestiune a bazelor de date relaționale este mult prea diferit și că portarea aplicațiilor dumneavoastră ar implica un efort semnificativ.

O parte din evaluarea dumneavoastră trebuie să o reprezinte încercarea de a porta diferite exemple, desigur, deoarece s-ar putea să nu fie atât de greu precum credeți. S-ar putea să nu fie chiar atât de greu chiar dacă sistemul dumneavoastră de baze de date este unul mai vechi, care nu înțelege SQL. Eu am convertit recent un sistem de gestiune a înregistrărilor de la un SGBDR care nu era bazat pe SQL. Nu exista nici o asemănare între limbaje care să poată fi utilizată, iar unele dintre tipurile de date nu aveau echivalent în SQL. Acest proces a necesitat conversia metodelor de acces la rețea si zeci de programe de introducere bazate pe ecran si de interogări „conservate". A fost necesară o lună si jumătate de eforturi „cu normă întreagă", ceea ce n-a fost chiar atât de rău.

Instrumente furnizate cu MySQL

Distribuția MySQL include următoarele instrumente:

• Un server SQL. Acesta este motorul care activează MySQL si care furnizează accesul la bazele dumneavoastră de date.

• Programe client pentru accesul la server. Un program interactiv vă permite să introduceți interogări în mod direct și să vizualizați rezultatele, iar numeroasele programe administrative și utilitare vă ajută să vă rulați situl. Un utilitar vă permite să controlați serverul. Altele vă permit să importați sau să exportați date, să verificați permisiunile de acces si multe altele.

• O bibliotecă client pentru scrierea propriilor dumneavoastră programe. Puteți scrie programe client în C, deoarece biblioteca este scrisă în C, dar biblioteca mai furnizează si baza pentru terțe asocieri pentru alte limbaje.

In afara programelor furnizate cu MySQL, MySQL însuși este folosit de către numeroase persoane talentate și capabile, cărora le place să scrie programe pentru a-și îmbunătăți productivitatea și care doresc să pună la dispoziția publicului aceste programe. Rezultatul este că aveți acces la o diversitate de instrumente produse de terțe părți, care facilitează utilizarea sistemului MySQL sau care extind aria de acțiune a acestuia în domenii precum dezvoltarea siturilor Web.

MySQL este gratuit?

MySQL nu este un produs Open Source, dar, în general, poate fi folosit gratuit. Trebuie să consultați manualul de referință MySQL pentru detalii privind licența, dar principiile de bază sunt următoarele:

• Programele client și biblioteca de programare a clienților sunt gratuite, pe toate platformele.

• Pentru UNIX si alte platforme non-Windows, serverul MySQL poate fi folosit gratuit, cu excepția situațiilor când doriți să vindeți serverul sau alte programe sau servicii care impun utilizarea acestuia, în această situație, trebuie să obțineți licență pentru server. Ideea este că, dacă obțineți un profit din MySQL, este normal ca dezvoltatorii sistemului să primească o parte din acesta. (200 de dolari este o nimica toată pentru un specialist SGBDR care vă ajută să obțineți un profit și există o mulțime de programe gratuite pe care vi le puteți procura pentru a folosi eficient sistemul.)

• Versiunea Windows a serverului MySQL impune obținerea unei licențe.

• Versiunile mai vechi de MySQL sunt disponibile în condițiile licenței publice GNU (GPL) și pot fi folosite în orice scopuri, fără nici o plată. MySQL 3.20.32a este disponibil în condițiile GPL.

Indiferent daca aveți sau nu nevoie de o licența pentru server, se poate obține o asistența formală, contra cost, de la programatorii MySQL, și vă sfătuiesc să folosiți această ocazie, mai ales dacă lucrați într-o firmă a cărei conducere „mârâie" la fiecare program pentru care nu există un astfel de acord. Sunt disponibile numeroase niveluri de suport și, în afară de obținerea unei asistente excelente, veți contribui la dezvoltarea în continuare a sistemului MySQL și, implicit, a întregii comunități MySQL.

O notă despre licența Windows

Uneori se pune întrebarea: „Cum adică trebuie să obțin licență pentru serverul MySQL numai fiindcă rulez

•. Windows?" Aceasta este o întrebare rezonabilă, la care există un răspuns rezonabil. Gândiți-vă la

' aspectele economice ale problemei. Pentru a vă angaja în dezvoltarea de programe, aveți nevoie de un

sistem de operare si de unele instrumente de dezvoltare, cum ar fi un editor și un compilator. Relativ la ., aceste cerințe, există o diferență fundamentală între dezvoltarea pentru UNIX si dezvoltarea pentru

Windows. Sub UNIX, puteți obține gratuit cam tot ceea ce aveți nevoie:

'' • Pentru sistemul de operare, aveți numeroase opțiuni, cum sunt Linux sau una din variantele BSD gratuite, cum sunt FreeBSD, NetBSD și OpenBSD.

• Pentru instrumentele de dezvoltare, toate aceste sisteme de operare sunt dotate cu editoare precum vi si emacs, precum și compilatoare ca gcc și egcs.

• Când sunt lansate actualizări ale sistemelor de operare sau ale instrumentelor de dezvoltare, le puteți pur și simplu descărca din Internet sau vă puteți procura un compact disc necostisitor. Acest lucru este valabil chiar si pentru revizuirile substanțiale.

Pe de altă parte, dezvoltarea programelor în Windows este relativ costisitoare:

• Sistemul de operare nu este gratuit.

• Instrumentele de dezvoltare, precum compilatorul, nu sunt gratuite.

• Când sunt lansate actualizări ale sistemului de operare sau ale instrumentelor, trebuie să plătiți din nou, chiar dacă acestea nu sunt altceva decât remedii pentru hibe sau actualizări incrementale de mică importanță.

Toate acestea înseamnă ca, în timp ce costurile pentru dezvoltarea programelor în UNIX sunt, în esență, nule, pentru Windows acestea pot atinge valori considerabile. Se prea poate ca dezvoltatorilor MySQL să le placă să lucreze cu MySQL, dar nu atât de mult încât sa fie dispuși să plătească pentru acest privilegiu. Costurile de dezvoltare sub Windows trebuie recuperate într-un fel sau altul, iar taxa pentru licență este modul în care se produce această recuperare.

În plus, dezvoltatorii au descoperit că programarea sub Windows necesită mai mult timp decât cea sub UNIX. Deoarece timpul dezvoltatorilor are o mărime fixă, acesta este un cost care trebuie suportat pe • spezele versiunii UNIX (care este, în fond, platforma primară de dezvoltare a sistemului MySQL). Taxa de licență Windows furnizează un stimulent pentru orientarea timpului și a eforturilor spre portul Windows,

Dacă doriți să rulați Windows, dar nu doriți să obțineți licență pentru server, aveți unele opțiuni:

• Există o versiune shareware a sistemului MySQL, pe care o puteți testa pentru evaluare. Această versiune vă oferă 30 de zile pentru utilizarea serverului, după care puteți decide dacă veți plăti licența pentru el.

• Dacă rulați serverul Windows în scopuri educaționale sau în instituții universitare sau de cercetare guvernamentale, puteți cere dezvoltatorilor să vă scutească de taxa de licență.

• Programele client sunt gratuite în orice caz, deci, dacă puteți găsi pe cineva care rulează deja un server si este dispus să vă permită să-l folosiți, aveți acces complet la caracteristicile sistemului MySQL.

Ce puteți aștepta de la această carte

Citind volumul de față, puteți învăța sa folosiți sistemul MySQL in mod eficient, astfel încât să vă puteți face treaba într-un mod mai productiv. Veți putea determina modul de introducere a informațiilor dumneavoastră într-o bază de date și veți învăța să formulați interogări care să vă ofere răspunsuri la întrebări pe care doriți să le puneți relativ la acele date.

Nu trebuie să fiți programator pentru a înțelege sau pentru a folosi SQL. Această carte vă va arăta cum funcționează sistemul. Dar, pentru a înțelege modul de utilizare adecvată a unei baze de date, nu este suficient să cunoști sintaxa SQL. Lucrarea pune accentul pe caracteristicile unice ale sistemului MySQL și indică modul de utilizare a acestora. Alte cărți se concentrează asupra limbajului SQL în general, respectiv asupra dialectului SQL al unui alt SGBDR.

De asemenea, veți vedea care este modul de integrare al sistemului MySQL cu alte instrumente. Cartea prezintă modul de utilizare a sistemului MySQL cu PHP sau Perl pentru a genera pagini Web dinamice, create din rezultatele interogărilor aplicate bazelor de date. Veți învăța să scrieți propriile dumneavoastră programe care să aibă acces la bazele de date MySQL. Toate acestea îmbunătățesc posibilitățile SQL de a satisface cerințele aplicațiilor dumneavoastră particulare.

Dacă veți fi responsabil cu administrarea unei instalări MySQL, această carte vă va arăta care sunt îndatoririle dumneavoastră și modul de îndeplinire a acestora. Veți învăța să configurați conturi de utilizator, să executați copii de siguranță ale bazelor de date și să luați măsuri pentru a asigura securitatea sitului dumneavoastră.

3.1.1 Utilizarea generală a sistemului MySQL

• Introducere în MySQL și SQL. Discută despre modul în care MySQL vă poate fi de folos și conține un manual general care prezintă programul client interactiv MySQL și care tratează elementele fundamentale ale limbajului SQL.

» Lucrul cu date în MySQL. Discută tipurile de coloane furnizate de SQL pentru descrierea datelor dumneavoastră, proprietățile și dezavantajele fiecărui tip, când și cum să utilizați aceste tipuri, modul de selectare dintre tipuri similare, evaluarea expresiilor și conversia tipurilor.

• Sintaxa si utilizarea SQL în MySQL. Fiecare SGBDR important existent în prezent înțelege SQL, dar fiecare motor de baze de date implementează un dialect SQL ușor diferit. Acest capitol discută despre SQL, cu accent asupra acelor caracteristici distinctive ale sistemului MySQL. De asemenea, discută despre caracteristici prezente în alte sisteme de baze de date, dar inexistente în SQL, precum și soluțiile existente.

• Optimizarea interogărilor. Un mod mai eficient de rulare a interogărilor.

3.1.2 Utilizarea interfețelor de programare ale sistemului MySQL

• Introducere în programarea MySQL. Discută despre unele interfețe de programare a aplicațiilor disponibile sub MySQL si conține o comparație generală a interfețelor API pe care cartea le tratează în detaliu.

• Interfața API MySQL pentru C. Modul de scriere a programelor C folosind interfața API furnizată de biblioteca client inclusă în distribuția MySQL.

• Interfața API pentru Perl DBI. Modul de scriere a scripturilor Perl folosind modulul DBI. Tratează scripturile autonome si scripturile CGI pentru programarea siturilor Web.

• Interfața API pentru PHP. Modul de utilizare a limbajului de scripting PHP pentru a scrie pagini Web dinamice, care obțin acces la bazele de date MySQL.

3.1.3 Administrarea sistemului MySQL

• Introducere în administrarea sistemului MySQL. Prezintă îndatoririle unui administrator de baze de date și noțiunile pe care trebuie să le cunoașteți pentru a rula un sit performant.

• Catalogul de date MySQL. O examinare aprofundată a organizării și conținutului catalogului de date, regiunea în care MySQL stochează bazele de date si fișierele de stare.

• Administrarea generală a sistemului MySQL. Modul în care vă puteți asigura că serverul dumneavoastră pornește, respectiv se oprește în mod adecvat atunci când sistemul dumneavoastră execută această operație. De asemenea, include instrucțiuni pentru configurarea conturilor de utilizator MySQL si discută despre întreținerea fișierelor jurnal, despre strategiile de creare a copiilor de siguranță, despre ajustarea serverelor si despre strategiile de realizare a copiilor de siguranță, respectiv de refacere a bazelor de date.

• Securitate. Ceea ce trebuie să știți pentru a proteja instalarea sistemului dumneavoastră MySQL împotriva intrușilor, atât contra altor utilizatori ai gazdei serverului, cât și a clienților care se conectează prin rețea.

• întreținerea și repararea bazelor de date. Modul de a reduce posibilitatea de apariție a dezastrelor printr-o întreținere preventivă, precum și metodele de a efectua refacerea în urma căderilor, dacă dezastrele survin în ciuda măsurilor dumneavoastră de pre-

venire.

3.2 Lucrul cu date în MySQL și SQL

Practic, tot ceea ce faceți în MySQL implică, într-un fel sau altul, date, deoarece rostul unui sistem de gestiune a bazelor de date este, prin definiție, acela de gestiune a datelor. Chiar si o simplă instrucțiune SELECT 1 implică o evaluare a unei expresii, cu scopul de a produce o valoare a unei date întregi.

Fiecare valoare a unei date din MySQL are un tip. De exemplu, 37.4 este un număr, iar "abc" este un șir. Uneori, tipurile de date sunt explicite, ca atunci când emiteți o instrucțiune CREATE TABLE care specifică tipul fiecărei coloane pe care o declarați ca parte a tabelului:

CREATE TABLE tabelul meu

int_col INT, /"

sir_col CHAR(20), /' data col DATE /"

coloana cu valori întregi */ coloana cu valori șir */ coloana cu valori date */

în alte situații, tipurile de date sunt implicite, cum este atunci când faceți referire la valori literale dintr-o expresie, când transferați valori unei funcții sau când folosiți valoarea retur-nată din acea funcție:

INSERT INTO tabeluljneu (int_col,sir_col,data_col)

VALUES(14,CONCAT("a","b"),19990115)

Această instrucțiune INSERT efectuează următoarele operații, din care toate implică tipuri de date:

• Atribuie valoarea 14 coloanei întregi1 int_col.

• Transferă valorile șir "a" si "b" funcției CONCAT(). Această funcție returnează valoarea șir "ab", care este repartizată în coloana șir sir_col.

• Atribuie valoarea întreagă 19990115 coloanei de tip dată data_col. Atribuirea implică o neconcordanță între tipuri, deci MySQL convertește șirul 19990115 în data "1999-01-15"; acest fapt arată că MySQL execută conversia automată a tipului.

Pentru a folosi MySQL în mod eficient, este esențial să înțelegeți modul de manipulare a datelor în MySQL. Acest capitol descrie tipurile de date pe care le poate manipula MySQL și discută problemele implicate de lucrul cu aceste tipuri:

1 Prin coloană întreagă se va înțelege coloană care conține valori numere întregi. S-a preferat în traducere prima formă, din motive de concizie. La fel de va proceda cu expresii gen coloană șir și altele. – N.T.

• Categoriile generale de valori pe care le poate reprezenta MySQL, inclusiv valoarea NULL.

• Tipurile concrete de date pe care le furnizează MySQL pentru coloanele tabelelor, precum și proprietățile care caracterizează fiecare tip de coloană. Unele dintre tipurile de coloane MySQL au un caracter destul de general, cum este tipul sir CHAR. Alte tipuri, cum este TIMESTAMP, au comportări speciale, pe care trebuie să le înțelegeți pentru a evita surprizele.

• Alegerea adecvată a tipului de coloană pentru tabelele dumneavoastră. Este important să știți modul de a alege tipul cel mai adecvat intereselor dumneavoastră când construiți un tabel, precum și să alegeți între un tip și altul atunci când se pot aplica mai multe tipuri pentru categoria de valori pe care doriți să o stocați.

• Regulile MySQL pentru evaluarea expresiilor. MySQL oferă o gamă largă de operatori și funcții pe care le puteți folosi pentru a regăsi, afișa și manipula date. Regulile pentru evaluarea expresiilor includ regulile care controlează conversiile de tip, atunci când o valoare de un tip este folosită într-un context care impune o valoare de un alt tip.

Este important să înțelegeți când se produce și cum funcționează conversia de tip; unele conversii nu au nici un sens si generează valori fără nici o semnificație. Prin repartizarea șirului "13" într-o coloană întreagă se obține valoarea 13, dar repartizarea șirului "abc" în coloana respectivă are ca rezultat valoarea O, deoarece "abc" nu arată ca un număr. Mai rău, dacă efectuați o comparație fără a cunoaște regulile de conversie puteți provoca pagube serioase, cum ar fi actualizarea sau ștergerea tuturor rândurilor dintr-un tabel atunci când intenționați să modificați numai câteva rânduri.

Două anexe conțin informații suplimentare despre tipurile de coloane, operatorii și funcțiile MySQL. Acestea sunt Anexa B, „Referință de tipuri de coloane", respectiv Anexa C, „Referință de operatori și funcții".

3.2.1 Tipuri de date MySQL

MySQL „cunoaște" numeroase tipuri de date, în speță categorii generale în care pot fi reprezentate diverse valori.

Valori numerice

Numerele sunt valori precum 48 sau 193.62. MySQL înțelege numere specificate ca întregi (fără parte fracționară) sau valori cu virgulă mobilă (cu parte fracționară). întregii pot fi specificați în format zecimal sau hexazecimal.

Un întreg constă dintr-o secvență de cifre. Un întreg specificat în formă hexazecimală constă din secvența Ox urmată de una sau mai multe cifre hexazecimale (cuprinse între 0-9, respectiv a-f). De exemplu, OxOa este 10 în format zecimal, iar Oxf f f f este 65535 în format zecimal. Cifrele hexazecimale non-numerice pot fi specificate cu majuscule sau minuscule, dar secvența de început Ox nu poate fi scrisă sub forma OX. Cu alte cuvinte, OxOa si OxOA sunt corecte, dar OXOa și OXOA nu sunt.

Un număr cu virgulă mobilă constă dintr-o secvență de cifre, o virgulă de separare a părții fracționare și o altă secvență de cifre. Una dintre cele două secvențe de cifre poate fi vidă, dar nu ambele simultan.

Capitolul 2 Lucrul cu date în MySQL și SQL 101

MySQL înțelege notația științifică. Aceasta este indicată prin inserția imediat după un număr întreg sau în virgulă mobilă a literei e sau E, unui caracter semn (+ sau -) și unui exponent întreg. 1.34E+12 și 43.27e-1 reprezintă numere scrise în notație științifică corectă. Pe de altă parte, 1.34E12 nu este scris corect, deoarece lipsește caracterul semn înaintea exponentului. Numerele hexazecimale nu pot fi folosite în notațiile științifice; caracterul e care se află la începutul exponentului este, de asemenea, o cifră hexazecimală corectă și astfel se pot crea confuzii.

Numerele pot fi precedate de un semn minus (-) pentru a semnala o valoare negativă.

Valori șir (caracter)

Șirurile sunt valori ca "București, România" sau "pacientul se simte mai bine". Pentru a delimita o valoare șir se pot folosi ghilimele simple sau duble.

în interiorul șirurilor se pot folosi numeroase secvențe escape, care se pot folosi pentru a preciza caractere speciale, așa cum se poate vedea în tabelul 2.1. Fiecare secvență începe cu un caracter backslash (\) pentru a semnifica o excepție temporară de la regulile obișnuite de interpretare a caracterelor. Rețineți că un octet NUL nu este unul și același lucru cu o valoare NULL; NUL este un octet de valoare zero, în timp ce NULL semnifică absența unei valori.

Tabelul 2.1 Secvențe escape din șiruri

Pentru a include ghilimele într-un șir, puteți proceda astfel:

• Dublați ghilimelele, dacă șirul este inclus între ghilimele folosind același caracter:

'Anii "701

"El zise: ""Ti-am spus eul"""

• încadrați șirul folosind celelalte ghilimele; în acest caz, nu dublați ghilimelele din șir:

"Anii '70"

'El zise: "Ti-am spus eul"'

• Anulați semnificația ghilimelelor cu un caracter backslash; această metodă este aplicabilă indiferent de tipul ghilimelelor folosite pentru a încadra șirul;

'Anii \'70' 'Anii \'70"

"El zise: \"Ti-am spus eul\""

'El zise: \"Ti-am spus eu!\"'

în contextele șirurilor, se pot folosi constantele hexazecimale pentru a specifica valorile de tip șir. Sintaxa este cea descrisă anterior pentru valorile numerice, dar perechile de cifre hexazecimale sunt interpretate drept coduri ASCII si sunt convenite în caractere. Rezultatul este folosit sub formă de șir. De exemplu, când este interpretat sub formă de șir, 0x616263 este "abc".

Valori de tip dată si oră (temporale)

Datele si orele sunt valori precum " 1999 – 06 -17" sau " 12:30:43". De asemenea, MySQL înțelege valorile dată/oră combinate, precum "1999-06-17 12:30:43". Rețineți faptul că MySQL reprezintă datele în ordinea an-lună-zi. Acest lucru îi surprinde deseori pe începătorii în materie de MySQL, deși acest format este standardul SQL ANSI. Puteți afișa valorile datelor în orice mod doriți folosind funcția DATE_FORMAT(), dar formatul de afișare prestabilit afișează mai întâi anul, iar valorile de intrare trebuie specificate începând cu anul.

Valoarea NULL

NULL este un fel de valoare „fără tip", în general, este folosită cu semnificația „fără valoare", „valoare necunoscută", „valoare lipsă", „în afara domeniului", „nici una din precedentele opțiuni" și așa mai departe. Puteți insera valori NULL în tabele, le puteți regăsi din tabele și puteți testa dacă o valoare este sau nu NULL. Nu puteți efectua operații aritmetice cu valori NULL. (Dacă încercați, rezultatul este NULL.)

Tipuri de coloane MySQL

Fiecare tabel dintr-o bază de date este alcătuit dintr-una sau mai multe coloane. Când creați un tabel folosind o instrucțiune CREATE TABLE, specificați un tip pentru fiecare coloană. Un tip de coloană este mai specific decât un tip de date, care este numai o categorie generală de genul „număr" sau „șir". Un tip de coloană caracterizează cu exactitate categoria de valori pe care o poate conține o coloană a unui tabel dat, cum este SMALLINT sau VARCHAR(32).

Tipurile de coloane MySQL reprezintă mijloacele prin care descrieți categoriile de valori pe care le conțin coloanele unui tabel, care, la rândul lor, determină modul în care MySQL tratează aceste valori. De exemplu, dacă aveți valori numerice, le puteți stoca folosind un tip de coloană numeric sau șir, dar MySQL va trata valorile oarecum diferit, în funcție de modul în care le stocați. Fiecare tip de coloană are numeroase caracteristici:

• Ce tip de valori puteți stoca în coloana respectivă

• Spațiul pe care îl ocupă valorile, precum și dacă valorile sunt de lungime fixă (toate valorile de acel tip ocupă aceeași cantitate de spațiu) sau de lungime variabilă (cantitatea de spațiu depinde de valoarea particulară stocată)

• Modul de comparare si stocare a valorilor din tipul respectiv

• Dacă tipul respectiv acceptă sau nu valori NULL

• Dacă tipul respectiv poate fi indexat sau nu

Tipuri de coloane numerice

Tipurile de coloane numerice din MySQL se încadrează în două categorii generale:

• Tipuri întregi. Pentru numerele fără parte fracționară, precum 1, 43, -3,0 sau -796432. Puteți folosi coloanele întregi pentru date reprezentate de numere întregi, precum greutatea aproximată la cea mai apropiată cantitate în kilograme, înălțimea aproximată la valoarea în centimetri cea mai apropiată, numărul de stele dintr-o galaxie, numărul de persoane dintr-o gospodărie sau numărul de bacterii dintr-un vas de cultură.

• Tipuri cu virgulă mobilă. Pentru numere care pot avea o parte fracționară, precum 3.14159, -. 00273, -4.78 sau 39. 3E+4. Puteți folosi tipuri de coloane cu virgulă mobilă pentru valori care pot avea o parte fracționară sau care sunt extrem de mari sau de mici. Printre tipurile de date care pot fi reprezentate sub formă de valori cu virgulă mobilă sunt: producția agricolă medie, distanțele, valorile monetare (prețul unui articol sau un salariu), rata șomajului sau prețurile acțiunilor la bursă. Acestea sunt tratate sub formă de valori cu virgulă mobilă cu o parte fracționară zero.

Instrucțiunea CREATE TABLE

Exemplele folosite în acest capitol utilizează in extenso instrucțiunea CREATE TABLE. Instrucțiunea ar trebui să vă fie destul de cunoscută, deoarece am folosit-o în secțiunea de manual a capitolului 1, „Introducere în MySQL și SQL". De asemenea, vezi informațiile despre instrucțiunea CREATE TABLE din Anexa D, „Referință de sintaxă SQL".

Domenii de existență ale tipurilor de coloane numerice Specificație de tip

TINYINT[(W)]

SMALLINT[(M)] MEDIUMINT[(M)] INT[(M)] BIGINT[(M)]

FLOAT[(W,0)], FLOAT(4) DOUBLE[(M,D)], FLOAT(8) DECIMAL(M,D)

Domeniu

Valori cu semn: între -128 și 127 (între -27 și 27-1) Valori fără semn între O și 255 (între O și 28-1)

Valori cu semn: între-32768 și 32767 (între-215 și 215-1) Valori fără semn: între O și 65535 (între O și 216-1)

Valori cu semn: între -8388608 și 8388607 (între -223 și 223-1) Valori fără semn: între O și 16777215 (între O și 224-1)

Valori cu semn: între – 2147483648 și 2147483647 (între -231 și 231-1> Valori fără semn: între O și 4294967295 (între O și 232-1)

Valori cu semn: între -9223372036854775808 și

9223372036854775807 (între-263 și 2^-1),

Valori fără semn: între O și 18446744073709551615 (între O și ă64-!)

Valori minime diferite de zero: ±1.175494351E-38 Valori maxime diferite de zero: ±3.402823466E+38

Valori minime diferite de zero: ±2.2250738585072014E-308 Valori maxime diferite de zero: ±1.7976931348623157E+308

Variază; domeniul depinde de u și D.

Capitolul 2 Lucrul cu date în MySQL și SQL 107 Tabelul 2.6 Necesități de spațiu de stocare pentru tipurile de coloane numerice

Specificație de tip

TINYINT[(M)]

SMALLINT[(M)]

MEDIUMINT[(M)]

INT[(M)]

BIGINT[(M)]

FLOAT[(M,0)], FLOAT(4)

DOUBLE[(M,D)], FLOAT(8)

DECIMAL(«,D)

Spațiu necesar

1 octet

2 octeți

3 octeți

4 octeți 8 octeți 4 octeți 8 octeți

M octeți (versiune MySQL anterioară versiunii 3.23), M+2 octeți (versiune MySQL ulterioară versiunii 3.23 sau chiar versiunea 3.23)

MySQL furnizează cinci tipuri întregi: TINYINT, SMALLINT, MEDIUMINT, INT și BIGINȚ. INTEGER este un sinonim pentru INT. Aceste tipuri variază din punctul de vedere al domeniului de valori pe care îl pot reprezenta. Coloanele întregi pot fi declarate ca UNSIGNED pentru a interzice valorile negative; astfel, domeniul pentru coloană este deplasat în sus pe axa numerelor, începând astfel de la 0. De asemenea, tipurile variază din punct de vedere al cantității de spațiu necesare. Tipurile cu un domeniu mai extins necesită un spațiu de stocare mai mare.

MySQL furnizează trei tipuri cu virgulă mobilă: FLOAT, DOUBLE și DECIMAL. Spre deosebire de tipurile întregi, tipurile cu virgulă mobilă nu pot fi UNSIGNED, iar domeniul lor este diferit de acela al tipurilor întregi, prin aceea că tipul respectiv nu poate reprezenta numai o valoare maximă, ci și o valoare minimă diferită de zero. Valorile minime furnizează o măsură a preciziei tipului, ceea ce este deseori important pentru înregistrarea datelor științifice. (Există, desigur, valori maxime și minime negative corespunzătoare.)

DOUBLE PRECISION! (M,O)] și REAL[(M,D)] sunt sinonime pentru DOUBLE[ (M,D) ]. NUMERIC(«,D)este sinonim cu DECIMAL(M,D). FLOAT(4) și FLOAT(8) sunt furnizate pentru compatibilitatea cu ODBC. înainte de MySQL 3.23, acestea erau sinonime cu FLOAT(10,2), respectiv DOUBLE (16,4). începând de la MySQL 3.23, FLOAT (4) și FLOAT (8) își au propriul comportament, descris pe scurt în continuare.

Când alegeți un tip numeric, vă gândiți la domeniul de valori pe care trebuie să-1 reprezentați și alegeți cel mai mic tip care va acoperi domeniul. Prin alegerea unui tip mai mare se pierde spațiu, rezultând astfel tabele inutil de mari, care nu pot fi prelucrate la fel de eficient ca si atunci când ați fi ales un tip mai mic. Pentru valori întregi, TINYINT este optim dacă domeniul de valori al datelor dumneavoastră este redus, cum ar fi vârsta unei persoane sau numărul de frați sau surori. MEDIUMINT poate reprezenta milioane de valori si poate fi folosit pentru mult mai multe tipuri de valori, cu prețul unui spațiu de stocare ceva mai mare. BIGINȚ are cel mai mare domeniu dintre toate tipurile, dar necesită un spațiu de stocare dublu față de cel mai mic tip întreg următor (lNT) și trebuie să fie folosit numai atunci când este într-adevăr nevoie. Pentru valori cu virgulă mobilă, DOUBLE ocupă de două ori mai mult spațiu decât FLOAT. Cu excepția situațiilor când aveți nevoie de o precizie excepțională sau de un domeniu de valori extrem de mare, probabil că vă puteți reprezenta datele la numai jumătate din spațiul de stocare, folosind FLOAT.

Când declarați o coloană de tip întreg, puteți specifica o dimensiune opțională de afișare M. Dacă este dat, M trebuie să fie un întreg cuprins între 1 și 255 și reprezintă numărul de caractere folosit pentru a afișa valorile din coloană. De exemplu, MEDIUMINT(4) specifică o coloană MEDIUMINT cu o lățime de afișare egală cu 4. Dacă declarați o coloană de tip întreg fără o lățime explicită, este atribuită o lățime prestabilită. Valorile prestabilite constituie lungimile valorilor „celor mai lungi" pentru fiecare tip. Dacă reprezentarea care se poate afișa a unei anumite valori necesită mai mult de M caractere, atunci se va afișa valoarea totală; valorile nu vor fi „amputate" pentru a se încadra în limita celor M caractere.

Pentru fiecare tip de coloană cu virgulă mobilă, puteți specifica o dimensiune maximă de afișare M și numărul de cifre după virgulă D. Valoarea lui M trebuie să fie cuprinsă între l si 255. Valoarea lui D poate fi cuprinsă între O și 30, dar nu trebuie să depășească M-2. (Dacă sunteți un cunoscător al terminologiei ODBC, M și D corespund conceptelor ODBC de „precizie" și „scară".) M și D sunt opționale pentru FLOAT și DOUBLE, dar sunt obligatorii pentru DECIMAL.

Acolo unde M și D sunt opționale, în caz de omisiune sunt folosite valori prestabilite. Următoarea instrucțiune creează un tabel pentru a ilustra valorile prestabilite ale opțiunilor M și D pentru tipurile de coloane numerice (DECIMAL nu este inclus, deoarece M și D nu sunt opționale pentru tipul respectiv): CREATE TABLE tabeluljneu

itiny TINYINT, itiny_u TINYINT UNSIGNED, ismall SMALLINT, ismall_u SMALLINT UNSIGNED, imedium MEDIUMINT, imedium_u MEDIUMINT UNSIGNED, ireg INT, ireg_u INT UNSIGNED, ibig BIGINT, ibig_u BIGINT UNSIGNED, fp_single FLOAT, fp_double DOUBLE

Dacă emiteți o instrucțiune DESCRIBE tabelul_meu după crearea tabelului, coloanele • Field si Type ale datelor de ieșire se vor prezenta astfel:

Lățimea de afișare pentru BIGINT va fi 21 (nu 20) dacă rulați această interogare folosind o versiuni j MySQL anterioară versiunii 3.23, datorită unei erori minore. – N.A.

Fiecare coloană numerică are un domeniu de valori determinat de tipul coloanei. Dacă încercați să inserați o valoare care se află în afara domeniului coloanei, se produce o trunchiere: MySQL „taie" valoarea corespunzător punctului final adecvat al domeniului și folosește rezultatul. La regăsirea valorilor nu se produce nici o trunchiere.

Trunchierea valorilor se produce în conformitate cu domeniul tipului coloanei, nu cu lățimea de afișare. De exemplu, o coloană SMALLINT(3) are o lățime de afișare egală cu 3 și un domeniu cuprins între -32768 si 32767. Valoarea 12345 este mai „lată" decât lățimea de afișare, dar se află în interiorul domeniului coloanei, deci este inserată fără „tăiere" si regăsită sub forma 12345. Valoarea 99999 se află în afara domeniului, deci este redusă la 32767 când este inserată. La regăsirile ulterioare, valoarea apare sub forma 32767.

în general, valorile atribuite unei coloane cu virgulă mobilă sunt rotunjite la numărul de zecimale indicat la specificarea coloanei. Dacă stocați valoarea 1.234563 într-o coloană FLOAT (8,1), rezultatul este 1.2. Dacă stocați aceeași valoare într-o coloană FLOAT (8,4), rezultatul este 1.2346. Aceasta înseamnă că trebuie să declarați coloanele cu virgulă mobilă cu un număr de zecimale suficient de mare pentru a vă oferi valori la precizia dorită. Dacă aveți nevoie de o precizie de ordinul miimilor, nu declarați un tip cu numai două cifre după virgulă.

Excepția de la acest mod de manipulare a valorilor cu virgulă mobilă constă în aceea că, în MySQL 3.23, comportarea tipurilor FLOAT(4) si FLOAT(8) s-a modificat. Aceste două tipuri sunt acum de tip precizie simplă (4 octeți), respectiv dublă (8 octeți), care sunt tipuri cu virgulă mobilă autentice, în sensul că valorile sunt stocate așa cum sunt date, în cadrul limitelor impuse de componentele dumneavoastră hardware.

Tipul DECIMAL este diferit de FLOAT și DOUBLE, în sensul că valorile DECIMAL sunt, de fapt, stocate sub formă de șiruri. Domeniul maxim posibil pentru DECIMAL este același ca pentru DOUBLE, dar domeniul efectiv este determinat de valorile parametrilor M și D. Dacă M variază și D rămâne fix, domeniul crește dacă M crește. Dacă M rămâne fix și D variază, domeniul devine mai mic dacă D creste, deși precizia creste.

Influența valorilor parametrilor M si D asupra domeniului tipului DECIMAL (M,D)

Specificație de tip

DECIMAL(4,1) DECIMAL(5,1) DECIMAL(6,1) DECIMAL(6,2) DECIMAL(6,3)

Domeniu (pentru MySQL < 3.23)

între -9,9 și 99,9 între -99,9 și 999,9 între -999,9 și 9999,9 între -99,99 și 999,99 între -9,999 și 99,999

Domeniu (pentru MySQL 3.23)

între -999,9 și 9999,9 între -9999,9 și 99999,9 între -99999,9 și 999999,9 între -9999,99 și 99999,99 între -999,999 și 9999,999

Domeniul unui tip DECIMAL dat depinde de versiunea dumneavoastră de MySQL. Pentru versiunile MySQL anterioare versiunii 3.23, coloanele de tip DECIMAL (M, D) sunt stocate folosind M octeți per valoare, iar caracterul semn (dacă este necesar) și virgula sunt incluse în cei M octeți. Astfel, pentru un tip DECIMAL(5,2), domeniul este cuprins între -9,99 si 99,99, deoarece în acest interval se încadrează toate valorile de 5 caractere posibile.

f 4. T^P-K '

I- , JB^H ,

•-iSP

' în limba engleză, virgula zecimală se reprezintă ca punct zecimal. MySQL folosește acest sistem. – N.T.

Începând de la MySQL 3.23, valorile DECIMAL sunt manipulate în conformitate cu specificația ANSI, care precizează că un tip DECI MAL (M, D) trebuie să poată reprezenta toate valorile cu M cifre și D cifre după virgulă. De exemplu, DECIMAL(5,2) trebuie să poată reprezenta valori cuprinse între -999,99 și 999,99. Caracterul semn si virgula trebuie si ele stocate, deci valorile DECIMAL începând de la versiunea MySQL 3.23 folosesc M+2 octeți. Pentru DECIMAL(5,2) sunt necesari 7 octeți pentru „cea mai lungă" valoare (-999,99). La extremitatea pozitivă a domeniului, octetul de semn nu este necesar pentru memorarea unui caracter semn, deci MySQL îl folosește pentru a extinde domeniul dincolo de cel cerut prin specificația ANSI. Pentru DECIMAL(5,2), valoarea maximă poate fi 9999,99, deoarece sunt disponibili 7 octeți.

Pe scurt, domeniul tipului DECIMAL(M,D) pentru versiunile de la MySQL 3.23 „în sus" este echivalent cu domeniul tipului DECIMAL(M+2,D) din versiunile anterioare.

În toate versiunile de MySQL, dacă D este egal cu O pentru o coloană DECIMAL, virgula nu este stocată. Efectul este o extindere a domeniului coloanei cu un ordin de mărime suplimentar, deoarece octetul folosit în mod normal pentru stocarea virgulei se poate utiliza pentru o altă cifră.

Atributele tipului de coloană numerică

Atributul ZEROFILL poate fi specificat pentru toate tipurile numerice. Acesta determină completarea cu zerouri inițiale a valorilor afișate pentru coloană, pentru a se obține lățimea de afișare. Puteți folosi ZEROFILL când doriți să vă asigurați că valorile din coloane sunt întotdeauna afișate folosind un număr de cifre dat. De fapt, este mai bine să spunem „un număr minim dat de cifre", deoarece valorile cu un număr de cifre mai mare decât lățimea de afișare sunt afișate complet, fără a fi „tăiate". Puteți vedea acest lucru emițând următoarele instrucțiuni:

CREATE TABLE tabeluljneu (completare_zerouri INT(5) ZEROFILL) INSERT INTO tabeluljneu VALUES(1),(100),(10000),(1000000) SELECT completare_zerouri FROM tabeluljneu

Datele de ieșire ale instrucțiunii SELECT sunt prezentate în continuare. Observați că valoarea finală, care are un număr de cifre mai mare decât lățimea de afișare a coloanei, este afișată complet:

completare_zerouri

00001

00100

10000

1000000

Alte două atribute pot fi specificate numai pentru tipurile de coloane întregi:

• AUTO_INCREMENT. Folosiți atributul AUTO_INCREMENT când doriți să generați identifi-,; catori unici sau valori în serie, în mod normal, valorile AUTO_INCREMENT încep de la V și cresc cu o unitate pentru fiecare rând. Când inserați NULL într-o coloana;j AUTO_INCREMENT, MySQL inserează o valoare cu o unitate mai mare decât valoare|| maximă curentă din acea coloană, într-un tabel puteți avea maximum o coloanăj AUTO INCREMENT.

Pentru orice coloană unde doriți să folosiți AUTO_INCREMENT, coloana trebuie să fie declarată NOT NULL și, de asemenea, ca PRIMARY KEY sau drept cheie UNIQUE. De exemplu, puteți declara o asemenea coloană în oricare din următoarele moduri: CREATE TABLE ai (i INT AUTO_INCREMENT NOT NULL PRIMARY KEY) CREATE TABLE ai (i INT AUTO_INCREMENT NOT NULL, PRIMARY KEY (i)) CREATE TABLE ai (i INT AUTO_INCREMENT NOT NULL, UNIQUE(i)) Comportarea atributului AUTO_INCREMENT este discutată mai aprofundat în paragraful „Lucrul cu secvențe".

• UNSIGNED. Acest atribut interzice valorile negative. Dacă o coloană primește atributul UNSIGNED, dimensiunea domeniului tipului de date de bază nu se modifică, ci pur și simplu este deplasată înainte (spre dreapta) pe axa numerelor. Gândiți-vă la această specificație de tabel: .

CREATE TABLE tabeluljneu

(

itiny TINYINT,

itiny_u TINYINT UNSIGNED

)

itiny si itinyjj sunt ambele coloane de tip TINYINT, cu un domeniu de 256 de valori, dar domeniul lui itiny este cuprins între -128 si 127, în timp ce domeniul lui itiny_u este cuprins între O și 255.

UNSIGNED este util pentru coloane în care intenționați să stocați date care nu iau valori negative, cum sunt valorile populațiilor sau cifrele privind prezența la un curs. Dacă folosiți o coloană obișnuită, cu semn, pentru asemenea valori, folosiți numai jumătate din domeniul tipului de coloană. Când coloana primește atributul UNSIGNED, efectiv își dublează domeniul. Dacă folosiți coloana pentru numere în secvență, veți avea nevoie de un număr dublu de valori pentru a epuiza domeniul dacă declarați coloana cu atributul UNSIGNED.

După atributele pe care tocmai le-am descris, care sunt caracteristice coloanelor numerice, mai puteți specifica si atributele generale NULL și NOT NULL. Dacă nu specificați NULL sau NOT NULL, valoarea prestabilită este NULL. De asemenea, puteți specifica o valoare prestabilită folosind atributul DEFAULT. Dacă nu specificați o valoare prestabilită, aceasta va fi aleasă automat. Pentru toate tipurile de coloane numerice, valoarea prestabilită este NULL pentru coloanele care pot conține NULL, respectiv O pentru celelalte.

Exemplul următor creează un tabel cu trei coloane I NT, cu valorile prestabilite -l, l și NULL:

CREATE TABLE t

( •

11 INT DEFAULT -1,

12 INT DEFAULT 1,

13 INT DEFAULT NULL

' + "

«t1». .

••V&&,.

Lucrul cu secvențe

Multe aplicații trebuie să folosească numere unice pentru motive legate de identificare. Necesitatea unicității valorilor survine într-un număr de contexte: numere de membri, numerotarea mostrelor sau a loturilor, identificatori de clienți, etichete ale rapoartelor privind hibele sau ale tichetelor de semnalare a problemelor și altele.

Mecanismul sistemului MySQL pentru furnizarea de numere unice folosește coloanele AUTO_INCREMENT. Acestea vă permit să generați automat numere în secvență. Din păcate, AUTO_INCREMENT este o facilitate uneori prost înțeleasă, fenomen determinat poate de modificările aduse acestei caracteristici în MySQL 3.23. Această secțiune descrie modul de comportare a coloanelor AUTO_INCREMENT astfel încât dumneavoastră să le puteți folosi în mod eficient, fără a cădea în capcanele care deseori iau oamenii prin surprindere. De asemenea, secțiunea vă prezintă modul de generare a secvențelor fără utilizarea unei coloane AUTO_INCREMENT.

AUTO_INCREMENT pentru versiunile MySQL anterioare versiunii 323

Pentru versiunile sistemului MySQL anterioare versiunii 3.23, coloanele AUTO_INCRE-MENT se comportă după cum urmează:

• Inserția unei valori NULL într-o coloană AUTO_INCREMENT determină MySQL să genereze automat următorul număr din secvență și să insereze în schimb acea valoare în coloană. Secvențele AUTO_INCREMENT încep cu l, deci prima înregistrare inserată în tabel primește în coloană o valoare secvențială egală cu l, iar înregistrările ulterioare primesc valori egale cu 2, 3 etc. în general, fiecare valoare generată automat va fi cu o unitate mai mare decât valoarea maximă curentă stocată în coloană.

• Inserția unui O într-o coloană AUTO_INCREMENT este similară cu inserția valorii NULL în coloană. Inserția unui rând fără specificarea unei valori pentru coloana AUTO_INCREMENT este de asemenea similară cu inserția unei valori NULL.

• Dacă inserați o înregistrare si specificați în mod explicit o valoare pentru coloana AUTO_INCREMENT, se va întâmpla unul din următoarele două lucruri. Dacă există deja o înregistrare cu valoarea respectivă, se va produce o eroare, deoarece valorile din coloanele AUTO_INCREMENT trebuie să fie unice. Dacă nu există o înregistrare cu acea valoare, înregistrarea este inserată și, dacă valoarea din coloană este noua valoare maximă, secvența continuă cu valoarea următoare aceleia pentru rândurile ulterioare. Cu alte cuvinte, puteți „forța" contorul prin inserția unei înregistrări cu o valoare din secvență mai mare decât valoarea curentă a contorului.

Forțarea contorului poate determina goluri în secvență, dar puteți exploata această comportare în avantajul dumneavoastră. Să presupunem că ați creat un tabel cu o coloană AUTO_INCREMENT, dar doriți ca o secvență să înceapă cu 1000, nu cu 1. Puteți realiza acest lucru în două moduri. Mai întâi, puteți insera prima înregistrare cu o valoare de secvență explicită egală cu 1000, după care inserați înregistrările ulterioare prin intro- | ducerea valorii NULL în coloana AUTO_INCREMENT. în al doilea rând, puteți insera o falsă '<| înregistrare în coloana AUTO_INCREMENT, cu valoarea 999. Prima înregistrare reală pe {î care o inserați după aceea va primi un număr de secvență egal cu 1000, după care puteți șterge înregistrarea falsă.

•sy«

Capitolul 2 Lucrul cu date în MySQL și SQL 113

• Dacă inserați o valoare incorectă într-o coloană AUTO_INCREMENT, nu vă așteptați să se întâmple ceva util. Rezultatul nu poate fi anticipat.

• Dacă ștergeți înregistrarea care conține cea mai mare valoare dintr-o coloană AUTO_INCRE-MENT, valoarea respectivă va fi reutilizată la următoarea generare a unei valori noi. Dacă ștergeți toate înregistrările din tabel, vor fi refolosite toate valorile și secvența este reluată, pornind de la 1.

• Instrucțiunile REPLACE funcționează normal.

• Instrucțiunile UPDATE funcționează folosind reguli similare celor care se aplică inserției de noi înregistrări. Dacă actualizați o coloană AUTO_INCREMENT cu valoarea NULL sau O, aceasta este actualizată la următorul număr de secvență. Dacă încercați să actualizați coloana la o valoare care există deja, se va produce o eroare (cu excepția situațiilor când se întâmplă să configurați coloana la o valoare pe care o are deja). Dacă actuali-'zați coloana la o valoare mai mare decât orice valoare existentă în coloană, secvența va continua cu numărul următor celui pentru înregistrările ulterioare.

• Valoarea celui mai recent număr de secvență generat automat este disponibilă prin apelarea funcției LAST_INSERT_ID(). Aceasta vă permite să faceți referire la valoarea AUTO_INCREMENT în alte instrucțiuni, fără a cunoaște care este de fapt valoarea. LAST_INSERT_ID() este legată de valorile AUTO_INCREMENT generate în timpul sesiunii curente a serverului; nu este afectată de activitatea AUTO_INCREMENT asociată cu alți clienți. Dacă nici o valoare AUTO_INCREMENT nu fost generată în timpul sesiunii curente, funcția LAST_INSERT_ID() returnează 0.

Posibilitatea de a genera automat numerele dintr-o secvență este extrem de utilă. Totuși, comportarea descrisă anterior are două dezavantaje. Primul: reutilizarea valorilor dintr-o secvență atunci când sunt șterse înregistrările din partea superioară a secvenței îngreunează generarea unui set de valori monotone (strict crescătoare) pentru aplicații care pot șterge, dar care^ pot și insera înregistrări, în al doilea rând, mijloacele prin care începeți o secvență la o valoare mai mare decât l sunt greoaie.

AUTO_INCREMENT pentru versiunile MySQL începând de la 333

MySQL 3.23 a introdus următoarele schimbări în comportarea atributului AUTO_INCRE-MENT în ceea ce privește aspectele reținute anterior:

• Valorile dintr-o serie generată automat sunt strict crescătoare si nu sunt refolosite. Dacă valoarea maximă este 143 și dumneavoastră ștergeți înregistrarea care conține valoarea respectivă, MySQL va genera valoarea următoare egală cu 144.

• Puteți specifica numărul de secvență inițial în mod explicit atunci când creați tabelul. Exemplul următor creează un tabel cu o coloană AUTO_INCHEMENT denumită sec, care începe de la valoarea 1.000.000:

CREATE TABLE tabeluljneu

(sec INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY)

AUTO_INCREMENT = 1000000

Când un tabel are mai multe coloane (ca majoritatea tabelelor), nu există nici un dubiu cu privire la coloana căreia i se aplică clauza finală AUTO_INCREMENT = 1000000, deoarece într-un tabel există o singură coloană AUTO_INCREMENT.

•'Î>V/Y

' J **%*£*>%'

;*î»i-lf • ••

iî^s»

Tipuri de coloana șir

MySQL furnizează numeroase tipuri de șiruri pentru stocarea datelor de tip caracter. Șirurile sunt frecvent folosite pentru valori ca acestea:

"lonescu, Popescu & Co."

"Creioane (mina nr. 2)"

"Str. Lunga, nr. 123*

"Seria Monograph IX"

De fapt, șirurile sunt într-un fel tipuri generice, deoarece le puteți folosi pentru a reprezenta orice valoare. De exemplu, puteți folosi tipurile șir pentru a stoca date binare, cum sunt imaginile sau sunetele, respectiv date de ieșire din programul g zip, dacă doriți să stocați date comprimate.

Pentru toate tipurile șir, valorile prea lungi sunt „tăiate" pentru a corespunde lungimii stabilite. Dar tipurile șir variază de la foarte mici la foarte mari, iar tipul cel mai mare poate conține aproape 4GB de date, deci trebuie să puteți găsi ceva suficient de lung pentru a evita trunchierea informațiilor dumneavoastră.

Acest tabel prezintă tipurile furnizate de MySQL pentru declararea coloanelor cu valori de tip șir, precum și dimensiunea maximă și spațiul de stocare necesar pentru fiecare tip. Pentru tipuri de coloane cu lungime variabilă, cantitatea de spațiu ocupată de o valoare variază de la un rând la altul și depinde de lungimea valorilor efectiv stocate în coloană. Această lungime este reprezentată în tabel prin litera L.

Octeții suplimentari necesari în afara lui L reprezintă numărul de octeți necesari pentru a stoca lungimea valorii. MySQL manipulează valorile de lungime variabilă prin stocarea atât a conținutului valorii, cât și a lungimii sale. Acești octeți suplimentari sunt tratați ca un întreg fără semn. Observați corespondența între lungimea maximă a unui tip de lungime variabilă, numărul de octeți suplimentari necesari pentru tipul respectiv și domeniul tipului întreg fără semn care folosește același număr de octeți. De exemplu, valorile MEDIUMBLOB pot avea maximum 224-l octeți lungime si necesită 3 octeți pentru înregistrarea rezultatului. Tipul întreg pe 3 octeți MEDIUMINT are o valoare fără semn maximă de 224-l. Aceasta nu este o coincidență.

'*t\s ^

". '""'}• %'' r ,, v?1gfc.

Datorită limitărilor impuse de dimensiunea maximă a pachetului în protocolul de comunicație client/server, limita eficace a valorilor din coloană este de 24MB. – N.A.

Tipuri de coloane șir.

Specificația tipului:

CHAR(M) VARCHAR (W) TINYBLOB, TINYTEXT BLOB, TEXT

MEDIUMBLOB, MEDIUMTEXT LONGBLOB, LONGTEXT ENUM ("val1Vval2",…) SET ("vair,"val2",…)

Dimensiune maximă

M octeți u octeți 28-1 octeți 216-1 octeți 224-1 octeți 232-1 octeți 65535 membri 64 membri

Spațiu necesar

W octeți

L +1 octeți

L +1 octeți

L + 2 octeți

L + 3 octeți

L + 4 octeți

1 sau 2 octeți

1,2,3,4 sau 8 octeți

Tipurile de coloane CHAR și VARCHAR

CHAR si VARCHAR sunt cele mai folosite tipuri șir. Diferența dintre ele constă în aceea că CHAR este un tip de lungime fixă, iar VARCHAR este un tip de lungime variabilă. Valorile dintr-o coloană CHAR (M) ocupă fiecare câte M octeți; valorile mai scurte sunt completate la dreapta cu spații atunci când sunt stocate. (Totuși, la regăsirea acestor valori, spațiile finale sunt eliminate.) Valorile dintr-o coloană VARCHAR (M) sunt stocate folosind numai cantitatea de octeți necesară, plus un octet pentru înregistrarea lungimii5.

Dacă lungimea valorilor dumneavoastră nu variază prea mult, CHAR este o opțiune mai bună decât VARCHAR, deoarece tabelele cu rânduri de lungime fixă pot fi prelucrate mai eficient decât tabelele cu lungime variabilă. Dacă valorile dumneavoastră au toate aceeași lungime, VARCHAR va folosi, de fapt, un spațiu mai mare, datorită octetului suplimentar utilizat pentru înregistrarea lungimii valorilor.

Anterior versiunii MySQL 3.23, coloanele CHAR și VARCHAR pot fi declarate cu o lungime maximă M cuprinsă între l si 255. începând de la versiunea MySQL 3.23, CHAR(O) este de asemenea o valoare permisă. CHAR(O) este util ca element de înlocuire atunci când doriți să declarați o coloană, dar nu vreți să alocați spațiu pentru aceasta dacă nu sunteți sigur de lățimea pe care doriți să i-o atribuiți. Puteți folosi ALTER TABLE pentru a mări ulterior lățimea coloanei. O coloană CHAR(O) poate fi de asemenea folosită pentru a reprezenta valorile pornit/oprit, dacă îi permiteți să ia valoarea NULL. Valorile dintr-o asemenea coloană pot lua două valori, în speță NULL si șirul vid. O coloană CHAR(O) ocupă un spațiu de stocare foarte redus în interiorul tabelului: un singur bit.

Cu anumite excepții limitate, nu puteți combina CHAR și VARCHAR în interiorul aceluiași tabel. MySQL va proceda chiar la modificarea coloanelor de la un tip la altul, în funcție de circumstanțe. (Acesta este un lucru care nu se întâmplă în cadrul altor sisteme de baze de date.) Principiile care se aplică sunt următoarele:

• Tabelele cu rânduri de lungime fixă sunt prelucrate mai ușor decât tabelele cu rânduri de lungime variabilă. (Motivele vor fi discutate în secțiunea „Alegerea tipurilor de coloane".)

' Spafiile finale sunt eliminate la stocarea valorilor; acest procedeu diferă de standardul ANSI pentru SQL în ceea ce privește valorile de tip VARCHAR. – N.A.

• Rândurile unui tabel au lungime fixă numai dacă toate coloanele din tabel sunt tipuri cu lungime fixă. Dacă fie și o singură coloană are lungime variabilă, rândurile tabelului devin și ele de lungime variabilă.

• Deoarece avantajele de performanță ale rândurilor de lungime fixă se pierd atunci când rândul devine de lungime variabilă, toate coloanele de lungime fixă pot fi convertite în echivalente de lungime variabilă, atunci când o atare măsură poate duce la economii de spațiu.

Aceasta înseamnă că, dacă aveți coloane VARCHAR într-un tabel, nu puteți avea și coloane CHAR; MySQL le convertește „pe tăcute" în VARCHAR. Să presupunem că ați creat un tabel ca acesta:

CREATE TABLE tabeluljneu

c1 CHAR(10), c2 VARCHAR(10) ) Dacă emiteți o interogare DESCRIBE tabeluljneu, datele de ieșire se prezintă astfel:

Observați că prezența coloanei VARCHAR determină programul MySQL să convertească și coloana c1 la tipul VARCHAR. Dacă încercați să folosiți ALTER TABLE pentru a converti c1 la CHAR, nu veți reuși. Unica modalitate de a transforma o coloană VARCHAR în coloană CHAR este de a converti toate coloanele VARCHAR din tabel în același timp:

ALTER TABLE tabeluljneu MODIFY c1 CHAR(10), MODIFY c2 CHAR(10) Tipurile de coloane BLOB și TEXT sunt de lungime variabilă, ca și VARCHAR, dar nu au nici un echivalent de lungime fixă, deci nu puteți folosi coloane CHAR în același tabel ca si coloanele BLOB și TEXT. Orice coloană CHAR va fi convertită la VARCHAR.

Excepția de la regula neutilizării în același tabel a coloanelor de lungime fixă și a celor de lungime variabilă constă în aceea că acele coloane de tip CHAR mai scurte de patru caractere nu sunt convertite la VARCHAR. De exemplu, MySQL nu va transforma coloana CHAR din următorul tabel în VARCHAR: CREATE TABLE tabelul meu

C1 CHAR(2),

c2 VARCHAR(10) )

Motivul pentru care coloanele mai scurte de patru caractere nu sunt convertite este acela că, în medie, economia de spațiu pe care o puteți obține prin nestocarea spațiilor finale este anulată de octetul suplimentar necesar într-o coloană VARCHAR pentru înregistrarea lungimii fiecărei valori. De fapt, dacă toate coloanele dumneavoastră sunt scurte, MySQL va converti la CHAR orice coloană declarată ca VARCHAR. MySQL procedează astfel deoarece conversia nu va mări, în medie, cantitatea de spațiu necesară și va îmbunătăți performanțele prin transformarea rândurilor tabelului în rânduri de lungime fixă. Dacă creați un tabel cu următoarea specificație, coloanele VARCHAR vor fi toate convertite „discret" în CHAR:

CREATE TABLE tabelul meu

c1 VARCHAR(1), C2 VARCHAR(2), C3 VARCHAR(3)

Puteți verifica modificarea coloanelor prin examinarea datelor de ieșire ale interogării I DESCRIBE tabelul meu:

Tipurile de coloane BLOB și TEXT

Un "BLOB" este un obiect binar mare (binary /arge object), în esență un container care poate stoca orice doriți să puneți în el și pe care îl puteți face aproape oricât de mare i doriți, în MySQL, tipul BLOB este de fapt o familie de tipuri (TINYBLOB, BLOB, MEDIUM-BLOB, LONGBLOB) care sunt identice, cu excepția cantității maxime de informații pe care o pot stoca (vezi tabelul 2.8). MySQL mai are o familie de tipuri TEXT (TINYTEXT, TEXT; | MEDIUMTEXT, LONQTEXT). Acestea sunt identice din toate punctele de vedere cu tipurile i BLOB corespunzătoare, cu excepția faptului că, la comparare si sortare, valorile BLOB sunt j sensibile la diferența între majuscule și minuscule, în timp ce valorile TEXT nu sesizează J această diferență. Coloanele BLOB si TEXT sunt utile pentru stocarea datelor care poți deveni foarte mari sau care pot varia foarte mult ca dimensiune de la un rând la altul. < Printre exemple se numără documentele create cu procesoarele de text, imaginile sunetele, datele compuse și articolele de știri.

Coloanele BLOB și TEXT pot fi indexate începând de la MySQL 3.23.2, deși trebuie s| specificați o dimensiune a prefixului care va fi folosit pentru index, cu scopul de a evitai intrările de index care pot deveni enorme si care pot, ca atare, să anuleze toate avânta?! jele dobândite prin utilizarea acelui index. De asemenea, în general nu se efectuează căutări în coloane BLOB sau TEXT, deoarece coloane ca acestea conțin deseori date binare j (precum imaginile). Se obișnuiește mai frecvent să se utilizeze alte coloane din tabel pen-1 tru înregistrarea unui anumit tip de informații de identificare referitoare la valorile BLOB | sau TEXT și să se folosească acele informații pentru a determina rândurile dorite.

Coloanele BLOB și TEXT pot necesita o atenție specială:

• Datorită variațiilor mari caracteristice ale dimensiunilor coloanelor BLOB și TEXT, lele care le conțin sunt supuse unor fragmentări de proporții dacă sunt efectuate nu? i meroase ștergeri și actualizări. Va fi necesar să rulați periodic instrucțiunea OPTIMIZAI TABLE pentru a reduce fragmentarea și pentru a păstra un nivel ridicat de performanții J, „Optimizarea interogărilor", pentru mai multe informații.

• Dacă folosiți valori foarte mari, poate fi necesar să ajustați serverul în vederea creșterii valorii parametrului max_allowed_packet. Vezi capitolul 11, „Administrarea generală a sistemului MySQL", pentru mai multe informații. De asemenea, va trebui să măriți dimensiunea pachetului pentru orice client care dorește să folosească valori foarte mari. Anexa E, „Referință de programe MySQL", descrie această operație pentru clienții mysql și mysqldump.

Tipurile de coloane ENUM și SET

ENUM și SET sunt tipuri de șiruri speciale pentru care valorile coloanelor trebuie alese dintr-un set fix de șiruri. Principala diferență dintre cele două tipuri este că valorile coloanelor de tip ENUM trebuie să fie alcătuite dintr-un singur membru al setului de valori, în timp ce valorile dintr-o coloană SET pot conține oricare membru al setului sau chiar pe toți membrii. Cu alte cuvinte, ENUM este folosită pentru valori mutual exclusive, în timp ce SET permite mai multe opțiuni dintr-o listă de valori.

Tipul de coloană ENUM definește o enumerare, în coloanele ENUM se pot repartiza valori alcătuite din exact un membru ales dintr-o listă de valori specificată în momentul creării tabelului. O enumerare poate avea maximum 65536 membri (din care unul este rezervat de către MySQL). Enumerările se folosesc frecvent pentru a reprezenta valorile dintr-o categorie. De exemplu, valorile dintr-o coloană declarată ca ENUM ( "N" , "D" ) pot fi numai "N" sau "D". Alternativ, puteți folosi ENUM pentru răspunsuri la întrebări cu opțiuni multiple dintr-un chestionar sau studiu, respectiv pentru mărimile și culorile unui produs:

salariați ENUM("sub 100", "100-500" ,"501 -1500", "peste 1500")

culoare ENUM("rosu" ," verde" /albastru", "negru")

mărime ENUM("S", "M" , "L" ,"XL" , "XXL")

Dacă prelucrați selecții din pagini Web, puteți folosi ENUM pentru a reprezenta opțiunea pe care un vizitator al sitului dumneavoastră o alege dintr-un set de butoane radio mutual exclusive plasate într-o pagină. De exemplu, dacă averi un serviciu pe Internet pentru comenzi de pizza, se poate folosi o enumerare pentru a reprezenta tipul de coajă comandat de un client:

coaja ENUM( "subțire" /normala", "stil pan")

În cazul în care categoriile de enumerare reprezintă numere, este important să vă alegeți categoriile în mod corespunzător atunci când creați enumerarea. De exemplu, când înregistrați numărul de leucocite rezultat în urma unui test de laborator, puteți grupa numerele în categorii în acest mod:

leucocite ENUM( "0-100" ,"101 -300" , ">300" )

Când rezultatul testului este dat sub forma unei valori exacte, puteți înregistra valoarea sub forma categoriei în care se încadrează aceasta. Nu puteți însă reveni la valoarea originală dacă decideți să convertiți coloana dintr-o enumerare bazată pe categorii într-o coloană de întregi, compusă din valori exacte.

Tipul SET este similar cu ENUM în sensul că, atunci când creați o coloană SET, specificați o listă cu nembrii permiși ai setului. Dar, spre deosebire de ENUM, fiecare valoare a coloanei poate fi alcătuită din orice număr de membri ai setului. Setul poate avea maximum 64 de membri. Puteți folosi un SET atunci când aveți un set fix de valori care nu sunt mutual exclusive, așa cum este cazul în coloana ENUM. De exemplu, puteți folosi SET pentru a reprezenta opțiunile disponibile pentru un autoturism:

,. ^„Ay,,,», VJÎji ' 'îT*-!i' >!#/

SET("portbagaj","pilot automat","aer condiționat","trapa") Apoi, valorile particulare din SET vor reprezenta opțiunile efectiv comandate de clienți:

SET("pilot automat,trapa")

SET("portbagaj,aer condiționat")

SET("portbagaj,pilot automat,aer condiționat")

SET("aer condiționat")

SET("")

Șirul vid indică faptul că un client nu a comandat nici o opțiune. Aceasta este o valoare admisă pentru SET.

Valorile din coloana SET sunt reprezentate sub forma unui șir unic. Dacă o valoare este alcătuită din mai mulți membri ai unui set, membrii sunt separați în interiorul șirului prin virgule. Evident, aceasta înseamnă că nu trebuie să folosiți un șir care include o virgulă ca membru al unei coloane SET.

Coloanele SET mai pot fi utilizate pentru reprezentarea unor informații precum diagnosticele unor pacienți sau rezultate din selecții efectuate în pagini Web. Pentru un diagnostic, poate exista o listă standard de simptome a căror (in)existență trebuie aflată de la pacient, iar acesta poate prezenta oricare simptom sau pe toate. Pentru serviciul dumneavoastră de comenzi de pizza prin Internet, pagina Web pentru comenzi poate avea un set de casete de validare pentru ingredientele din pizza pe care le dorește clientul, ingrediente din care se pot alege mai multe.

Modul în care declarați lista cu valori admise pentru o coloană ENUM sau SET este important din mai multe puncte de vedere:

• Lista determină valorile admise posibile care pot fi incluse în coloană, așa cum s-a arătat anterior.

• Puteți insera valori ENUM si SET folosind atât majuscule, cât și minuscule, dar mărimea literelor pentru șirurile specificate în declarația coloanei determină mărimea literei valorilor coloanei atunci când acestea sunt regăsite ulterior. De exemplu, dacă aveți o coloană ENUM (" D"," N") si stocați în coloană valorile " d" și" n", valorile sunt afișate sub forma "D" și "N" atunci când le regăsiți. Acest fapt nu afectează comportarea tipurilor respective la comparație sau sortare, deoarece coloanele ENUM și SET nu sunt sensibile la diferența între majuscule și minuscule.

• Ordinea valorilor dintr-o declarație ENUM este ordinea folosită pentru sortare. Ordinea valorilor dintr-o declarație SET determină de asemenea ordinea de sortare, deși relația este mai complicată în acest caz, deoarece valorile coloanelor pot conține mai mulți membri ai setului.

• Ordinea valorilor dintr-o declarație SET determină ordinea în care apar sub-șirurile atunci când sunt afișate valorile din coloana SET care sunt alcătuite din mai mulți membri ai unui set.

ENUM și SET sunt clasificate ca tipuri șir, deoarece membrii enumerării, respectiv ai setului, sunt specificați sub formă de șir atunci când creați coloane de aceste tipuri. Totuși, membrii sunt stocați intern sub formă de numere și puteți lucra cu ei ca atare. Aceasta înseamnă că tipurile ENUM și SET sunt mai eficiente decât alte tipuri șir, deoarece pot fi manipulate frecvent folosind operații numerice în locul operațiilor cu șiruri. De asemenea, înseamnă că valorile ENUM și SET pot fi folosite atât în contexte numerice, cât și în contexte cu șiruri.

Membrii ENUM din declarația coloanei sunt numerotați secvențial, începând de la 1. (O este folosit de MySQL pentru membrul „eroare", care este reprezentat sub formă de șir prin șirul vid.) Numărul valorilor dintr-o enumerare determină dimensiunea spațiului de stocare al unei coloane ENUM. Un octet poate reprezenta 256 de valori, doi octeți pot reprezenta 65536 de valori. (Comparați aceste valori cu domeniile tipurilor întregi pe un octet si pe doi octeți TINYINT UNSIGNED si SMALLINT UNSIGNED.) Astfel, numărul maxim de membri ai unei enumerări este 65536 (inclusiv membrul „eroare"), iar dimensiunea spațiului de stocare depinde de existența sau nu a unui număr de membri mai mare de 256. Puteți specifica un număr maxim de 65535 (nu 65536) de membri în declarația ENUM, deoarece MySQL rezervă un spațiu pentru membrul „eroare" ca membru implicit al fiecărei enumerări. Când atribuiți o valoare incorectă într-o coloană ENUM, MySQL repartizează în schimb membrul „eroare".

Iată un exemplu pe care îl puteți încerca folosind clientul mysql. Exemplul prezintă ordonarea numerică a membrilor unei enumerări și demonstrează, de asemenea, că valoarea NULL nu are nici un număr în cadrul ordonării:

mysql> CREATE TABLE e_tabel (e ENUM("ana","ion","nae","ela"));

mysql> INSERT INTO e_tabel

VALUES("ana"),("ion"),("nae"),("ela"),(""), (NULL);

mysql> SELECT e, e+0, e+1, e*3 FROM e_tabel;

Puteți efectua operații cu membrii enumerării în funcție de nume sau de număr: mysql> SELECT e FROM e_tabel WHERE e='nae";

nae

nae

mysql> SELECT e FROM ejtabel WHERE e=3; e

Se poate declara șirul vid ca membru permis al unei enumerări. Acestui șir i se va. atribui o valoare numerică diferită de zero, ca oricărui alt membru menționat îr declarație. Totuși, utilizarea unui șir vid poate provoca oarecare derută, deoarece șirul respectiv este de asemenea folosit pentru membrul „eroare", a cărui valoare numerică este 0. în exemplul următor, repartizarea valorii de enumerare incorecte "x" în coloana ENUM determină repartizarea membrului de eroare. Acesta poate fi difererențiat de membrul șir vid numai atunci când este regăsit în formă numerică:

mysql> CREATE TABLE t (e ENUM("a","",'b'));

mysql> INSERT INTO t VALUES('a"),(""),("b"),("x");

mysql> SELECT e e+0 FROM t;

Reprezentarea numerică a coloanelor SET este puțin diferită de aceea a coloanelor ENUM. Membrii unui set nu sunt numerotați secvențial, în schimb, fiecărui membru îi corespunde unui bit individual în valoarea SET. Primul membru al setului corespunde bitului O, al doilea membru corespunde bitului l etc. O valoare SET numerică egală cu O corespunde șirului vid. Membrii SET sunt stocați ca valori pe biți. în acest mod se pot stoca în fiecare octet câte opt valori ale unui set, deci dimensiunea spațiului de stocare a unei coloane SET este determinată de numărul de membri ai setului, până la o valoare maximă de 64 de membri. Valorile SET pot ocupa l, 2,3,4 sau 8 octeți pentru dimensiuni ale setului cuprinse respectiv între 1-8, 9-16, 17-24, 25-32 si 33-64.

Reprezentarea unei valori SET sub forma unui set de biți este cea care îi permite unei asemenea valori să fie alcătuită din mai mulți membri ai unui set. într-o valoare se poate stabili orice combinație de biți, deci valoarea poate fi alcătuită din orice combinație de șiruri din declarația SET care corespund acestor biți.

Iată un exemplu care ilustrează relația dintre forma șir si forma numerică a unei coloane SET; valoarea numerică este afișată atât în formă zecimală, cât si în formă binară:

mysql> CREATE TABLE s_tabel (s SET("ana-,"ion",-nae","ela"));

mysql> INSERT INTO s_tabel

VALUES("ana"), ("ion"), ("nae'),Cela"),("),(NULL);

mysql> SELECT s, s+0, BIN(s+0) FROM s_tabel;

Similar Posts