vineri, 8 aprilie 2011

PHP Lucrul cu baze de date MySQL, seturi de rezultate (Part 29)

Biblioteca de functii MySQL a limbajului PHP include functii care va permit sa obtineti informatii despre un set de rezultate, inclusiv:
Numarul coloanelor din setul de rezultate
Numele fiecarei coloane
Lungimea fiecarei coloane
Indicatorii MySQL asociati coloanei
Tipul MySQL al fiecarei coloane
Numele tabelului MySQL care contine coloana
1. Obtinerea numarului coloanelor dintr-un tabel MySQL
Pentru a obtine numarul coloanelor dintr-un set de rezultate, utilizati functia
mysql_num_fields()
Aceasta foloseste ca argument valoarea returnata de functia mysql_query().
Iata un exemplu in care functia mysql_num_fields() determina numarul coloanelor dintr-o interogare care selecteaza toate coloanele folosind specificatorul SQL pentru toate câmpurile "*", astfel puteti afla numarul de coloane dintr-un tabel:

<?php
$sql = "SELECT * FROM `nume_tabel`";
$rezultat = mysql_query($sql);
if (mysql_errno()) {
    echo "<br />". mysql_errno(). " : ". mysql_error(). "<br />";
}
$nr_campuri = mysql_num_fields($rezultat);
echo "<br /> Numar campuri: $nr_campuri";
mysql_close();
?>
2. Obtinerea numelui unei coloane

Pentru a obtine numele unei coloane dintr-un tabel MySQL, folositi functia

mysql_field_name()

Aceasta returneaza numele coloanei din setul de rezultate. Functia preia doua argumente: valoarea returnata de functia mysql_query() si indexul coloanei care va fi descrisa. Indexul asociat cu prima coloana este 0, indexul asociat celei de-a doua coloane este l etc.
Iata un exemplu care determina numele primei coloane dintr-un tabel MySQL:

<?php
$sql = "SELECT * FROM `nume_tabel`";
$rezultat = mysql_query($sql);
if (mysql_errno()) {
    echo "<br />". mysql_errno(). " : ". mysql_error(). "<br />";
}
$nume = mysql_field_name($rezultat, 0);
echo "<br /> Coloana 1 : $nume";
mysql_close();
?>

3. Obtinerea lungimii unei coloane
Pentru a obtine lungimea unei coloane dintr-un tabel MySQL, folositi functia
mysql_field_len()
Aceasta returneaza lungimea maxima a coloanei din setul de rezultate. Functia preia doua argumente: valoarea returnata de functia mysql_query() si indexul coloanei care va fi descrisa. Indexul asociat cu prima coloana este 0, indexul asociat celei de-a doua coloane este l etc.
Iata un exemplu care determina lungimea maxima a coloanei doi dintr-un tabel MySQL:

<?php
$sql = "SELECT * FROM `nume_tabel`";
$rezultat = mysql_query($sql);
if (mysql_errno()) {
    echo "<br />". mysql_errno(). " : ". mysql_error(). "<br />";
}
$lungime = mysql_field_len($rezultat, 1);
echo "<br /> Lungime Coloana 2 - $lungime";
mysql_close();
?>

4. Obtinerea indicatorilor MySQL asociati unei coloane

Pentru a obtine indicatorii SQL asociati unei coloane dintr-un tabel MySQL, folositi functia

mysql_field_flags()

Aceasta preia doua argumente: valoarea returnata de functia mysql_query() si indexul coloanei care va fi descrisa. Indexul asociat cu prima coloana este 0, indexul asociat celei de-a doua coloane este l etc.
Functia mysql_field_flags() raporteaza urmatorii indicatori:

AUTO_INCREMENT

BINARY
BLOB

ENUM

MULTIPLE_KEY

NOT_NULL

PRIMARY_KEY

TIMESTAMP

UNIQUE_KEY
UNSIGNED
ZEROFILL

- Daca la o coloana sunt asociati mai multi indicatori, fiecare indicator este separat de vecinii sai prin intermediul unui singur spatiu.
Iata un exemplu care determina indicatorii asociati primei coloane dintr-un tabel MySQL:
<?php
$sql = "SELECT * FROM `nume_tabel`";
$rezultat = mysql_query($sql);
if (mysql_errno()) {
    echo "<br />". mysql_errno(). " : ". mysql_error(). "<br />";
}
$indicatori = mysql_field_flags($rezultat, 0);
echo "<br /> Indicatorii Coloanei 1 : $indicatori";
mysql_close();
?>

5. Obtinerea tipului MySQL al unei coloane

Pentru a obtine tipul MySQL al unei coloane dintr-un tabel MySQL, folositi functia

mysql_field_type()

Aceasta preia doua argumente: valoarea returnata de functia mysql_query() si indexul coloanei care va fi descrisa. Indexul asociat cu prima coloana este 0, indexul asociat celei de-a doua coloane este l etc.
Principalele tipuri MySQL returnate de functia mysql_field_type() sunt prezentate in
Lectia 22 , in tabelul "Principalele tipuri de date din MySQL".
Iata un exemplu care determina tipul primei coloane dintr-un tabel MySQL:

<?php
$sql = "SELECT * FROM `nume_tabel`";
$rezultat = mysql_query($sql);
if (mysql_errno()) {
    echo "<br />". mysql_errno(). " : ". mysql_error(). "<br />";
}
$tip = mysql_field_type($rezultat, 0);
echo "<br /> Tip Coloana 1 : $tip";
mysql_close();
?>

6. Determinarea tabelului MySQL asociat unei coloane

Pentru a determina tabelul MySQL (daca exista) asociat unei anumite coloane, folositi functia

mysql_field_table()

Aceasta preia doua argumente: valoarea returnata de functia mysql_query() si indexul coloanei care va fi descrisa. Indexul asociat cu prima coloana este 0, indexul asociat celei de-a doua coloane este l etc.
În cazul în care coloana contine o valoare calculata sau daca respectiva coloana nu este asociata în alt mod cu un tabel MySQL, functia returneaza un sir vid.
Iata un exemplu care determina tabelul asociat primei coloane din setul de rezutate:

<?php
$sql = "SELECT * FROM `nume_tabel`";
$rezultat = mysql_query($sql);
if (mysql_errno()) {
    echo "<br />". mysql_errno(). " : ". mysql_error(). "<br />";
}
$tabel = mysql_field_table($rezultat, 0);
echo "<br /> Nume tabel : $tabel";
mysql_close();
?>

7. Obtinerea structurii complete a setului de rezultate

Daca doriti obtinerea mai multor caracteristici ale setului de rezultate, o functie utila poate fi:

mysql_fetch_field()

Aceasta functie returneaza un obiect ale carui proprietati contin o varietate de informatii cu privire la coloana unui tabel MySQL. Proprietatile sunt urmatoarele:
blob - are valoarea 1 în cazul în care coloana este de tip BLOB

max_length - lungimea maxima a coloanei;

multiple_key - are valoarea 1 în cazul în care coloana este o cheie non-unica

name - numele coloanei

not_null - are valoarea 1 în cazul în care coloana nu poate contine valoarea NULL

numeric - are valoarea 1 în cazul în care coloana este numerica
primary_key - are valoarea 1 în cazul în care coloana este o cheie primara

table - numele tabelului MySQL caruia îi apartine coloana

type - tipul MySQL al coloanei

unique_key - are valoarea 1 în cazul în care coloana este o cheie unica

unsigned - are valoarea 1 în cazul în care coloana este de tip UNSIGNED

zerofill - are valoarea 1 în cazul în care coloana este completata cu zerouri

functia mysql_fetch_field() preia doua argumente: valoarea returnata de functia mysql_query() si indexul coloanei care va fi descrisa. Indexul asociat primei coloane este 0, indexul asociat celei de-a doua coloane este l etc.
Iata un exemplu care prezinta modul de obtinere si descriere a structurii complete a setului de rezultate pentru prima coloana dintr-un tabel MySQL:

<?php
$sql = "SELECT * FROM `nume_tabel`";
$rezultat = mysql_query($sql);
if (mysql_errno()) {
    echo "<br />". mysql_errno(). " : ". mysql_error(). "<br />";
}
$info = mysql_fetch_field($rezultat, 0);
echo "<br /> Coloana 1: ";
echo "<PRE>
blob: $info->blob
max_length: $info->max_length
multiple_key: $info->multiple_key
name: $info->name
not_null: $info->not_null
numeric: $info->numeric
primary_key: $info->primary_key
table: $info->table
type: $info->type
unique_key: $info->unique_key
unsigned: $info->unsigned
zerofill: $info->zerofill
</PRE>";
mysql_close();
?>

Pentru a obtine aceste proprietati pentru toate coloanele din tabel, folositi o instructiune "for", dupa exemplul de mai jos, care parcurge fiecare coloana, folosind ca limita a numarului de coloane valoarea returnata de functia mysql_num_fields()

<?php
$sql = "SELECT * FROM `nume_tabel`";
$rezultat = mysql_query($sql);
if (mysql_errno()) {
    echo "<br />". mysql_errno(). " : ". mysql_error(). "<br />";
}
$nr_campuri = mysql_num_fields($rezultat);
for ($i=0; $i<$nr_campuri; $i++) {
    echo "<br /> Coloana $i: ";
    $info = mysql_fetch_field($rezultat);
    if ($info) {
        echo "<PRE>
        blob: $info->blob
        max_length: $info->max_length
        multiple_key: $info->multiple_key
        name: $info->name
        not_null: $info->not_null
        numeric: $info->numeric
        primary_key: $info->primary_key
        table: $info->table
        type: $info->type
        unique_key: $info->unique_key
        unsigned: $info->unsigned
        zerofill: $info->zerofill
        </PRE>";
    }
    else {
        echo "Necunoscut";
    }
}
mysql_close();
?>

8. Accesul non-secvential la coloanele unui set de rezultate

Functiile mysql_fetch_row() si mysql_fetch_array() returneaza, în general, rândurile dintr-un set de rezultate în mod secvential, incepand de la primul rand al tabelului. Totusi, functia mysql_data_seek() permite obtinerea accesului la rândurile unui set de rezultate într-o maniera non-secventiala, . Functia are forma:

mysql_data_seek(rezultat, numar_rand)

Unde "rezultat" este valoarea returnata de functia mysql_query(), iar "numar_rand" este indexul rândului la care doriti sa obtineti accesul. Primul rând al tabelului este numerotat cu 0, al doilea cu 1 etc.
Functia returneaza TRUE daca executia reuseste, respectiv FALSE în caz contrar.
Apoi, o invocare ulterioara a functiei mysql_fetch_row() sau a functiei mysql_fetch_array() va returna rândul din pozitia specificata in functia mysql_data_seek().
Studiati urmatorul exemplu, care obtine accesul la al treilea rând al setului de rezultate returnat de o interogare anterioara:

<?php
$sql = "SELECT * FROM `nume_tabel`";
$rezultat = mysql_query($sql);
if (mysql_errno()) {
    echo "<br />". mysql_errno(). " : ". mysql_error(). "<br />";
}
if (!mysql_data_seek($rezultat, 2)) {
    echo "<br />". mysql_errno(). " : ". mysql_error(). "<br />";
}
else {
    $rand = mysql_fetch_array($rezultat, MYSQL_ASSOC);
    foreach ($rand as $coloana) {
        echo "| $coloana |";
    }
}
mysql_close();
?>

- Acest exemplu afiseaza datele din randul trei pentru fiecare coloana a tabelului MySQL.