Menu

INSERT & SELECT

In lectia anterioara am invatat cum sa deschidem si sa inchidem o conexiune la MySQL dar d-abia acum a inceput adevarata distractie.

Pentru a imbina practica cu teoria, am ales pentru aceasta serie(MySQL cu PHP) sa dezvoltam o mica aplicatie, una foarte mica desigur pentru a nu complica lucrurile inutil. Vom dezvolta o mica aplicatie pentru contacte(o agenda), in care vom adauga, edita si sterge contacte. De data aceasta vom si imbina lectiile trecute cu cele noi, nu va fi nimic complicat deci nu va speriati, doar ne vom preface deoarece o aplicatie completa ar fi mult mai complicata dar nu te-ar ajuta sa intelegi.
Pentru inceput asigura-te ca ai deja o baza de date creata(cu PHPMyAdmin sau manual cum ai invatat in lectia Notiuni de baza in lucrul cu MySQ). Odata ce ai deja o baza de date creata trebuie sa cream un tabel cu numele agenda si cu coloanele id(auto increment),nume si email. Cod:

DROP TABLE IF EXISTS agenda;
CREATE TABLE agenda(
	id INT PRIMARY KEY AUTO_INCREMENT,
	nume VARCHAR(30),
	email VARCHAR(40)
);
Observati ca am adaugat si DROP TABLE IF EXISTS agenda; care sterge tabelul agenda in caz ca el exista deja. Acum sa cream un fisier pentru conectarea la baza de date. Cod config.php:
<?php  
# fisier: /config.php

$host 	= 'localhost'; // hostul pentru baza de date
$user 	= 'user'; // userul pentru conectarea la baza de date
$parola = '123456'; // parola asociata userului $user pentru baza de date
$db 	= 'aplicatie'; // baza de date creata de tine in care este tabelul agenda
?>

1. Insert

Instructiunea INSERT este folosita pentru adauga noi randuri in tabele. Sintaxa SQL pentru insert este urmatoarea:
INSERT INTO `nume_tabel`(`coloana1`,`coloana2`) VALUES('valoare1','valoare2');
Cu instructiunea SQL prezentata mai sus se va adauga un nou rand in tabelul nume_tabel in care coloana coloana1 va avea valoarea valoare1 iar coloana coloana2 va avea valoarea valoare2.
Desigur, se pot adauga si mai multe randuri cu o singura instructiune:
INSERT INTO `nume_tabel`(`coloana1`,`coloana2`) VALUES('valoare1.1','valoare1.2'),('valoare2.1','valoare2.2'),('valoare3.1','valoare3.2');
Dupa cum observi este recomandat(dar nu obligatoriu) ca numele tabelelor sa fie intre ghilimelele de tipul `(butonul din stanga butonului 1 , este fix sub ESC). Iar string-urile introduse de noi trebuie sa fie obligatoriu intre ghilimele simple -> '

Acum sa incercam si pe mica noastra aplicatie, vom face o pagina unde adaugam noi randuri(noi contacte in agenda).
Cod adauga.php:
<?php  
# fisier: /adauga.php
include('config.php'); // includem fisierul cu datele pentru conectarea la baza de date
$conn 	= new mysqli($host, $user, $parola, $db); // ne conectam la baza de date

# Preluam datele din formular(in caz ca acestea exista) si le filtram:
# contra XSS cu: htmlspecialchars
# contra MySQL Injection cu metoda real_escape_string() din obiectul mysqli
$nume   = htmlspecialchars(((isset($_POST['nume'])) ? $_POST['nume'] : ''), ENT_QUOTES);
$nume 	= $conn->real_escape_string($nume);
$email  = htmlspecialchars(((isset($_POST['email'])) ? $_POST['email'] : ''), ENT_QUOTES); 
$emal 	= $conn->real_escape_string($email);
if($nume == null Or $email == null){ 
	# In caz ca nu au fost trimise date din formular sau nu au fost completate ambele inputuri
	echo 'Completeaza corect ambele inputuri. <br/>';
	echo '<form method="post">';
		echo '<input type="text" name="nume" placeholder="Nume contact"/>';
		echo '<input type="text" name="email" placeholder="Email contact"/>';
		echo '<input type="submit" value="Adauga contactul"/>';
	echo '</form>';
} else{
	# In caz ca au fost trimise date din forumular
	# Datele sunt deja filtrate deci nu mai este nevoie sa le filtram din nou
	$sql = "INSERT INTO `agenda`(`nume`,`email`) VALUES('$nume','$email')";
	if($conn->query($sql)){
		# In caz ca query-ul a fost executat cu succes.
		echo '<p style="color:green;">Contactul a fost adaugat cu succes!</p>';
	} else{
		echo '<p style="color:red;">A intervenit o eroare la query-ul MySQL!</p>';
	}
	echo '<a href="?">Adauga inca un contact</a> | <a href="contacte.php">Vezi contactele</a>';
}
?>
Pagina contacte.php o vom crea insa mai incolo. Acum sa ne concentram insa pe adaugare. Daca adaugi un contact nou il poti vedea din PHPMyAdmin. Poti testa pagina adauga.php in iframe-ul de mai jos:

2. Select

Instructiunea SELECT este folosita pentru a vedea randurile dintr-o baza de date. Modul de folosire este oarecum asemanator ca al fisierelor cand extragem linie cu linie, decat ca conditia va fi sa returneze true si nu sa nu fie false. Sintaxa pentru SELECT este urmatoarea:
SELECT `coloana1`, `coloana2`, `coloana3` FROM `nume_tabel`
Instructiunea de mai sus va extrage toate randurile din tabelul nume_tabel dar va lua doar coloanele coloana1,coloana2,coloana3 deci daca in acel tabel am mai avea si coloana coloana4 si in randuri ar fi date asociate ei nu ar fi luate si acele date. Putem insa sa luam toate coloanele si fara a preciza numele lor:
SELECT * FROM `nume_tabel`
Acum cu sintaxa de mai sus am lua toate randurile cu toate coloanele din tabelul nume_tabel. Insa aceste sintaxe ar lua absolut toate randurile, daca am avea 500 le-ar lua pe toate. Putem insa sa limitam rezultatele:
SELECT * FROM `nume_tabel` LIMIT cate_randuri_sa_sara, randuri_maxime_returnate
In sintaxa de mai sus cate_randuri_sa_sara este un numar care se refera peste cate randuri sa treaca peste(deci daca avem randurile 1,2,3 si 4 si am precizat sa sara 2 randuri el ar incepe de la 3 si ar mai ramane doar randurile 3 si 4). Iar randuri_maxime_returnate este un numar care spune cate randuri sa fie returnate maxim, deci daca avem 500 de randuri si am precizat sa returneze doar 3 pai doar 3 va returna.
Putem insa si extrage doar randurile care ne intereseaza , folosind o clauza WHERE:
SELECT * FROM `nume_tabel` WHERE `ani`>18
Putem folosii WHERE pentru a compara coloane intre ele, pentru a compara valori intre ele sau chiar compara coloane cu valori(cum avem in exemplu). De precizat este ca clauza WHERE poate fi folosita si cu instructiunea DELETE. Cu WHERE se pot folosii si operatorii conditionali AND sau &&(similar cu AND si && din php) si OR sau ||(similar cu OR sau || din php). Se pot folosii paranteze in WHERE pentru a crea reguli in conditii(similar cand folosim paranteze in if-urile din php). Un exemplu de folosire cu tot cu where si mai multe conditii este:
SELECT * FROM `nume_tabel` WHERE (`ani`>18 AND `ani`<30) AND (`experienta`>2)

Cu WHERE se mai poate face si o cautare in baza de date, deoarece simplul WHERE cu un egal este mult prea simplu, putem cauta in baza de date introducand doar parti din ce dorim sa cautam folosind LIKE. Cand folosim LIKE caracterul % reprezinta de la 0 pana la un infinit de caractere. Exemplu de folosire:
SELECT * FROM `nume_tabel` WHERE `nume` LIKE '%Ionut%'
...inversul lui LIKE este NOT LIKE.

Cu WHERE se mai pot pune si conditii cu REGEXP(expresii regulate). Exemplu:
SELECT * FROM `nume_tabel` WHERE `nume` REGEXP '(.*)Ionut(.*)'
...unde (.*)Ionut(.*) poate fi orice expresie regulata. Am pus expresia regulata (.*)Ionut(.*) pentru a arata ca este asemanatoare cu valoarea folosita in exemplul anterior si anume %Ionut%.

Putem si ordona rezultatele in functie de o coloana folosind ORDER BY:
SELECT * FROM `nume_tabel` ORDER BY `ani` DESC
Tabelul ani poate fi atat numeric cat si text(in caz ca este text se va face din punct de vedere alfabetic) iar optiunea DESC este pentru descendent iar daca dorim sa le sortam ascendent folosim ASC in loc de DESC

Acum dupa atata teorie sa folosim SELECT-ul si in aplicatia noastra, noi il vom folosii pentru absolut toate contactele din agenda.
Cod contacte.php:
<?php  
# fisier: /contacte.php

include('config.php'); // includem fisierul cu datele pentru conectare la mysql
$conn 	= new mysqli($host, $user, $parola, $db);
$sql 	= "SELECT * FROM `agenda`";
$result = $conn->query($sql); // executam query-ul 
if(is_object($result)){
	# In caz ca query-ul nu a avut erori
	if($result->num_rows > 0){
		echo '<table border="5" cellpadding="5">';
		echo '<tr><th>Nume</th><th>Email</th><th>Optiuni</th></tr>';
		# Metoda(functia) fetch_assoc() returneaza cate o linie pe rand din rezultate
		# iar cand nu mai sunt rezultate returneaza FALSE si astfel while se opreste
		while($row = $result->fetch_assoc()){
			echo '<tr>';
				echo '<td>'.$row['nume'].'</td>';
				echo '<td>'.$row['email'].'</td>';
				echo '<td><a href="modifica.php?id='.$row['id'].'">M</a> | <a href="sterge.php?id='.$row['id'].'">S</a></td>';
			echo '</tr>';
		}
		echo '</table>';
	} else{
		echo '<h2 style="color:red;">Nu exista nici un contact in agenda!</h2>';
	}
} else{
	echo '<h2 style="color:red;">Eroare neasteptata!</h2>';
}
echo '<br/><br/><a href="adauga.php">Adauga un contact</a>'; 
?>
Fisierele modifica.php si sterge.php le vom crea intr-o lectie viitoare, acum sa ne concetram pe afisare.
Poti testa codul de mai sus si exemplul cu insert-ul in iframe-ul de mai jos:


Ti-a placut articolul? Asigura-te ca-ti dam de veste cand publicam altele noi.


Tags: Tutoriale, Programare Web, Php, Tutoriale Mysql, Php Si Mysql, Curs Php

Comments Nota 0 din 0