PHP: Hypertext Preprocessor

   

O soluţie simplă pentru a genera pagini web dinamice


   

Există mai multe metode pentru a realiza în mod dinamic pagini Web şi multe dintre ele au fost deja prezentate în paginile revistei. Limbajul PHP are însă avantajul simplităţii şi a independenţei de sistemul de operare.

Mircea Sârbu


La fel ca multe alte proiecte software importante, PHP s-a născut sub forma unui mic utilitar cu care trebuia să rezolve o problemă simplă şi foarte particulară. În 1995, un programator pe nume Rasmus Lerdorf şi-a publicat CV-ul în pagina sa Web. Pentru ca să poată să urmărească cine i-a vizitat pagina, Rasmus a introdus în pagină un tag special şi a scris în Perl un script CGI care să colecteze informaţii despre vizitatori, pe care apoi le scria într-un jurnal (log). A botezat acest cod PHP (Personal Home Page) tools. Mai apoi, în cadrul unui proiect "de serviciu", a trebuit să realizeze o interfaţă între clienţii de pe Web şi o bază de date. A recurs la aceeaşi idee: taguri HTML proprii, procesate de un script CGI (de data aceasta scris în C) care le înlocuia cu conţinutul care trebuia inserat în pagină. A numit aceste taguri "Form Interpreters" (FI) deoarece rolul lor era de a prelua datele transmise prin formulare HTML şi de a le transforma în variabile simbolice pe care le folosea apoi pentru interogarea bazei de date.

Ce a urmat este destul de simplu: a reunit codul PHP cu FI şi l-a făcut public sub numele PHP/FI. Comunitatea programatorilor a făcut restul. Programul a fost corectat, dezvoltat şi extins în regim open source, depăşind cu mult scopul său iniţial. Deşi numele PHP s-a păstrat, semnificaţia sa a devenit alta (cea din titlul articolului - observaţi caracterul recursiv, similar cu GNU). Ajuns între timp la versiunea 4, PHP este un limbaj de scripting server-side foarte solid, dotat cu peste 1000 de funcţii, implementat pe numeroase platforme, conlucrând cu toate serverele Web importante şi dispunând de interfeţe pentru toate majoritatea bazelor de date utilizate. Popularitatea sa a crescut neîncetat, statistici Netcraft (nu foarte recente) estimând că PHP este folosit în circa 1,5 milioane de domenii Web.

Principiul

Presupunând că instalarea PHP nu vă va pune probleme şi ca toată lumea cunoaşte diferenţa între un script Web server-side (care este executat de serverul Web) şi un script client-side (care este executat de browser), îmi rămâne de făcut precizarea că exemplele din acest articol au fost testate cu PHP 4.0.1, instalat pe un server Apache 1.3.2 rulând sub Windows 98. Fişierele cu extensia "php" sunt considerate scripturi PHP şi sunt preprocesate (directiva de configurare "AddType application/x-httpd-php .php" pentru Apache), dar serverul Web poate fi configurat şi altfel (o alta extensie uzuala este "phtml").

Să considerăm următorul cod (fişierul Ex1.php):

      <HTML><BODY> 
      <? print("Salut, $REMOTE_ADDR !<br>") ?> 
      </BODY></HTML> 

Să admitem că fişierul se află într-un subdirector al serverului Web (pornind de la document root) şi că poate fi accesat de un navigator web la o anumită adresă (de pildă "http://www.php_ex.ro/Ex1.php").

Procesul este următorul: browserul trimite către serverul Web o cerere HTTP pentru fişierul Ex1.php. Serverul ştie că fişierul cerut conţine cod PHP, aşa că va lansa preprocesorul PHP, care va primi la intrare fişierul Ex1.php. Preprocesorul va identifica secvenţele PHP (cuprinse între marcajele <? şi ?>) şi le va interpreta. Tot ce nu este cod PHP este trimis spre ieşirea standard fără nici o prelucrare. Codul PHP poate scrie la rândul său în ieşirea standard (prin echo sau print). În fine, serverul Web interceptează ieşirea standard a preprocesorul şi trimite totul către browserul care a cerut pagina (de fapt scriptul).

În exemplul nostru, serverul Web va trimite întâi header-ele HTTP, după care va lansa preprocesorul PHP. Acesta va trimite la ieşire (deci spre browser) şirul de caractere "<HTML><BODY>", după care va interpreta secvenţa PHP. Aceasta va trimite la rândul ei spre browser un şir de caractere (ceva de genul "Salut, 184.237.112.40 !"), după care se trimite restul fişierului.

În final, browserul va primi un fişier HTML "curat", pe care îl va transpune pe ecran în mod absolut obişnuit.

Poate fi interesant să mai scriem câteva variante ale scriptului Ex1. De exemplu, putem să cuprindem totul în codul PHP:

      <? 
        echo "<HTML><BODY>"; 
        echo "Salut, $REMOTE_ADDR !"; 
        echo "<br></BODY></HTML>" 
      ?> 

A doua variantă pune în evidenţă faptul că putem "sparge" codul PHP în bucăţi:

      <HTML><? echo "<BODY>" ?>Salut, 
      <? print(" $REMOTE_ADDR !") ?> 
      <br></BODY><? echo "<HTML>" ?> 

Rezultatul final este acelaşi în toate variantele.

Elemente de limbaj

PHP este, în cele din urmă, un limbaj de programare în toată regula, aşa că dispune de variabile, structuri de control, funcţii de bibliotecă, funcţii definite de utilizator şi chiar clase. Din fericire, sintaxa este foarte simplă, fiind în bună măsură preluată din C.

Variabilele sunt prefixate de caracterul $ şi - ca în majoritatea limbajelor interpretate - sunt tipizate dinamic. În exemplul de mai sus, singura variabilă folosită a fost $REMOTE_ADDR, o variabilă de mediu, care primeşte automat ca valoare adresa IP a clientului care a expediat cererea HTTP. Variabilele de mediu sunt importate de preprocesorul PHP din mediul în care acesta rulează, deci pot să difere în funcţie de sistemul de operare şi de serverul Web (în general se poate miza pe variabilele de mediu disponibile în CGI). Din păcate, variabila $REMOTE_ADDR este specifică serverului Apache, aşa că s-ar putea ca sub alte servere să nu fie definită. Pe de altă parte, valoarea ei nu este întotdeauna cea corectă (se poate să primim adresa serverului de cache utilizat de ISP). O variantă îmbunătăţită a scriptului ar putea arăta astfel:

      <HTML><BODY> 
      <? 
      if (getenv("HTTP_X_FORWARDED_FOR")){ 
        $ip=getenv("HTTP_X_FORWARDED_FOR"); 
      } else { 
        $ip=getenv("REMOTE_ADDR"); 
      } 
      echo "Salut, $ip !<br>"; 
      ?> 
      </BODY></HTML> 

În primul rând, să remarcăm că variabilele de mediu nu mai sunt referite direct, ci printr-o funcţie specializată numită getenv. Aceasta returnează valoarea variabilei dacă ea există sau şirul vid ("") în caz contrar. Pe de altă parte, observăm şi o variabilă proprie: $ip.

O altă noutate o reprezintă structurile de control. Construcţia if este similară cu cea din C, cu diferenţa că testul se evaluează false şi în cazul în care rezultatul evaluării expresiei este şirul vid (sau chiar şirul "0"!).

Cum acest articol nu intenţionează să ia locul manualului, mă voi limita să punctez doar câteva aspecte oarecum particulare:

  • Echo este o construcţie specială, echivalentă cu funcţia 'print';

  • Şirurile de caractere pot fi cuprinse între ghilimele sau între apostrofuri. Diferenţa este că în al doilea caz se inhibă evaluarea variabilelor.

  • În afară de structuri de control, variabile şi funcţii, PHP dispune şi de constante simbolice. Acestea de definesc prin funcţia define, nu mai pot fi redefinite iar vizibilitatea lor este globală. Există şi un set de constante predefinite, printre care TRUE, FALSE, PHP_VERSION etc.

  • Structurile de control (if-else-elseif, while, do..while, for şi switch) dispun şi de o sintaxă alternativă. De exemplu *while (cond): instrucţiuni endwhile*;

  • Operatorii folosiţi în expresii sunt cei din C. Astfel, atribuirea se notează cu "=" (egal) iar egalitatea se testează cu "==" (dublu egal), negaţia este "!" (semnul exclamării), există operatorii de pre şi post incrementare/decrementare, la fel şi operatorii înlănţuiţi (a += 4 este echivalent cu a = a + 4 şi aşa mai departe). Concatenarea şirurilor se marchează cu "." (punct).

O menţiune specială merită funcţiile include() şi require(), care permit includerea fişierelor externe în codul PHP. Datorită lor organizarea unui proiect poate fi structurată în mod logic.

În rest, vom vedea în exemple şi, desigur, în manual.

Procesarea formularelor

Procesarea formularelor HTML este una dintre principalele activităţi la care PHP se pretează excelent. Legarea unui formular HTML de un script PHP care să-l prelucreze se face foarte simplu, indicând numele scriptului prin atributul ACTION al marcajului <FORM>.

Să presupunem că vrem să oferim clienţilor posibilitatea să comande pizza la domiciliu printr-un serviciu Web. Cel mai simplu ar fi să scriem un formular HTML care să fie completat de client. La modul minimal, ar putea arăta cam aşa:

      <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"> 
      <HTML><HEAD> 
        <TITLE>Pizza la domiciliu</TITLE> 
      </HEAD> 
      <BODY> 
        <H3>Formular de comanda</H3> 
        <FORM METHOD="POST" ACTION="custom.php" name="Form"> 
          <TABLE ALIGN="left" BORDER=0 CELLSPACING=10 CELLPADDING=10> 
            <TR ALIGN="left" VALIGN=middle"> 
              <TD> Pizza: </TD> 
              <TD> <SELECT NAME="pizza" size="1"> 
                <OPTION selected>Margherita 
                <OPTION>Pepperoni 
                <OPTION>Vegetariana</SELECT> 
              </TD></TR> 
            <TR><TD>Dimensiune:</TD> 
              <TD> 
                <INPUT TYPE="radio" NAME="dim" VALUE="mica">Mica 
                <INPUT TYPE="radio" NAME="dim" VALUE="medie">Mijlocie 
                <INPUT TYPE="radio" NAME="dim" VALUE="mare" CHECKED>Mare 
              </TD></TR> 
            <TR><TD>Bauturi:</TD> 
              <TD> 
                <INPUT TYPE="checkbox" NAME="orange">Suc de portocale 
                <BR><INPUT TYPE="checkbox" NAME="grape" >Suc de grapefruit 
                <BR><INPUT TYPE="checkbox" NAME="beer" >Bere 
                <BR><INPUT TYPE="checkbox" NAME="wine" >Vin alb 
              </TD></TR> 
            <TR><TD>Adresa:</TD> 
              <TD> 
                <INPUT TYPE="text" NAME="adresa"> 
              </TD></TR> 
            <TR><TD></TD>
              <TD> 
                <INPUT TYPE="submit" VALUE="Trimite"> 
                <INPUT TYPE="reset" VALUE="Anuleaza"> 
              </TD></TR> 
          </TABLE>
        </FORM> 
      </BODY></HTML> 

Este minimal (nu se pot specifica mai multe sortimente, cantităţi etc.) dar funcţionează. Partea care ne interesează este însă scriptul custom.php care va procesa datele transmise. Nici aici nu vom detalia prea mult. Ne vom mulţumi să compunem un mesaj e-mail pentru bucătar, presupunând că el se va ocupa şi de distribuţie:

      <HTML><BODY> 
      <? 
        if (!$adresa) { ?> 
          <H3>Eroare!</H3> 
          <P>Nu ati specificat adresa la care sa fie livrata comanda</P> 
          <p>Corectati <a href="javascript:history.go(-1)">comanda</a></p> 
      <? 
        } else { 
      ?> 
          <H3>Comanda dumneavoastra:</H3> 
        <? 
          $mesaj = ""; 
          $mesaj .= date("d M Y, G:i") . "\n"; 
          $mesaj .= "Pizza ". $pizza . " " . $dim . "\n"; 
          if (isset($orange)) 
            $mesaj .= "Suc de portocale \n"; 
          if (isset($grape)) 
            $mesaj .= "Suc de grapefruit \n"; 
          if (isset($beer)) 
            $mesaj .= "Bere \n"; 
          if (isset($wine)) 
            $mesaj .= "Vin alb \n"; 
          $mesaj .= "\nAdresa: $adresa \n"; 
          // se trimite mesajul 
          mail("bucatar@pizza.ro", "Comanda", $mesaj); 
          /* se afiseaza datele colectate */ 
          $html_message = nl2br($mesaj); 
          echo "$html_message"; 
        } 
      ?> 
      </BODY></HTML> 

Nici o surpriză. PHP creează automat variabilele corespunzătoare elementelor din formular, numite conform atributului NAME din câmpurile formulatului. Valorile pe care le iau aceste variabile sunt preluate din atributul VALUE (dacă există) sau din elementul corespunzător, fiind transmise scriptului prin metoda aleasa în marcajul <FORM> (în cazul nostru POST). Pentru elementele de tip text, cum este cazul câmpului Adresa, s-a creat variabila $adresa. De remarcat că testul isset($adresa) va fi mereu adevărat (variabila este setată automat), deci pentru a ne asigura că s-a introdus ceva în câmpul Adresa trebuie să testăm dacă variabila este sau nu vidă.

De remarcat că la câmpurile de tip checkbox nu se creează variabile decât pentru câmpurile selectate. Dacă nu se apare atributul VALUE, valoarea acestor variabile va fi "on".

Funcţiile folosite:

  • isset($var) - verifică dacă variabila $var există;

  • date(format) - furnizează data calendaristică şi ora în formatul specificat;

  • nl2br(string) - transformă caracterele "\n" (new line) în marcajul <br>;

  • mail(dest, subj, mesaj) - trimite un mesaj e-mail.

Un exemplu complet

Presupunând că aţi prins deja gustul pentru PHP, vă propun să dezvoltăm puţin exemplul precedent. Nu, nu vom rafina prea mult formularul (e o chestiune ce ţine mai mult de HTML decât de PHP). Vă propun în schimb să generăm automat formularul pe baza unui fişier de configurare. În acest fel, vom putea să adăugăm sau să eliminăm cu multă uşurinţă anumite sortimente.

Fişierul de configurare va fi în format text şi va avea o sintaxă extrem de simplă. Iată cum ar arată pentru formularul din exemplul precedent:

      Pizza, select 
      Margherita 
      Pepperoni 
      Vegetariana 

      Dim, radio 
      Mica 
      Medie 
      Mare 

      Bauturi, checkbox 
      Suc de portocale 
      Suc de grapefruit 
      Bere 
      Vin alb 

      Adresa, text 
      Adresa 

Fişierul e împărţit în secţiuni, fiecare dintre acestea indicând şi tipul de control pe care îl va genera. Pentru fiecare secţiune sunt indicate un număr de valori. Liniile goale nu contează.

Vom avea nevoie de un script PHP care să citească fişierul de configurare şi să genereze o structură internă de date, pe baza căreia să se genereze formularul. Cu această ocazie vom vedea cum se definesc funcţii:

      function Configuration ( $ConfigFile ) { 

      global $config; 

        $fp = fopen($ConfigFile, "r") 
              or die ("Fatal: Can't find the configuration file"); 
        while ($data = fgetcsv($fp, 1000, ",")) { 
          if (!$data[0][0]) continue; 
          $num = count($data); 
          if ($num == 2) { 
            $sect=$data[0]; 
            $config[$sect]["tip"] = $data[1]; 
            $i=0; 
            continue; 
          } 
          if ($num == 1) 
            $config[$sect]["values"][$i++] = $data[0]; 
        } 
        fclose($fp); 
      } 

Funcţia (pe care am numit-o Configuration) primeşte ca parametru numele fişierului de configurare, pe care (pentru simplitate) îl presupunem plasat în acelaşi director cu celelalte elemente ale programului. Variabila $config va cuprinde structura de date creată pe baza datelor din fişier. Deoarece ea va fi folosită de funcţia care va genera formularul, trebuie să o declaram ca fiind globală (altfel vizibilitatea ei ar fi limitată la nivelul funcţiei în care a fost creată).

Deschiderea fişierului este simplă, funcţia fopen returnând un handler. Al doilea parametru (r) indică faptul că fişierul va fi deschis pentru citire. În cazul în care fişierul nu poate fi deschis, se generează un mesaj de eroare şi scriptul se termină.

Fişierul este de tip CSV (comma separated values). Funcţia fgetcsv primeşte ca argument handler-ul, numărul maxim de caractere dintr-o linie şi separatorul. Ceea ce returnează fgetcsv este un tablou cuprinzând valorile din linia curentă. După fiecare apel se trece la linia următoare iar o citire dincolo de sfârşitul fişierului va întoarce FALSE.

Logica este simplă. Funcţia count întoarce, desigur, numărul de elemente din tablou. Trebuie remarcat că citirea unui linii goale va returna, totuşi, o valoare (şirul vid).

Elementul cel mai important în acest exemplu este noţiunea de tablou (array). Ca şi în Perl sau Tcl, în PHP tablourile sunt foarte puternice şi versatile. Ele pot să se comporte ca tablourile indexate obişnuite, sau pot fi tablouri asociative (nu există nici o diferenţă formală între ele). Elementele unui tablou pot fi de orice tip, inclusiv alte tablouri, ceea ce permite definirea unor structuri complexe.

Elementele tabloului pot fi indexate fie prin valori numerice, fie prin şiruri de caractere. Tabloul $config va avea câte un element pentru fiecare secţiune din fişier, indexat prin numele secţiunii. Acest element va fi, de fapt, o pereche de valori, dintre care prima (indexată prin şirul "tip") va indica ce fel de control trebuie generat, iar a doua (indexată prin şirul "values") va fi de fapt un tablou indexat numeric ce va conţine valorile propriu-zise. Iată câteva exemple:

      $config ["Bauturi"]["tip"] 

are valoarea "checkbox"; :

      $config ["Bauturi"]["values"][0] 

este "Suc de portocale";

Iată şi funcţia care va face efectiv generarea controalelor:

      function Write_Controls ($config) { 
        reset($config); 
        while (list($key, $val) = each($config)) { 
          echo "<P><B>$key: </B>"; 
          switch ($config[$key]["tip"]) { 
            case "text": 
              echo '<INPUT TYPE="text" NAME="' 
                   . $config[$key]["values"][0] 
                   . '"><BR>'; 
              echo "</P>"; 
              break; 
            case "radio": 
              $check="CHECKED"; 
              foreach ($config[$key]["values"] as $v) { 
                echo '<INPUT TYPE="radio" NAME="' 
                    . $key. '" VALUE="' 
                    . $v . "\" $check>" 
                    . $v; 
                $check = ""; 
              } 
              echo "</P>"; 
              break; 
            case "select": 
              $sel="SELECTED"; 
              echo '<SELECT NAME="' 
                   . $key 
                   . '" size="1">'; 
              foreach ($config[$key]["values"] as $v) { 
                echo "<OPTION $sel>" . $v ; 
                $sel = ""; 
              } 
              echo "</SELECT></P>"; 
              break; 
            case "checkbox": 
              $i=0; 
              foreach ($config[$key]["values"] as $v) { 
                echo '<BR><INPUT TYPE="checkbox" NAME="' 
                     . $key . $i++ . 
                     '" VALUE="' . $v . 
                     '">' . $v; 
              } 
              echo '<INPUT TYPE="hidden" NAME="drinks" VALUE="' . $i . '">'; 
              echo "</P>"; 
              break; 
          } 
        } 
      } 

De fapt, nu e nimic spectaculos. Singurul lucru de interes este reprezentat de modalităţile de parcurgere a tablourilor. În acest exemplu am exemplificat două. Prima modalitate (cea "clasică") o reprezintă funcţia each, care la fiecare apel returnează două valori: prima reprezintă cheia iar a doua valoarea asociată acestei chei. Funcţia list le va asambla într-un tablou. De remarcat că parcurgerea se face pe baza unui pointer intern al tabloului, pe care fiecare apel al funcţiei each îi avansează. Din acest motiv, înainte de parcurgere trebuie apelată funcţia reset, care poziţionează pointerul intern la începutul tabloului.

A doua variantă (introdusă doar în PHP4) o reprezintă structura foreach. Aceasta indică o instrucţiune sau un bloc de instrucţiuni care se va executa pentru fiecare element al tabloului (nu mai este necesar apelul reset). Există posibilitatea de a extrage doar valoarea, sau de a extrage perechi cheie-valoare, caz în care apelul este de forma următoare:

      foreach ($tablou as $cheie=>$valoare) { ... } 

O precizare privind comunicarea între formular şi scriptul care-l va prelucra ("custom1.php"): deoarece pentru fiecare checkbox se generează un nume, este util să comunicăm scriptului de prelucrare câte variabile se generează în secţiunea respectivă. Pentru aceasta generăm în formularul HTML un câmp ascuns (hidden) care va trimite variabila drinks având ca valoare numărul de casete de bifare.

În fine, să trecem în revistă şi scriptul ("custom1.php") care va prelua datele introduse în formular:

      <HTML><BODY> 
      <? 
        if (!$Adresa) { ?> 
      <H3>Eroare!</H3> 
      <P>Nu ati specificat adresa la care sa fie livrata comanda</P> 
      <p>Corectati <a href="javascript:history.go(-1)">comanda</a></p> 
      <? 
        } else { 
      ?> 
      <H3>Comanda dumneavoastra:</H3> 
      <? 
        $mesaj = ""; 
        $mesaj .= date("d M Y, G:i") . "\n"; 
        $mesaj .= "Pizza ". $Pizza . " " . $Dim . "\n"; 
        $mesaj .= "Bauturi: \n"; 
        for ($i=0; $i < $drinks; $i++) { 
          $varname="Bauturi" . $i; 
          if (isset($$varname)) { 
            $mesaj .= $$varname . "\n"; 
          } 
        } 
        $mesaj .= "\nAdresa: $Adresa \n"; 
        mail("bucatar@pizza.ro", "Comanda", $mesaj); 
        $html_message = nl2br($mesaj); 
        echo "$html_message"; 

        } 
      ?> 
      </BODY></HTML> 

O primă observaţie: acest script nu dispune de tabloul $config. Este un "spaţiu de lucru" nou, cu noi variabile. Din acest motiv, vom presupune cunoscute numele secţiunilor (ceea ce limitează generalitatea scriptului). Pentru o generalizare completă, va trebui fie să citiţi încă o dată fişierul de configurare, fie să trimiteţi datele relevante prin intermediul unor câmpuri hidden din formular.

În aceste condiţii, singurul lucru care se schimbă este partea de "detectare" a băuturilor, transmise prin checkbox-uri. Va trebui să compunem nume de variabile din numele secţiunii plus un sufix numeric şi să încercăm pe rând dacă acestea există (sunt setate). Este interesant în acest context faptul că în PHP există aşa-numitele "variabile variabile". E destul de simplu. Să considerăm secvenţa următoare:

      $a = "b"; 
      $b = 123; 

Variabila $$a va fi evaluată ca $b, deci va returna 123. Acum cred că totul e clar.

Ar mai fi pasul final: să legăm totul la un loc. Pentru aceasta vom reuni funcţiile Configuration şi Write_Controls într-o "bibliotecă" - de fapt un fişier pe care îl vom numi "functions.inc":

      <? 
        function Configuration ( $ConfigFile ) { 
        // definitia functiei ... 
        } 
        function Write_Controls ($config) { 
        // definitia ... 
        } 
      ?> 

Scriptul care va asambla totul (cel care va fi apelat din browser de către client) va fi destul de simplu:

      <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"> 
      <HTML><HEAD> 
        <TITLE>Pizza la domiciliu</TITLE> 
      </HEAD> 
      <BODY> 
        <H3>Formular de comanda</H3> 
        <? 
          include("functions.lib"); 
          Configuration("config.txt"); 
          echo '<FORM METHOD="POST" ACTION="custom1.php" NAME="form">'; 
          Write_Controls($config); 
        ?> 
        <INPUT TYPE="submit" VALUE="Trimite"> 
        <INPUT TYPE="reset" VALUE="Anuleaza"> 
        </FORM> 
      </BODY> 
      </HTML> 

Observaţi că "biblioteca" va fi mai întâi inclusă în script prin funcţia include (pe care o puteţi considera similară cu #include în C), după care pot fi apelate funcţiile. Restul este clar.

Un avertisment: exemplul a fost pur "didactic". Nu încercaţi să vindeţi pizza prin Internet cu codul din acest articol, pentru că veţi da faliment.

Cât despre restul...

N-am spus nimic despre expresiile regulate (echivalente cu cele din Perl), despre posibilităţile de a manevra cookies, despre funcţiile IMAP, LDAP, FTP şi multe altele. Nu pot încheia însă fără a menţiona încă o dată posibilităţile extrem de bogate (şi simple) de a lucra cu diverse baze de date.

Dacă, de exemplu, vreţi să păstraţi o arhivă a tuturor comenzilor (pizza, dimensiunea şi adresa) din exemplul pe care l-am tratat, e suficient să construiţi o tabelă (de pildă DBF) şi, sub Windows, să vă configuraţi o sursă de date ODBC corespunzătoare (să-i zicem "comenzi"). În scriptul "custom1.php" veţi putea adăuga câteva linii:

      $db = odbc_connect("comenzi", "user", "parola"); 
      $query = "insert into companies " 
        . "(pizza, dim, adresa) values ( "; 
      $query .= " '$Pizza' , '$Dim' , '$Adresa' )"; 
      $res = odbc_prepare($db, $query); 
      $res = odbc_execute($res); 
      odbc_close($db); 

Desigur, se poate rafina. Succes!


 

(Publicat în PC Report 95 - august 2000)

 

Copyright © 2000 Agora Media

Creative Commons License
This work is licensed under a Creative Commons License (BY-NC-ND).