online: 8; azi: 1105; total: 53111 Webdesign - Phpmysql - 66

Utilizarea bazelor de date folosind PHP (2)

  • Invatati sa verificati rezultatul interogarilor care nu returneaza randuri de tabel
  • Invatati sa prelucrati rezultatele intergarilor SELECT
  • Invatati sa afisati randuri si coloane din tabel

1. Verificarea interogarilor care nu returneaza rânduri de tabel

Din punctul de vedere al limbajului PHP, exista doua categorii de interogari SQL, ambele fiind emise folosind functia mysql_query().

  • Interogarile SELECT, care returneaza rânduri ale unui tabel
  • Interogarile UPDATE, INSERT si DELETE, care nu returneaza rânduri ale unui tabel
Pentru a verifica daca o interogare UPDATE, INSERT sau DELETE a avut efectul dorit, puteti folosi functia mysql_affected_rows(), care returneaza numarul rândurilor afectate de interogarea cea mai recenta.
O alta functie utila este mysql_insert_id().
Cand introduceti un rand intr-un tabel a carui cheie primara este de tipul AUTO_INCREMENT, functia mysql_insert_id() determina valoarea cheii primare atribuite de MySQL. Functia returneaza valoarea zero daca interogarea precedenta nu a generat o valoare AUTO_INCREMENT. Ca atare, functia trebuie apelata la putin timp dupa interogarea care a inserat rândul in tabel, astfel încât o alta interogare ulterioara sa nu modifice rezultatul.
Iata un exemplu de utilizare a functiilor mysql_affected_rows() si mysql_insert_id() impreuna cu iterogarea INSERT (care adauga randuri in tabel). Folosim baza de date "lucrudb" si tabelul "carti", create in Utilizare baze de date cu PHP.
<?php
$conn = mysql_connect("localhost", "Marius", "mypass")
    or die("Unable to connect to MySQL");
$selectdb = mysql_select_db('lucrudb');
if (!$selectdb)
    echo "Baza de date lucrudb nu a putut fi selectata deoarece : ". mysql_errno(). " : ". mysql_error();
$sql = "INSERT INTO `carti` (nume, autor, gen, data_intrare, pret) VALUE ('Carte2', 'Autor2', 'Educativ', '2008-9-16', 11.00)";
if (mysql_query($sql))
    echo "Datele au fost adaugate in tabelul carti <br />";
else
    echo "Datele nu au fost adaugate in tabelul carti deoarece : ". mysql_errno(). " : ". mysql_error();
$nranduri = mysql_affected_rows();
$id = mysql_insert_id();
if ($nranduri == -1) {
    echo "INSERT nu a putut sa adauge datele";
}
else
    echo "Au fost adaugate $nranduri randuri, cheia primara = $id" ;
mysql_close();
?>
Dupa ce s-a facut conectarea la serverul MySQL si s-a reusit selectarea bazei de date, variabila "$sql" contine comanda SQL pentru introducerea unui nou rand in tabelul "carti", prin intermediul functiei mysql_query($sql) se introduce datele in baza de date, variabila "$nranduri" preia de la functia mysql_affected_rows() numarul de randuri afectate (aici introduse) iar variabila "$id" va avea (prin "mysql_insert_id()") valoarea cheii primare atribuite de MySQL.
Daca nu apare nici o eroare, rezultatul afisat de acest script este urmatorul:
Datele au fost adaugate in tabelul carti
Au fost adaugate 1 randuri, chea primara = 2

Functia mysql_insert_id() poate returna un rezultat incorect pentru coloanele MySQL de tipul BIGINT
[BIGINT este un tip de valoare care suporta numere cu 20 de cifre, folosit pentru campurile integer (spre deosebire de MEDIUMINT care suporta numere de la 0 la 16.777.215 (3 bytes) sau INT care suporta numerele de la 0 la 4.294.967.295 (4 bytes)].
Dupa efectuarea unei interogari INSERT, In locul functiei mysql_insert_id() se poate folosi functia LAST_INSERT_ID(), aceasta returneaza valoarea atribuita de MySQL unei coloane AUTO_INCREMENT, indiferent de tipul coloanei. Mai mult, apelurile ulterioare in script la functii MySQL nu afecteaza rezultatul returnat de LAST_INSERT_ID(), care este afectat numai de operatiile INSERT în care sunt implicate coloane AUTO_INCREMENT.
Totusi, spre deosebire de "mysql_insert_id()", LAST_INSERT_ID() necesita o interogare suplimentara la MySQL.
Iata un exemplu care prezinta modul de obtinere a valorii LAST INSERT ID():

<?php
$sql = "INSERT INTO `carti` (nume, autor, gen, data_intrare, pret) VALUE ('Carte3', 'Autor3', 'Gen3', '2008-9-16', 8.30)";
$insert = mysql_query($sql);
if (!$insert) {
    echo "<br /> Cmanda INSERT a esuat: ". mysql_errno(). " : ". mysql_error(). "<br />";
}
$interogare = "SELECT LAST_INSERT_ID() FROM `carti`";
$rezultat = mysql_query($interogare);
if (mysql_errno()) {
    echo "<br />". mysql_errno(). " : ". mysql_error(). "<br />";
}
$rand = mysql_fetch_row($rezultat);
echo "<br /> Ultimul ID repartizat: $rand[0]";
mysql_close();
?>
Dupa executarea acestui script, daca nu apare vreo eroare, rezultatul afisat va fi de genul:
Ultimul ID repartizat: 3
Functia last_insert_id() returneaza rezultatul corect numai dupa ce a fost efectuata o comanda INSERT.

Functia mysql_affected_rows() numara numai rândurile efectiv modificate de catre o interogare UPDATE. Rândurile în cazul carora vechea si noua valoare din coloana sunt identice nu se numara printre rândurile afectate.
De asemenea, o interogare DELETE care nu contine o clauza WHERE va determina functia mysql_affected_rows() sa returneze valoarea zero, indiferent de numarul rândurilor sterse din tabel.
O modalitate simpla de a determina daca stergerea tuturor rândurilor unui tabel a reusit consta în a emite o interogare care returneaza numarul rândurilor existente în tabel. De exemplu:
<?php
$sql = "SELECT COUNT(*) FROM `carti`";
$result = mysql_query($sql);
$nr = mysql_fetch_row($result);
echo $nr[0];
?>
Daca interogarea returneaza valoarea zero, demonstreaza stergerea tuturor rândurilor din tabel.

2. Prelucrarea rezultatelor interogarilor SELECT

Interogarile SELEC returneaza ca rezultate rânduri de tabel.
Rândurile unui tabel sunt incluse într-o structura de date numita "set de rezultate". Prelucrarea setului de rezultate returnat de o interogare SELECT implica parcurgerea rândurilor setului de rezultate.
O modalitate de parcurgere a rândurilor unui set de rezultate este prin utilizarea unei instructiuni "WHILE".

  • 1. Intai se verifica daca numarul de randuri returnat este 0 folosind functia mysql_num_rows(), transferându-i ca argument valoarea returnata de functia mysql_query()
  • 2. Daca numarul de randuri este 0 inseamna ca interogarea SELECT nu a returnat nici un rand din tabel,
  • 3. Daca numarul de randuri este diferit de 0, se executa o instructiune WHILE impreuna cu una din functiile:
    • mysql_fetch_assoc() (sau mysql_fetch_array() cu parametru "MYSQL_ASSOC").
              - sunt similare, adauga datele intr-o matrice asociativa unde pentru fiecare element avem chei cu numele coloanelor iar valoarile lor sunt datele din randul respectiv.
    • mysql_fetch_row().
              - adauga datele intr-o matrice asociativa unde pentru fiecare element avem chei cu numere consecutive (incepand de la 0) care reprezinta ordinea coloanelor iar valoarile lor sunt datele din randul respectiv
    • mysql_fetch_object().
              - aduce rezultatele randului sub forma de obiect cu perechile $rand->coloana
  • 4. Pentru a prelucra coloanele stocate în matrice, depinde de functia folosita.
          - pentru mysql_fetch_assoc() (sau mysql_fetch_array()) puteti folosi o sintaxa de genul $rand['coloana']
          - pentru mysql_fetch_row() puteti folosi o instructiune "foreach", prin care parcurgeti datele din fiecare element a matricei
          - pentru mysql_fetch_object() puteti folosi o sintaxa de genul $rand->'coloana'
- Aceste functii returneaza FALSE daca nu mai exista rânduri în setul de rezultate

Ca sa intelegeti mai bine, voi arata cate un exemplu cu fiecare in parte (voi folosi acelasi tabel, "carti"). Studiati-le cu atentie si exersati-le singuri.
Nu s-au mai introdus in aceste exemple instructiunile pentru conectarea la serverul MySQL si pentru selectarea bazei de date, le adaugati dumneavoastra.

De exemplu, daca doriti sa aflati toate datele din anumite coloane puteti folosi functia mysql_fetch_assoc() astfel:
<?php
$interogare = "SELECT `nume`, `autor` FROM `carti`";
$rezultat = mysql_query($interogare);
if (mysql_errno()) {
    echo "<br />". mysql_errno(). " : ". mysql_error(). "<br />";
}
if (mysql_num_rows($rezultat) == 0) {
    echo '0 rezultate';
}
else {
    while ($rand = mysql_fetch_assoc($rezultat)) {
        echo '<br />'. $rand['nume']. ' - '. $rand['autor'];

    }
}
?>
- Variabila "$rand" devine o matrice ale carei chei sunt numele coloanelor iar valorile lor sunt datele coloanelor respective din randul curent; instructiunea WHILE parcurge fiecare rand.

Iata acest exemplu, dar cu functia mysql_fetch_array(). In plus, in interogare SQL voi adauga numele coloanelor prin variabile, ca sa vedeti cum se lucreaza si cu variabile.
<?php
// Variabilele cu numele coloanelor
$col1 = 'nume';
$col2 = 'autor';

// Interogarea SQL folosind si variabile
$interogare = "SELECT `$col1`, `$col2` FROM `carti`";
$rezultat = mysql_query($interogare);
if (mysql_errno()) {
    echo "<br />". mysql_errno(). " : ". mysql_error(). "<br />";
}
if (mysql_num_rows($rezultat) == 0) {
    echo '0 rezultate';
}
else {
    while ($rand = mysql_fetch_array($rezultat, MYSQL_ASSOC)) {
        echo '<br />'. $rand['nume']. ' - '. $rand['autor'];

    }
}
?>

Cel de-al doilea argument al functiei mysql_fetch_array() este optional. Totusi, daca nu specificati MYSQL_ASSOC ca valoare a argumentului, PHP returneaza un tablou in care valoarea cheilor vor fi numerele si numele coloanelor.

- Comform datelor adaugate in tabelul "carti", aceste doua exemple vor afisa urmatorul rezultat
Glossa - Mihai Eminescu
Carte2 - Autor2
Carte3 - Autor3

Daca doriti sa afisati toate datele din fiecare coloana de pe fiecare rand al tabelului, puteti folosi functia mysql_fetch_row() astfel:
<?php
$interogare = "SELECT * FROM `carti`";
$rezultat = mysql_query($interogare);
if (mysql_errno()) {
    echo "<br />". mysql_errno(). " : ". mysql_error(). "<br />";
}
if (mysql_num_rows($rezultat) == 0) {
    echo '0 rezultate';
}
else {
    while ($rand = mysql_fetch_row($rezultat)) {
        foreach ($rand as $coloana) {
            echo "| $coloana |";
        }
        echo "<br />";
    }
}
?>
- Exemplul de mai sus v-a afisa urmatorul rezultat, in functie de datele din tabel:
| 1 || Glossa || Mihai Eminescu || poezie || 0000-00-00 || 8.00 |
| 2 || Carte2 || Autor2 || Educativ || 2008-09-16 || 11.00 |
| 3 || Carte3 || Autor3 || Gen3 || 2008-09-16 || 8.30 |
Daca doriti sa obtineti acces la valoarea unei anumite coloane, puteti face referire la elementul din tablou folosind o cheie a tabloului.
De exemplu, daca rezultatul functiei mysql_fetch_row() este stocat în variabila "$rand", puteti obtine acces la prima coloana folosind sintaxa "$rand[0]", la a doua coloana folosind sintaxa "$rand[1]" etc.

Iata un exemplu in care este utilizata functia mysql_fetch_object(), iar in interogarea SQL este adaugata si o conditie WHERE si o variabila "$nr".
<?php
$nr = 3;
$interogare = "SELECT `nume`, `autor` FROM `carti` WHERE `id`<'$nr'";
$rezultat = mysql_query($interogare);
if (mysql_errno()) {
    echo "<br />". mysql_errno(). " : ". mysql_error(). "<br />";
}
if (mysql_num_rows($rezultat) == 0) {
    echo '0 rezultate';
}
else {
    while ($rand = mysql_fetch_object($rezultat)) {
        echo '<br />'. $rand->nume. ' - '. $rand->autor;

    }
}
?>
- Testati singuri pentru a vedea rezultatul.

Precizare: - Comform sintaxei MySQL cu PHP, numele tabelelor si coloanelor se scriu intre caracterele ` ` (semnul din stanga tastei 1), desi functioneaza si fara, asa e corect, comform standardului, si e necesar in cazul numelor de tabele /coloane formate din mai multe cuvinte.
- Variabilele, cum e aici $nr se scriu intre ghilimele simple ' '