PHP MySQL – Introducere si Tipuri de Date 11

MySQL este cea mai populara aplicatie open-source de baze de date folosita cu PHP.
O baza de date de obicei contine una sau mai multe tabele, folosita pentru a stoca informatii pe categori.
Tabelele contin coloane si inregistrari (randuri) cu date.
Mai jos este un exemplu de tabel folosit pentru a stoca informatiile utilizatorului (nume, email, parola):

idnamepasswordemail
1Mariusfaithname@domain.net
2CursPHPpeaceuser@domain.com
3I_AMloveaddress@domain.net

– Aceasta tabela contine trei inregistrari /randuri (unu pentru fiecare persoana/utilizator) si patru coloane (id, name, password, email)

Reguli de sintaxa MySQL

Fiecare baza de date si fiecare tabela este indentificata printr-un nume. Regulile de baza MySQL pentru nume de baze de date, tabele, si coloane sunt:

  • Numele poate avea maxim 64 de caractere.
  • Poate contine numai litere, numere, si sublinia (indicat fara spatii).
  • Numele poate incepe cu un numar, dar nu poate contine numai numere.
  • O tabela nu poate avea doua coloane cu acelasi nume si o baza de date nu poate avea doua tabele cu acelasi nume.
  • Numele tabelelor si coloanelor sunt case-sensitive („Php” e diferit de „php”).

Tipuri de date MySQL

Cand se creaza un tabel in MySQL, trebuie definit tipul de date pe care fiecare coloana il va contine. Exista trei tipuri principale: Text (strings), Numere, Data si Ora; si doua tipuri secundare: Liste predefinite si Date binare.
Tipul de date dicteaza ce informatie poate fi stocata si cum, acesta influenteaza si performanta generala a bazei de date.
Tabelul de mai jos listeaza tipurile de date folosite pentru MySQL, cu o scurta descriere si cat spatiu ocupa.

TipMarimeDescriere
Stocare textDiferenta dintre „Tipurile de date pentru text” consta in numarul maxim de caractere ce poate fi stocat intr-un camp individual, modul de tratare a spatiilor, si daca se poate seta o valoare initiala.
CHAR(lungime)lungime bytesUn camp cu lungime fixa de la 0 la 255 de caractere. Accepta o valoare initiala.
VARCHAR(lungime)lungime + 1 or 2 bytesCamp cu lungime variabila de la 0 la 65,535 caractere. Accepta o valoare initiala.
TINYTEXTlungime + 1 bytesUn sir cu lungime maxima de 255 characters
TEXTlungime + 2 bytesUn sir cu o lungime maxima de 65,535 caractere. Nu poate defini o valoare initiala.
MEDIUMTEXTlungime + 3 bytesUn sir cu o lungime maxima de 16,777,215 caractere
LONGTEXTlungime + 4 bytesUn sir cu o lungime maxima de 4,294,967,295 caractere
Stocare numereAceste tipuri de date reprezinta numere in diferite forme.
TINYINT(lungime)1 byteInterval de la –128 la 127. Sau de la 0 la 255 unsigned
SMALLINT(lungime)2 bytesInterval de la –32,768 la 32,767. Sau de la 0 la 65,535 unsigned
MEDIUMINT(lungime)3 bytesInterval de la –8,388,608 la 8,388,607. Sau de la 0 la 16,777,215 unsigned
INT(lungime)4 bytesInterval de la –2,147,483,648 la 2,147,483,647. Daca coloana este declarata UNSIGNED, intervalul este de la 0 la 4,294,967,295
BIGINT(lungime)8 bytesInterval de la –9,223,372,036,854,775,808 la 9,223,372,036,854,775,807. Sau de la 0 la 18,446,744,073,709,551,615 unsigned
FLOAT(lungime, decimals)4 bytesNumar mic cu virgula (cu zecimale). Deoarece PHP va formata numerele in functie de calcule, se recomanda sa folosesti FLOAT fara parametri optionali.
DOUBLE(lungime, decimals)8 bytesNumar mare cu zecimale
DECIMAL(lungime, decimals)lungime + 1 or 2 bytesUn tip DOUBLE care permite un numar fix de zecimale. Inainte de MySQL 5.0.3, tipul de date DECIMAL a fost stocat ca un sir, ca sa nu poata fi folosit cu functii SQL, cum ar fi SUM()
Stocare data si timpMySQL stocheaza data intr-un singur format: YYYY-MM-DD
DATE3 bytesO data stocata ca YYYY-MM-DD. Intervalul este de la 1000-01-01 la 9999-12-31
DATETIME8 bytesData si ora, afisat in format YYYY-MM-DD HH:MM:SS
TIMESTAMP4 bytesUn timestamp (de obicei generat automat de calculator). Poate contine valori ce reprezinta date de la inceputul lui 1970 pana in Januarie 2038. Coloanele TIMESTAMP sunt afisate in acelasi format ca si coloana DATETIME.
TIME3 bytesOra in format HH:MM:SS
Stocare liste predefiteMySQL te lasa sa stochezi doua tipuri de liste predefinite (pot fi vazute ca echivalente pentru radio butonul si caseta de verificare).
ENUM1 or 2 bytesAcest tip de coloana stocheaza o singura alegere din lista predefinita, fiecare coloana poate avea una din mai multe valori posibile
SET1, 2, 3, 4, or 8 bytesAceast tip de coloana stocheaza zero sau mai multe inregistrari din lista predefinita. Ca si ENUM, cu exceptia ca fiecare coloana poate avea mai mult de o valoare din mai multe valori posibile, sau mai multe inregistrari dintr-o lista predefinita. Lista poate contine cel mult 64 de inregistrari.
Storing binary dataStocheaza date binare, ca imaginile.
TINYBLOB Pana la 255 bytes
BLOB Pana la 64kB
MEDIUMBLOB Pana la 16MB
LONGBLOB Pana la 4GB


– Parametri (lungime, decimal) sunt optionali, dar pentru motive de performanta, ar trebui specificati pentru a restrictiona cata informatie sa fie stocata in oricare din coloane. Bazele de date sunt de obicei mai rapide cand lucreaza cu coloane care au marimea fixata.
– Foloseste VARCHAR pentru elemente de text scurte si TEXT pentru cele mai lungi.
– Foloseste DECIMAL pentru a stoca valori pt. bani.
– Pentru data si ora, este indicat sa folositi TIMESTAMP daca doriti sa inregistrati in acel camp un punct fix in timp (de exemplu data cand o inregistrare a fost introdusa in baza de date). Folositi DATETIME daca data/ora pot fi setate si schimbate arbitrar.
La tipul TIMESTAMP data si ora este setata automat cu timpul curent cand se face INSERT sau UPDATE, daca nu se specifica o valoare pentru acel camp.
– Nu este o buna idee sa folosesti date binare. Solicita prea mult baza de date, si nu se pot afisa imagini direct din baza de date.

Aceasta lectie e doar pentru o scurta introducere, si puteti reveni ca sa verificati tipul de date care doriti sa fie folosit.
In tutorialul urmator puteti invata cum sa va conectati la serverul MySQL cu PHP, sa creati o baza de date si tabele, utilizand interfata MySQLi (MySQL Improved).

PHP MySQL – utilizare MySQLi

PHP are trei moduri diferite prin care se poate conecta si interactiona cu baza de date MySQL : extensia MySQL originala (cu functii), MySQL Improved (MySQLi, obiect-orientat), sau PHP Data Objects (PDO, obiect-orientat).
Ele nu pot fi amestecate in acelasi script. Extensia originala MySQL nu mai este activ dezvoltata si nu este recomandat pentru proiecte PHP-MySQL noi.
Documentatia PHP descrie MySQLi ca fiind optiunea preferata recomandata de MySQL pentru proiecte noi.

Conectare la MySQL

Inainte de a putea accesa informatii din baza de date , trebuie creata o conexiune cu serverul MySQL.
Pentru a va conecta la un server MySQL cu PHP si MySQLi, se creaza o instanta de obiect mysqli, cu formula new mysqli(), la care se adauga datele de conectare.
  – Sintaxa:

$conn = new mysqli($servername, $username, $password, $database, $port);

$servername – Specifica serverul la care sa se conecteze. Daca adaugati valoarea NULL sau un sir gol „”, serverul va folosi valoarea standard: „localhost„.
$username – Specifica numele de utilizator la baza de date MySQL.
$password – Specifica parola utilizatorului pentru conectare.
$database – Optional. Numele bazei de date care contine tabelele.
$port – Optional. Specifica port-ul prin care se face conectarea la serverul MySQL, standard este 3306
  – Exemplu:

<?php
// conectare la server
$conn = new mysqli('localhost', 'root', 'pass', 'dbname');
// verifica conexiunea
if (mysqli_connect_errno()) {
  exit('Connect failed: '. mysqli_connect_error());
}
?>

– Aceast cod face conectarea la baza de date numita „dbname”, si stocheaza conexiunea in instanta de obiect $conn.
Daca exista erori la conexiune, mysqli_connect_errno() returneaza codul de eroare.

Inchiderea unei conexiuni

Conexiunea va fi inchisa automat cand scriptul se termina. Se recomanda totusi sa inchideti conexiunea mai devreme, cand scriptul nu o mai foloseste. Acest lucru va elibera memoria folosita de conexiune. Pentru a inchide o conexiune se foloseste metoda close() din clasa MySQLi.
  – Exemplu:

<?php
// conectare la server
$conn = new mysqli('localhost', 'root', 'pass', 'dbname');
// verifica conexiunea
if (mysqli_connect_errno()) {
  exit('Connect failed: '. mysqli_connect_error());
}
// ceva cod
$conn->close();         // termina conectarea
// alt cod PHP 
?>

Creare baza de date cu MySQLi

Pentru a stoca informatii in MySQL, este nevoie de o baza de date.
Comanda CREATE DATABASE este folosita pentru a crea o baza de date in MySQL.
  – Sintaxa:

CREATE DATABASE database_name

Pentru a face un script PHP sa execute instructiunile SQL, mai intai trebuie sa creati o instanta de obiect mysqli, care va contine conexiunea la server, apoi folositi metoda query() din clasa MySQLi.
  – Sintaxa:

mysqliObj->query($sql_query)

mysqliObj – este instanta de obiect mysqli, creata cu new mysqli()
$sql_query – este un sir cu instructiuni SQL.
Aceasta metoda trimite interogarea sau comanda la serverul MySQL, va returna obiectul rezultat, sau TRUE la succes, FALSE in caz de eroare.

Exemplul urmator creaza o baza de date numita „tests„:

<?php
// conectare la serverul MySQL
$conn = new mysqli('localhost', 'root', 'pass');
// verifica conexiunea
if (mysqli_connect_errno()) {
  exit('Conectare nereusita: '. mysqli_connect_error());
}
// interogare sql cu CREATE DATABASE
$sql = "CREATE DATABASE `tests` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci";
// executa interogarea $sql pe server pentru a crea baza de date
if ($conn->query($sql) === TRUE) {
  echo 'Baza de date "tests" a fost creata';
}
else {
 echo 'Error: '. $conn->error;
}
$conn->close();
?>

– Cand doriti sa creati o noua baza de date, se adauga doar primele trei argumente la obiectul mysqli (servername, username si password). Dar daca vreti sa folosesti un port specific, adaugati un sir gol „” pentru argumentul ce reprezinta numele bazei de date :
                  Exemplu:   new mysqli(‘localhost’, ‘root’, ‘pass’, ”, port)

– Instructiunea suplimentara: DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci seteaza baza de date sa foloseasca UTF-8 charset pentru codarea caracterelor.
Exemplul de mai sus creaza o baza de date numita „test”, afisaza „Baza de date „tests” a fost creata„, sau un mesaj de eroare in caz de esec.
$conn->error (sau poate fi folosit mysqli_error($conn) ) returneaza un sir cu o descriere a ultimei erori(daca exista).

Comenzile SQL sunt case-insensitive, astfel puteti folosi „CREATE DATABASE” sau „create database”. Dar numele tabelelor si coloanelor sunt case-sensitive.

Creare tabel in MySQL

Dupa ce ati realizat o conexiune la o baza de date, puteti crea tabele in ea. Tabelele sunt elementele care stocheaza datele in baza de date.
Pentru a crea un tabel in MySQL, se foloseste comanda CREATE TABLE, apoi se apeleaza metoda query().
  – Sintaxa:

CREATE TABLE `table_name`
(
`nume_coloana1` tip_date,
`nume_coloana2` tip_date,
`nume_coloana3` tip_date,
....
)

tip_date specifica tipul de date pe care o coloana le poate contine. Pentru o lista cu tipurile de date MySQL, vedeti lectia precedenta: PHP MySQL – Introducere si Tipuri de date.
Dupa „tip_date”, se pot specifica si alte atribute optionale pentru fiecare coloana:

  • NOT NULL – Fiecare rand trebuie sa contina o valoare in acea coloana, valorile null nu sunt permise.
  • DEFAULT value – Seteaza o valoare initiala care este adaugata cand nici o alta valoare nu este transferata
  • UNSIGNED – Poate fi folosit pentru numere, seteaza sa fie folosite doar numere pozitive si zero.
  • AUTO INCREMENT – MySQL va mari automat valoarea din randul urmator cu 1 de fiecare data cand o noua inregistrare este adaugata.
  • PRIMARY KEY – Este folosit pentru a identifica unic randurile dintr-un tabel. Coloana cu setarea PRIMARY KEY este de obicei un ID numeric, si in general folosita cu AUTO_INCREMENT

Fiecare tabel ar trebui sa aiba o coloana primary key. Valoarea ei trebuie sa fie unica pentru fiecare inregistrare din tabel.

  – Exemplu:

<?php
// conectare la serverul MySQL 
$conn = new mysqli('localhost', 'root', 'pass', 'tests');
// verifica conexiunea
if (mysqli_connect_errno()) {
  exit('Connect failed: '. mysqli_connect_error());
}
// interogare sql pentru CREATE TABLE
$sql = "CREATE TABLE `users` (
 `id` INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
 `name` VARCHAR(25) NOT NULL,
 `pass` VARCHAR(18) NOT NULL,
 `email` VARCHAR(45),
 `reg_date` TIMESTAMP
 ) CHARACTER SET utf8 COLLATE utf8_general_ci"; 
// Executa interogarea $sql query pe server pentru a crea tabelul
if ($conn->query($sql) === TRUE) {
  echo 'Table "users" successfully created';
}
else {
 echo 'Error: '. $conn->error;
}
$conn->close();
?>

– Acest cod va crea un tabel numic „users” in baza de date „tests”, cu cinci coloane (id , name , pass , email si reg_date), seteaza coloana ‘id’ ca campul primary key.
In imaginea de mai jos puteti vedea descrierea tabelului „users”.

Creare tabel users cu MySQLi

In comenzile SQL este recomandat ca numele de tabel si coloane sa fie adaugat intre apostrof ` ` (caracterul de langa butonul cu numerul 1 pe tastatura). Aceasta este sintaxa corecta dar nu este strict necesara.

PHP MySQL – INSERT INTO

Dupa ce o baza de date si tabelele ei au fost create, puteti sa adaugati informatii in ele.
Cateva reguli de sintaxa:

  • In PHP, interogarea SQL trebuie sa fie scrisa intre ghilimele.
  • Valorile de tip String (sir), din interogarea SQL, trebuie sa fie intotdeauna intre ghilimele.
  • Valorile numerice si NULL nu trebuie adaugate intre ghilimele.

Introducere date in tabel MySQL

Pentru a adauga inregistrari noi intr-un tabel MySQL, se foloseste comanda INSERT INTO.
Exista doua metode prin care o interogare INSERT poate fi scrisa:
1) Prima metoda nu specifica numele coloanelor unde datele for fi introduse, ci doar valorile lor.
  – Sintaxa:

INSERT INTO nume_tabel
VALUES (valoare1, valoare2, valoare3, ...)

In aceasta metoda, trebuie sa specificati o valoare pentru fiecare coloana, chiar daca este NULL. Daca sunt cinci coloane in tabel, trebuie sa adaugati cinci valori, separate prin virgula.

2) Pentru a doua metoda se specifica atat numele coloanei /coloanelor cat si valorile care vor fi intoduse:
  – Sintaxa:

INSERT INTO nume_tabel (coloana1, coloana2, coloana3,...)
VALUES (valoare1, valoare2, valoare3,...)

Aceasta este in general metoda preferata, deoarece puteti adauga doar coloanele care vor primi valori. Orice coloana caruia nu ii este atribuita o valoare va fi tratata ca NULL (sau ii va fi data valoarea default, daca aceasta este definita).
Daca o coloana nu poate avea valoarea NULL (a fost definita ca NOT NULL) si nu are o valoare default, nespecificand o valoare va genera eroare.
Daca o coloana este AUTO_INCREMENT sau TIMESTAMP, nu este nevoie sa fie specificata in interogarea SQL, serverul MySQL va seta si adauga valoarea automat.
Pentru ca PHP sa execute comenzile SQL, trebuie sa folosesti metoda mysqli query() .

– Urmatorul exemplu adauga o noua inregistrare in tabelul „users” . Acest exemplu foloseste tabelul „users” creat in lectia anterioara, cu cinci coloane (id , name , pass , email si reg_date).
Campul „id” este AUTO_INCREMENT, deci nu trebuie specificat in interogarea SQL, serverul MySQL va adauga automat valoare pentru el. La fel si pentru „reg_date„, care este setat TIMESTAMP.

<?php
// conectare la baza de date "tests" 
$conn = new mysqli('localhost', 'root', 'pass', 'tests');
// verifica conexiunea
if (mysqli_connect_errno()) {
  exit('Connect failed: '. mysqli_connect_error());
}
// interogare sql pentru users INSERT INTO 
$sql = "INSERT INTO `users` (`name`, `pass`, `email`)
VALUES ('Marius', 'faith', 'name@domain.net')"; 
// Trimite interogarea $sql la MySQL pentru a introduce valorile
if ($conn->query($sql) === TRUE) {
  echo 'Datele au fost adaugate';
}
else {
 echo 'Error: '. $conn->error;
}
$conn->close();
?>

– Mai intai se creaza instanta de obiect mysql cu identificatorul de variabila $conn. Apoi, se defineste sirul cu instructiunea SQL, salvat intr-o variabila numita $sql. Apoi se apeleaza metoda query() , si in acelasi timp se verifica valoarea returnata pentru a determina daca datele au fost adaugate.
Exemplul de mai sus adauga un rand in tabelul „users”, cu valoarea „Marius” in coloana „name”, valoarea „faith” in campul „pass”, si „name@domain.net” pentru „email”. Valorile pentru celelalte coloane („id” si „reg_date”) sunt adaugate automat de serverul MySQL.

MySQL permite INSERT cu mai multor randuri in acelasi timp, separate prin virgula.
  – Sintaxa:

INSERT INTO nume_tabel (coloana1, coloana2, coloana3,...)
VALUES (valoareA1, valoareA2, valoareA3,...),
(valoareB1, valoareB2, valoareB3,...),
(valoareC1, valoareC2, valoareC3,...)


Exemplu urmator adauga doua noi randuri in tabelul „users”, cu o singura interogare.

<?php
// conectare la baza de date "tests" 
$conn = new mysqli('localhost', 'root', '', 'tests');
// verifica conexiunea
if (mysqli_connect_errno()) {
  exit('Connect failed: '. mysqli_connect_error());
}
// interogare sql pentru users, INSERT INTO (doua randuri)
$sql = "INSERT INTO `users` (`name`, `pass`, `email`)
 VALUES ('CursPHP', 'peace', 'user@domain.net'),
 ('I_AM', 'love', 'address@domain.net')"; 
// Trimite interogarea $sql la MySQL pentru a introduce valorile
if ($conn->query($sql) === TRUE) {
  echo 'Datele au fost adaugate';
}
else {
 echo 'Error: '. $conn->error;
}
$conn->close();
?>

Obtinere ID, auto generat de INSERT

Daca aveti un tabel cu o coloana AUTO_INCREMENT care stocheaza un id numeric, puteti folosi metoda insert_id() a obiectului mysqli pentru a prelua ID-ul generat in ultima operatiune INSERT.
  – Exemplu:

<?php
// conecteaza la baza de date "tests"
$conn = new mysqli('localhost', 'root', 'pass', 'tests');
// verifica conexiunea
if (mysqli_connect_errno()) {
  exit('Connect failed: '. mysqli_connect_error());
}
// interogare sql pentru users, INSERT INTO 
$sql = "INSERT INTO `users` (`name`, `pass`, `email`)
 VALUES ('PHPCurs ', 'love_light', 'a_name@domain.net')"; 
// Executa interogarea $sql pentru a prelua ID auto-generat
if ($conn->query($sql) === TRUE) {
  echo 'ID-ul este: '. $conn->insert_id;
}
else {
 echo 'Error: '. $conn->error;
}
$conn->close();
?>

Returneaza:

ID-ul este 4

Daca tabelul nu are o coloana cu atributul AUTO_INCREMENT sau daca interogarea nu este o comanda INSERT sau UPDATE, insert_id() va returna zero.

Adaugare date din formular in baza de date

Formularele HTML sunt de obicei folosite pentru a trimite date la un script pe server. Aceste date pot fi adaugate si intr-o baza de date.
Pentru a introduce date dintr-un formular intr-o baza de date MySQL, trebuie creat un formular HTML si un script PHP care receptioneaza date din formular.

Exemplu de formular HTML si un script PHP care poate fi folosit pentru a adauga valorile din formular in tabelul „users”.

Formularul HTML

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
 <title>Formular HTML pentru insert users</title>
</head>
<body>
<form action="insert.php" method="post">
 Name: <input type="text" name="name" /><br />
 Password: <input type="text" name="pass" /><br />
 E-mail: <input type="text" name="email" /><br />
 <input type="submit" valoare="Trimite" />
</form>
</body>
</html>

Cand un utilizator apasa pe butonul „Trimite”, datele din formular sunt trimise la scriptul din fisierul „insert.php”.
Fisierul „insert.php”:
  – preia valorile din formular cu variabila $_POST,
  – filtreaza aceste valori cu functii strip_tags() si trim() (pentru a sterge posibile tag-uri si spatii goale de la inceput si sfarsit),
  – foloseste un tipar RegExp si functia preg_match() pentru a verifica daca valoarea de la „email” e o adresa de email corecta,
  – daca toate datele sunt corecte, se face conectarea la o baza de date (cu instanta mysqli), stocheaza valorile intr-un Array asociativ ($adds), si le filtreaza cu metoda mysqli_real_escape_string(),
  – seteaza comanda INSERT INTO , apoi, metoda query() trimite interogarea SQL la serverul MySQL si o noua inregistrare va fi adaugata in tabelul „users”.

Cod PHP in pagina „insert.php”

<?php
$erors = array();                      // seteaza un array gol care va contine erorile
$regexp_mail = '/^([a-zA-Z0-9]+[a-zA-Z0-9._%-]*@([a-zA-Z0-9-]+\.)+[a-zA-Z]{2,4})$/';         // RegExp pt adresa de e-mail 
// Verifica daca sunt primite date din formular
if (isset($_POST['name']) && isset($_POST['pass']) && isset($_POST['email'])) {
  // sterge tag-urile si spatiile goale de la inceputul si sfarsitul valorilor
  $_POST = array_map("strip_tags", $_POST);
  $_POST = array_map("trim", $_POST);
  // verifica daca toate campurile din formular sunt completate corect
  // (adresa de email si numarul minim de caractere din "name" si "pass")
  if (!preg_match($regexp_mail, $_POST['email'])) $erors[] = 'Adresa de e-mail incorecta';
  if (strlen($_POST['name'])<3) $erors[] = 'Numele trebuie sa contina minim 3 caracte';
  if (strlen($_POST['pass'])<6) $erors[] = 'Parola trebuie sa contina minim 6 caracte';
  // daca nu sunt erori ($error array gol)
  if(count($erors)<1) {
    // conecteaza la baza de date "tests"
    $conn = new mysqli('localhost', 'root', '', 'tests');
    // verifica conexiunea
    if (mysqli_connect_errno()) {
      exit('Connect failed: '. mysqli_connect_error());
    }
    // stocheaza valorile intr-un Array, filtrand caracterele speciale pt. a fi folosite in comanda SQL
    $adds['name'] = $conn->real_escape_string($_POST['name']);
    $adds['pass'] = $conn->real_escape_string($_POST['pass']);
    $adds['email'] = $conn->real_escape_string($_POST['email']);
    // interogarea SQL pentru userr, INSERT INTO
    $sql = "INSERT INTO `users` (`name`, `pass`, `email`) VALUES ('". $adds['name']. "', '". $adds['pass']. "', '". $adds['email']. "')"; 
    // Trimite interogarea $sql la MySQL pentru a introduce valorile
    if ($conn->query($sql) === TRUE) {
      echo 'Datele au fost adaugate';
    }
    else {
      echo 'Error: '. $conn->error;
    }
    $conn->close();
  }
  else {
    // altfel, daca au aparut erori erori, le adauga intr-un sir si le printeaza
    echo implode('<br />', $erors);
  }
}
else {
  echo 'Nu sunt date de la formular';
}
?>

PHP MySQL – SELECT, ORDER BY

Cand baza de date are cateva inregistrari in ea, puteti prelua informatia stocata, folosind comanda SELECT.
O interogare SELECT returneaza randuri selectate de la unul sau mai multe tabele.

  – Sintaxa:

SELECT nume_coloana/e FROM nume_tabel

– „nume_coloana/e” – este numele coloanei sau coloanelor care vor fi selectate.

Pentru a selecta mai multe coloane, adaugatile separate prin virgula:
                SELECT coloana1, coloana2, coloana3 FROM nume_tabel

Pentru a selecta toate coloanele, punti un asterisc (*):
                SELECT * FROM nume_tabel

Ca sa fie trimisa comanda SQL la baza de date MySQL si pentru a prelua datele selectate, se foloseste metoda query() a obiectului mysqli.
Cand este folosita cu interogari SELECT, aceasta metoda returneaza un obiect care contine randurile de date, sau False in caz de eroare.
Pentru a parcurge datele returnate si sa obtineti cate un rand din ele, puteti folosi metoda fetch_assoc.
Metoda fetch_assoc() returneaza un array asociativ ce contine randurile preluate, cheile din array reprezinta numele coloanelor.
Cu o bucla while() puteti prelua informatiile din fiecare rand stocat in acel array.
Pentru a afla numarul de randuri returnat de o interogare SELECT, se foloseste proprietatea num_rows, aplicata la obiectul rezultat.

  – Urmatorul exemplu selecteza si afiseaza datele stocate in coloanele „id”, „name” si”pass” din tabelul „users”.

<?php
// conecteaza la baza de date "tests" 
$conn = new mysqli('localhost', 'root', 'pass', 'tests');
// verifica conexiunea
if (mysqli_connect_errno()) {
  exit('Connect failed: '. mysqli_connect_error());
}
// interogare sql SELECT 
$sql = "SELECT `id`, `name`, `pass` FROM `users`"; 
// executa interogarea si retine datele returnate
$result = $conn->query($sql);
// daca $result contine cel putin un rand
if ($result->num_rows > 0) {
  // afiseaza datele din fiecare rand din $result
  while($row = $result->fetch_assoc()) {
    echo '<br /> id: '. $row['id']. ' - name: '. $row['name']. ' - pass: '. $row['pass'];
  }
}
else {
  echo '0 rezultate';
}
$conn->close();
?>

– Acest exemplu stocheaza datele (obiectul rezultat) returnate de metoda query() in variabila $result , foloseste proprietatea „num_rows” sa verifice daca $result contine cel putin un rand. Apoi, cu bucla while() trece prin toate inregistrarie din obiecul rezultat, folosind metoda „fetch_assoc()” pentru a retine datele din fiecare rand intr-un Array in variabila $row.
Fiecare apelare a fetch_assoc() returneaza urmatorul rand in setul de rezultate, pana cand nu mai sunt, si returneaza False.
Pentru a accesa valorile din fiecare rand, se foloseste variabila PHP $row si cheia cu numele coloanei ($row[‘id’], …).
Codul de mai sus va afisa:

id: 1 – name: Marius – pass: faith
id: 2 – name: CursPHP – pass: peace
id: 3 – name: I_AM – pass: love
id: 4 – name: PHPCurs – pass: love_light

Asterisc (*) poate fi folosit pentru a selecta toate coloanele: „SELECT * FROM nume_tabel”, dar este mai bine sa specificati doar coloanele care vreti sa fie selectate, deoarece procesul de selectare poate fi mai rapid.

Optiunea LIMIT

Cu optiunea LIMIT puteti sa determinati numarul de inregistrari pe care MySQL le va returna:
  – Sintaxa:

SELECT nume_coloana/e FROM nume_tabel LIMIT skip_nr, ret_nr

skip_nr” este optional, ii spune bazei de date cate randuri sa sara din rezultate.
ret_nr” seteaza numarul maxim de inregistrari ce vor fi returnate.
  – Exemplu:

<?php
// conecteaza la baza de date "tests"
$conn = new mysqli('localhost', 'root', 'pass', 'tests');
// verifica conexiunea
if (mysqli_connect_errno()) {
  exit('Connect failed: '. mysqli_connect_error());
}
// interogare sql SELECT 
$sql = "SELECT `id`, `name`, `pass` FROM `users` LIMIT 2"; 
// executa interogarea si retine datele returnate
$result = $conn->query($sql);
// daca $result contine cel putin un rand
if ($result->num_rows > 0) {
  // afiseaza datele din fiecare rand din $result
  while($row = $result->fetch_assoc()) {
    echo '<br /> id: '. $row['id']. ' - name: '. $row['name']. ' - pass: '. $row['pass'];
  }
}
else {
  echo '0 rezultate';
}
$conn->close();
?>

Optiunea „LIMIT 2” spune MySQL sa returneze primele 2 randuri din rezultat.
Acest exemplu va afisa:

id: 1 – name: Marius – pass: faith
id: 2 – name: CursPHP – pass: peace

ORDER BY

ORDER BY specifica ordinea de sortare a resultatelor.
  – Sintaxa:

SELECT nume_coloana/e FROM nume_tabel ORDER BY nume_col ASC|DESC

nume_col” poate fi o singura coloana, o lista de coloane separate prin virgula, sau o expresie ca RAND(), pentru a obtine o ordine aleatorie.
Cand se ordoneaza dupa mai mult de o coloana, a doua coloana e folosita in sortare doar daca valorile din prima coloana sunt egale.
Ordinea de sortare standard este ascendenta (ASC) (a–z, 0–9), iar optiunea ASC poate fi omisa. DESC (descrescator) inverseaza ordinea.
  – Exemplu:

<?php
// conecteaza la baza de date "tests" 
$conn = new mysqli('localhost', 'root', 'pass', 'tests');
// verifica conexiunea
if (mysqli_connect_errno()) {
  exit('Connect failed: '. mysqli_connect_error());
}
// interogarea sql SELECT 
$sql = "SELECT `id`, `name`, `pass` FROM `users` ORDER BY `name`"; 
// executa interogarea si retine rezultatul
$result = $conn->query($sql);
// daca $result contine cel putin un rand
if ($result->num_rows > 0) {
  // afiseaza datele din fiecare rand din $result
  while($row = $result->fetch_assoc()) {
    echo '<br /> id: '. $row['id']. ' - name: '. $row['name']. ' - pass: '. $row['pass'];
  }
}
else {
  echo '0 results';
}
$conn->close();
?>

– Acest cod selecteaza toate datele stocate in tabelul „users” , si sorteaza rezultatul in ordine alfabetica dupa coloana „name”.
Exemplul de mai sus va afisa:

id: 3 – name: I_AM – pass: love
id: 1 – name: Marius – pass: faith
id: 2 – name: CursPHP – pass: peace
id: 4 – name: PHPCurs – pass: love_light


• Puteti folosi ORDER BY cu optiunea LIMIT.
                Exemplu:       „SELECT `id`, `name`, `pass` FROM `users` ORDER BY `name` LIMIT 2”

• Daca vreti sa ignore randurile duplicate (care au aceleasi valori), se foloseste optiunea DISTINCT:
               

SELECT DISTINCT nume_coloana/e FROM nume_tabel

PHP MySQL – WHERE si LIKE

Utilizare WHERE si operatori pentru a cauta valori specifice

Pentru a cauta valori specifice, pentru a extrage doar acele inregistrari care respecta anumite criterii, se adauga o clauza WHERE in interogarea SELECT.
Clauza WHERE este folosita pentru a filtra inregistrarile. Se adauga dupa numele tabelului.
  – Sintaxa:

SELECL nume_coloana/e FROM nume_tabel WHERE conditie

conditie” – poate fi una sau mai multe expresii conditionale care specifica criteriul de selectare. Aceste expresii conditionale pot folosi operatori de comparatie, aritmetici si logici.

Tabelul urmator prezinta operatorii cei mai des folositi cu WHERE in instructiunile MySQL:

OperatorSemnificatieExemplu
=EgalWHERE `id`=3
<Mai mic decatWHERE `id`<3
>Mai mare decatWHERE `id`>3
<=Mai mic sau egal cuWHERE `id`<=3
>=Mai mare sau egal cuWHERE `id`>=3
!= (also <>)Nu este egal cuWHERE `id`!=3
IS NOT NULLAre valoareWHERE `id` IS NOT NULL
IS NULLNu are valoareWHERE `email` IS NULL
BETWEEN min AND maxIntr-un interval specific (min si max)WHERE `id` BETWEEN 2 AND 4
NOT BETWEEN min AND maxNu este in intervalul (min si max)WHERE `id` NOT BETWEEN 2 AND 4
IN(val1, val2, val3)Se gaseste in lista de valoriWHERE `id` IN(1, 3, 4)
ORUnde una din conditii este adevarataWHERE `id`>3 OR `name`=’CursPHP’
ANDUnde amandoua conditii sunt adevarateWHERE `id`>3 AND `name`=’CursPHP’


  – Exemplu (selecteaza toate randurile din tabelul „users” care au „name=CursPHP” si afiseaza „id” si „email” din ele):

<?php
// conectare la baza de date "tests"
$conn = new mysqli('localhost', 'root', '', 'tests');
// verifica conexiunea
if (mysqli_connect_errno()) {
  exit('Connect failed: '. mysqli_connect_error());
}
$name = 'CursPHP';            // seteaza numele intr-o variabila
// Interogare sql SELECT 
$sql = "SELECT `id`, `email` FROM `users` WHERE `name`='$name'"; 
// executa interogarea si retine rezultatele
$result = $conn->query($sql);
// daca $result contine cel putin un rand
if ($result->num_rows > 0) {
  // afisaza datele pentru fiecare rand din $result
  while($row = $result->fetch_assoc()) {
    echo '<br /> id: '. $row['id']. ' - email: '. $row['email'];
  }
}
else {
  echo '0 results';
}
$conn->close();
?>

– Dupa cum observati, nu e necesar sa selectati coloana la care aplicati conditia WHERE. Coloanele specificate dupa SELECT dicteaza ce coloane sa returneze, iar coloanele adaugate dupa WHERE determina ce randuri vor fi returnate.
– Nota, in interogarea $sql este folosita variabila ($name) care contine numele, aceasta variabila este adaugata intre ghilimele simple in interogare pentru ca MySQL sa preia valoarea ei ca tip sir (string).
Exemplul de mai sus va afisa:

id: 2 – email: user@domain.net


• Clauza WHERE poate fi folosita si cu optiunile ORDER BY si LIMIT pentru a ordona si limita datele selectate.
                Exemplu:       $sql = „SELECT `name`, `pass` FROM `users` WHERE `id`>2 ORDER BY `name` LIMIT 2”;

• In instructiunile SQL se pot adauga si expresii cu calcule matematice, folosind caracterele adunare (+), scadere (-), inmultire (*), impartire (/), si procent (%).
                Exemplu:       $sql = „SELECT `name`, `pass` FROM `users` WHERE `id`=($x + $y)”;

LIKE, NOT LIKE

LIKE si NOT LIKE sunt termeni folositi pentru identificare valori de tip sir, in combinatie cu urmatoarele caractere:

  • %   – reprezinta orice secventa de caractere sau niciuna.
  • _   (o sublinie), reprezinta exact un caracter.

Acesti termeni sunt folositi cu clauza WHERE, iar cautarea este case-insensitive (fara diferenta intre litere mari si mici).

Exemple de interogari cu LIKE /NOT LIKE

<?php
// ...
#sql = "SELECT * FROM `nume_tabel` WHERE `name` LIKE 'mar%'";
// ...
?>

– Aceasta clauza WHERE se potriveste cu CursPHP, marius, Mars, si asa mai departe, dar nu Omar.

<?php
// ...
#sql = "SELECT * FROM `nume_tabel` WHERE `name` NOT LIKE '%mar'";
// ...
?>

– Aceasta clauza WHERE se potriveste cu Mar, Omar, Romar, si asa mai departe, dar nu cu Mars. (‘%mar%‘ se potriveste cu Mars, Marius, Romars, etc.).

<?php
// ...
#sql = "SELECT * FROM `nume_tabel` WHERE `name` NOT LIKE 'mar%'";
// ...
?>

– Aceasta interogare va returna toate randurile ale caror valoare „name” nu incepe cu Mar.

<?php
// ...
#sql = "SELECT * FROM `nume_tabel` WHERE `name` LIKE 'mar_'";
// ...
?>

– Aceasta interogare va returna toate randurile ale caror valoare „name” incepe cu Mar si are patru caractere (Mars, Mara, mar8, etc.).

Interogarile cu termeni LIKE sunt in general mai lente deoarece nu pot profita de indexi.
Pentru a cauta un simbol procent (%) sau o sublinie (_) in text, le precedati cu backslash, in acest mod ( \%   sau   \_ ).
Sublinia poate fi folosita in combinatie cu ea insasi; (exemplu,   LIKE ‘_ _’   va cauta orice combinatie de doua litere).
Cuvantul cheie LIKE trebuie sa fie intotdeauna urmat de un sir, chiar daca termenul cautat este limitat la numere.

PHP MySQL – UPDATE

Dupa ce ati adaugat randuri in tabelul MySQL, puteti sa modificati datele inregistrate, folosind comanda UPDATE.
Instructiunea UPDATE este folosita pentru a modifica sau actualiza informatiile existente intr-un tabel.

  – Sintaxa:

UPDATE nume_tabel

 SET coloana1=valoare, coloana2=valoare2, …

 WHERE o_coloana=o_valoare

– Clauza WHERE este importanta intr-o interogare UPDATE , specifica serverului MySQL care inregistrare sau inregistrari trebuie actualizate. Daca omiteti clauza WHERE, vor fi afectate toate randurile!
– Comanda UPDATE este trimisa la serverul MySQL cu metoda query() a obiectului mysqli.

  – Exemplu
In lectiile anterioare a fost creat un tabel numita „users” si am adaugat cateva randuri in el. Asa arata primele doua inregistrari.

idnamepasswordemailreg_date
1Mariusfaithname@domain.net2011-03-24 09:51:46
2CursPHPpeaceuser@domain.com2011-03-24 10:10:27


In acest exemplu vom modifica adresa de email pentru utilizatorul cu „name” CursPHP.

<?php

// conecteaza la baza de date „tests”

$conn = new mysqli(‘localhost’, ‘root’, ‘pass’, ‘tests’);

// verifica conexiunea

if (mysqli_connect_errno()) {

  exit(‘Connect failed: ‘. mysqli_connect_error());

}

// interogare sql UPDATE

$sql = „UPDATE `users` SET `email`=’new_mail@domain.net’ WHERE `name`=’CursPHP’ AND `id`=2”;

// executa interogarea si verifica pentru erori

if (!$conn->query($sql)) {

  echo ‘Error: ‘. $conn->error;

}

$conn->close();

?>

Dupa cum observati, clauza WHERE pune doua conditii cu operatorul „AND” (WHERE `name`=’CursPHP’ AND `id`=2), ii spune serverului MySQL sa actualizeze numai randurile care au „name=’CursPHP’” si „id=2„. Setand aceste doua conditii, putem fi siguri ca numai acel rand va fi modificat, nu un alt rand cu acelasi nume.
De asemenea, puteti sa aplicati optiunea LIMIT pentru a seta cate randuri sa fie actualizate.
Exemplu:
                $sql = „UPDATE `users` SET `email`=’new_mail@domain.net’ WHERE `name`=’CursPHP’ AND `id`=2 LIMIT 1”;

Dupa actualizare, primele doua randuri din tabelul „users” vor arata asa:

idnamepasswordemailreg_date
1Mariusfaithname@domain.net2011-03-24 09:51:46
2CursPHPpeacenew_mail@domain.com2011-03-27 10:20:58

– Deoarece „reg_date” este o coloana de tip TIMESTAMP (cu atribute:   on update CURRENT_TIMESTAMP ), serverul MySQL a modificat si valuarea ei, actualizand-o cu data si ora curente (din momentul efectuarii UPDATE).
Daca vreti ca o instructiune UPDATE sa nu schimbe valoare coloanei TIMESTAMP, cand creati tabelul trebuie sa nu adaugati atributul „on update” , ci doar DEFAULT ( `coloana_data` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ).

– Daca executati o interogare UPDATE care nu modifica nici o valoare (deoarece conditia WHERE nu se potriveste nici unui rand), nu va returna vreo eroare si nici nu va afecta vreun rand.
– Este indicat sa nu schimbati valoarea unei coloane de tip PRIMARY KEY (in exemplul de mai sus, coloana „id”).

PHP MySQL – DELETE

Comanda DELETE este folosita pentru a sterge randuri din tabel.

  – Sintaxa:

DELETE FROM nume_tabel WHERE conditie

Clauza WHERE conditie este foarte importanta, ea specifica exact care rand sau randuri trebuie sterse. Este important sa o folositi, deoarece randurile sterse nu mai pot fi recuperate, decat daca aveti undeva salvata baza de date.
Daca nu adaugati WHERE, serverul MySQL va sterge toate inregistrarile din tabel, lasandu-l gol.
Instructiunea DELETE este trimisa la serverul MySQL cu metoda query() a obiectului mysqli.

  – Exemplu
In lectiile anterioare a fost creat un tabel „users” si am adaugat cateva date in el. Aici puteti vedea cum arata primele 3 randuri.

idnamepasswordemailreg_date
1Mariusfaithname@domain.net2011-03-24 09:51:46
2CursPHPpeacenew_mail@domain.com2011-03-27 10:20:58
3I_AMloveaddress@domain.net2011-03-24 10:10:27


In acest exemplu vom sterge inregistrarile din tabel, care au name=’CursPHP’:

<?php

// Conecteaza la baza de date „tests”

$conn = new mysqli(‘localhost’, ‘root’, ‘pass’, ‘tests’);

// verifica conexiunea

if (mysqli_connect_errno()) {

  exit(‘Connect failed: ‘. mysqli_connect_error());

}

// interogare DELETE

$sql = „DELETE FROM `users` WHERE `name`=’CursPHP'”;

// executa interogarea si verifica daca exista erori

if (!$conn->query($sql)) {

  echo ‘Error: ‘. $conn->error;

}

$conn->close();

?>

– Acest cod va sterge toate randurile din tabelul „users” care au name=’CursPHP’, astfel, daca in acest tabel sunt mai multi useri (inregistrari) cu numele „CursPHP”, MySQL le sterge pe toate.
Ca sa fiti sigur care inregistrare va fi stearsa, puteti sa adaugti inca o conditie in clauza WHERE (cu operatorul AND), care impreuna cu prima specifica mai exact ce rand sa fie sters.
De asemenea, se poate aplica optiunea LIMIT ca sa specificati cate randuri sa fie sterse, din cele conform conditiei.
Example:
                $sql = „DELETE FROM `users` WHERE `name`=’CursPHP’ AND `id`=2 LIMIT 1”;

Dupa stergere, primele trei randuri din tabelul „users” vor arata asa:

idnamepasswordemailreg_date
1Mariusfaithname@domain.net2011-03-24 09:51:46
3I_AMloveaddress@domain.net2011-03-24 10:10:27
4PHPCurslove_lighta_name@domain.net2011-03-24 14:39:49

– Dupa cum se observa, randul cu name=’CursPHP’ (id=2) a fost sters.
– Daca se executa o interogare DELETE care nu sterge nici o inregistrare (deoarece conditia WHERE nu se potriveste cu nici un rand), nu veti primi nici o eroare, si nu va fi afectat vreun rand.

• Pentru a sterge complet un tabel, se foloseste DROP TABLE:
                    DROP TABLE nume_tabel

• Pentru a sterge o intreaga baza de date, cu toate tabelele si informatiile din ea, se foloseste DROP DATABASE:
                    DROP DATABASE database_name

MySQL Alias si functii

Alias

Un alias este creat folosing termenul AS urmat de un nume case-sensitive. Se foloseste in interogari SELECT pentru a da unei coloane un nume diferit in rezultatele returnate.
  – Exemplu:
In exemplele din aceasta lectie se foloseste urmatorul tabel, denumit „sites”:

idsitenrreg_date
1www.CursPHP.net52011-03-28 07:56:53
2www.PHPCursWeb.net82011-03-28 07:57:40


Acest exemplu selecteaza inregistrarile din coloana „site” si le returneaza intr-un alias numit „st”.

// conecteaza la baza de date "tests"
$conn = new mysqli('localhost', 'root', '', 'tests');
// verifica conexiunea
if (mysqli_connect_errno()) {
  exit('Connect failed: '. mysqli_connect_error());
}
// interogare sql 
$sql = "SELECT `site` AS st FROM `sites`";
// executa interogarea si retine rezultatele
$result = $conn->query($sql);
// daca $result contine cel putin un rand
if ($result->num_rows > 0) {
  // afisaza datele din fiecare rand din $result
  while($row = $result->fetch_assoc()) {
    echo '<br />';
    print_r($row);
  }
}
else {
  echo '0 rezultate';
}
$conn->close();
?>

In resultatele obtinute, valorile coloanei „site” vor fi returnate intr-un alt nume de coloana, denumita ‘st’.
Afiseaza:

Array ( [st] => www.CursPHP.net )
Array ( [st] => www.PHPCursWeb.net )


Se pot folosi mai multe aliasuri intr-o interogare SELECT, cate unul pentru fiecare coloana:
                    SELECT coloana1 AS nume1, coloana2 AS nume2 FROM nume_tabel

Aliasurile sunt de obicei folosite cu functii, pentru a returna rezultatul unei functii asociat cu un nume (dupa cum vedeti in exemplu de mai jos).
In mod standard, SQL nu suporta folosirea de aliasuri in interogari care au conditionala WHERE.

Functii MySQL

Cele mai multe din functiile MySQL sunt folosite cu interogarea SELECT pentru a formata datele returnate, dar puteti folosi functii MySQL si cu alte tipuri de interogari.
Pentru a aplica o functie intr-o instructiune SELECT, la valoarea unei coloane, interogarea va arata astfel:

  – Sintaxa:

SELECT coloana1, FUNCTIE(coloana2), coloana3 FROM nume_tabel

Nu trebuie sa lasati spatii intre numele functiei si parateza ei.

Functii pentru Text

Functiile pentru text sunt folosite cand se lucreaza cu siruri, pot fi aplicate fie cu numele coloanelor fie cu valori specifice.
Tabelul de mai jos contine cateva din cele mai utilizate functii MySQL pentru lucru cu text („t”, poate fi text sau numele unei coloane).

FunctieReturneaza
CONCAT(t1, t2, …)Un nou sir de forma „t1t2”.
CONCAT_WS(S, t1, t2, …)Un nou sir de forma t1St2S… (ignora coloanele care nu au valori)
LENGTH(t)Numarul de caractere din „t”.
LEFT(t, y)Caracterul „y” cel mai aproape de partea stanga din „t”.
RIGHT(t, x)Caracterul „x” cel mai aproape de partea deapta din „t”.
TRIM(t)„t” cu spatiile de la capete sterse.
UPPER(t)„t” cu litere mari.
LOWER(t)„t” cu litere mici.
SUBSTRING(t, x, y)caracterele „y” din „t”, incepand de la index „x” (indexat de le 0).
expr REGEXP paternExecuta o cautare in „expr”, dupa o expresie regulata specificata la „patern”.


  – In urmatorul exemplu vom folosi functia CONCAT() pentru a uni intr-un singur sir valorile a doua coloane („site” si „nr”), separate de o liniuta. Acest sir va fi returnat cu un titlu de alias numit „str”:

<?php
// conecteaza la baza de date "tests" 
$conn = new mysqli('localhost', 'root', '', 'tests');
// verifica in caz de eroare la conectare
if (mysqli_connect_errno()) {
  exit('Connect failed: '. mysqli_connect_error());
}
// interogare sql
$sql = "SELECT CONCAT(`site`, ' - ', `nr`) AS str FROM `sites`";
// executa interogarea si stocheaza rezultatele
$result = $conn->query($sql);
// daca $result contine cel putin un rand
if ($result->num_rows > 0) {
  // afisaza datele pentru fiecare rand din $result
  while($row = $result->fetch_assoc()) {
    echo '<br />'. $row['str'];
  }
}
else {
  echo '0 rezultate';
}
$conn->close();
?>

Aliasul „str” este cheia in array ce contine valorile returnate.
Codul de mai sus va returna:

www.CursPHP.net – 5
www.PHPCursWeb.net – 8


• Pentru lista completa cu functiile MySQL pt. text, vedeti manualul MySQL: Functii pentru siruri.

Functii numerice

Functiile numerice sunt folosite in lucrul cu numere, pentru a efectua operatii matematice. Ca si celelalte functii, ele pot fi utilizate fie cu numele coloanelor fie cu valori specifice.
In tabelul urmator sunt prezentate cateva din functiile numerice MySQL („n”, poate fi un numar sau numele unei coloane).

FunctiaReturneaza
ABS(n)Valoarea absoluta a lui „n”.
AVG(col)Valoarea mijlocie (medie) a coloanei specificate.
CEILING(n)Urmatorul cel mai mare numar intreag dupa „n”.
FLOOR(n)Valoarea intreaga a lui „n”.
FORMAT(n1, n2)„n1” formatat ca un numar cu „n2” zecimale si cu virgula la fiecare 3 spatii.
MIN(col)Valoarea minima din coloana specificata.
MAX(col)Valoarea maxima din coloana specificata.
MOD(n1, n2)Resultatul impartirii lui „n1” la „n2”. La fel ca si expresia cu simbolul procent (n1%n2)
POW(n1, n2)„n1” la puterea „n2”
RAND()Un numar aleatoriu intre 0 si 1.0
ROUND(n1, n2)„n1” rotunjit la „n2” zecimale.
SQRT(n)Radical din „n”.
SUM(col)Suma valorilor din coloana specificata.


  – In urmatorul exemplu vom selecta coloana „nr”, cu functia POW() aplicata ei, urmata de un alias care va contine valoarea returnata de functia POW():

<?php
// conecteaza la baza de date "tests" 
$conn = new mysqli('localhost', 'root', '', 'tests');
// verifica conexiunea
if (mysqli_connect_errno()) {
  exit('Connect failed: '. mysqli_connect_error());
}
// interogare sql
$sql = "SELECT `nr`, POW(`nr`, 3) AS pow3 FROM `sites` ORDER BY pow3";
// executa interogarea si stocheaza rezultatele
$result = $conn->query($sql);
// daca $result contine cel putin un rand
if ($result->num_rows > 0) {
  // afiseaza datele din fiecare rand din $result
  while($row = $result->fetch_assoc()) {
    echo '<br /> POW('. $row['nr']. ', 3) - '. $row['pow3'];
  }
}
else {
  echo '0 rezultate';
}
$conn->close();
?>

Afiseaza:

POW(5, 3) – 125
POW(8, 3) – 512


– Functia RAND() poate fi folosita pentru a returna randurile intr-o ordine aleatorie:
                    SELECT * FROM nume_tabel ORDER BY RAND()

• Pentru lista completa cu functii numerice MySQL, vedeti manualul MySQL: Functii numerice si operatori

Functii pentru Data si Ora

Coloanele specifice pt. Data si Ora din MySQL sunt destul de flexibile.
Daca vreti sa faceti calcule bazate pe o anume data sau sa returnati numai numele zilei din saptamana, MySQL are o functie pentru aproape fiecare scop de lucru cu Data si Ora.
Tabelul urmator contine cateva din cele mai utilizate functii MySQL pt. lucru cu data si ora. Ele pot fi aplicate fie cu numele coloanelor, fie cu valori specifice („dt”, poate fi o valoare sau numele unei coloane).

FunctieReturneaza
HOUR(dt)Ora din „dt”.
MINUTE(dt)Minutul din „dt”.
SECOND(dt)Secundele din „dt”.
DAYNAME(dt)Numele zilei din saptaana a datei din „dt”.
DAYOFMONTH(dt)Numarul zilei din luna a datei din „dt”.
MONTHNAME(dt)Numele lunii din an a datei din „dt”.
MONTH(dt)Valoarea numerica a lunii din an, a datei din „dt”.
YEAR(dt)Anul din „dt”.
CURDATE()Data curenta.
CURTIME()Ora curent.
NOW()Data si ora curenta.
UNIX_TIMESTAMP(dt)Timpul Unix (numarul de secunde trecute de la „1 Ianuarie 1970 00:00:00 GMT” pana la momentul curent sau pana la data specificata).


  – Urmatorul exemplu afiseaza numele zilei din saptamana cand ultimul site a fost inregistrat:

<?php
// conecteaza la baza de date "tests"
$conn = new mysqli('localhost', 'root', '', 'tests');
// verifica conexiunea
if (mysqli_connect_errno()) {
  exit('Connect failed: '. mysqli_connect_error());
}
// interogare sql
$sql = "SELECT `id`, `site`, DAYNAME(`reg_date`) AS weekday FROM `sites` ORDER BY `reg_date` DESC LIMIT 1";
// executa interogarea si stocheaza rezultatele
$result = $conn->query($sql);
// daca $result contine cel putin un rand
if ($result->num_rows > 0) {
  // parcurge si afiseaza datele din fiecare rand din $result
  while($row = $result->fetch_assoc()) {
    echo 'Ultimul site web: '. $row['site']. ' , id: '. $row['id']. ' - a fost inregistrat intr-o zi de '. $row['weekday'];
  }
}
else {
  echo '0 results';
}
$conn->close();
?>

Afiseaza:

Ultimul site web: www.PHPCursWeb.net , id: 2 – a fost inregistrata intr-o zi de luni


Daca doriti sa preluati timpul UNIX dintr-o coloana de tip „Data si Timp”, folositi urmatoarea formula:
                    SELECT UNIX_TIMESTAMP(coloana_data) AS nume_alias FROM nume_tabel

• Exista multe alte functii pt. data si ora, puteti vedea lista completa in manualul MySQL: Functii pentru Data si Ora.

Similar Posts

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *