UF3. Accés a dades
M07. Desenvolupament web en entorn servidor
## UF3. Accés a dades ###### Autor: Sergi Coll
Tècniques d’accés a dades
Disposem de diferents llibreries per connentar a BD:
- MYSQL extension (obsoleta)
    - Aquesta extensió ha estat “deprecated” el 2012.
 
- MySQLi extension (“i” improved)
    - Només funciona amb bases de dades MySQL.
 
- PDO o PHP Data Object
    - Pot treballar amb 12 diferents gestors de bases de dades.
        - MySQL, SQLite, Oracle, MS SQL Server, etc.
 
 
- Pot treballar amb 12 diferents gestors de bases de dades.
        
MYSQLi CONNEXIÓ A BD
<?php
$servername= "localhost";
$username = "username";
$password = "password";
// Create connection
$conn= new mysqli($servername, $username, $password);
// Check connection
if($conn->connect_error) {
	die("Connection failed: " . $conn->connect_error);
}
echo "Connected successfully";
//Close connection
$conn->close();
?>
PDO
# PHP Data Object
Introducció a PDO
- PDO és un extensió de PHP que ens propociona una capa d’abstracció d’accés a dades.
    - Per tant, ens permet utilitzar les mateixes funcions per realitzar consultes independentment de la base de dades que estiguem utilitant.
 
- PDO ve amb PHP 5.1.
- Requereix característiques de OO (Orientació Objectes) del nucli de PHP 5.
    - Per tant, no funcionarà en versions anteriors a 5.1.
 
PDO CONNEXIÓ A BD
<?php
$servername= "localhost";
$username = "username";
$password = "password";
try{
	//creem una nova connexió instancinat l'objecte PDO
	$conn = new PDO("mysql:host=$servername;dbname=myDB",
			$username, $password);
  // establim el mode PDO error a exception per poder
  // recuperar les excepccions
  $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  echo "Connected successfully";
}
catch(PDOException $e)
{
	//Si falla la connexió amb la BD es mostra l'error.
	echo "Connection failed: " . $e->getMessage();
}
//Close connection
$conn=null;
?>
PDO SELECT
<?php
// sql to select a record
$sql = 'SELECT firstname, lastname, email FROM MyGuest ORDER BY firstname';
//obtenir les files de la BD
$rows = $conn->query($sql);	// use query() because results are returned
//recorrem cadauna de les files per mostrar les dades
foreach ($rows as $row) {
	 echo $row['firstname'] . "\t";
	 echo $row['lastname'] . "\t";
	 echo $row['email'] . "\n";
}
?>
PDO INSERT
Si realitzem un INSERT en una taula amb un camp AUTO_INCREMENT, podem obtenir el ID de lúltim registre inserit.
<?php
$sql= "INSERT INTO MyGuests(firstname, lastname, email)
VALUES ('John', 'Doe', 'john@example.com')";
// use exec() because no results are returned
$conn->exec($sql);
$last_id = $conn->lastInsertId();
echo "New record created successfully. ";
echo "Last inserted ID is: " . $last_id;
?>
PDO INSERT
<?php
$firstname = $_POST['firstname'];
$lastname = $_POST['lastname'];
$email = $_POST['email'];
$sql= "INSERT INTO MyGuests(firstname, lastname, email)
VALUES ($firstname, $lastname, $email)";
// use exec() because no results are returned
$conn->exec($sql);
echo "New record created successfully. ";
?>
SQL INJECTION
- És un tècnica que hacking que permet injectar instruccions SQL a través d’una pàgina de la nostra aplicació web.
- Si tenim, per exemple, un formulari de login:
<?php
// sql to select a record
$user = $_GET["user"];
$pass = $_GET["password"];
$sql = "SELECT * FROM users WHERE username='$user' AND password='$pass'";
$result = $conn->query($sql);
if ($result){
	echo "Usuari autenticat!"
}
## Exemple SQL injection * Un perillós hacker omple un formulari amb aquestes dades:

Exemple 1 SQL Injection:
<?php
	$user = "' OR 1=1 --"
	$pass = ""
	$sql = "SELECT * FROM users WHERE username='$user' AND password='$pass'";
?>
El – en MySQL indica que és un comentari .
SELECT * FROM users WHERE username='' OR 1=1 --' AND password=''
Exemple 2 SQL Injection:
<?php
	$user = "sergi"
	$pass = "' OR 1=1"
	$sql = "SELECT * FROM users WHERE username='$user' AND password='$pass'";
?>
SELECT * FROM users WHERE username='sergi' AND password='' OR 1=1;
Exemple 3 SQL Injection:
<?php
	$user = "'; DROP TALBE users --"
	$pass = ""
	$sql = "SELECT * FROM users WHERE username='$user' AND password='$pass'";
?>
SELECT * FROM users WHERE username=''; DROP TALBE users --' AND password=''
PDO PREPARED STATEMENTS
- Una instrucció preparada es tracta d’una instrucció SQL pre-compilada que pot ser executada varies vegades només enviant les dades al servidor.
- Permet evitar el SQL injection.
Exemple INSERT amb Prepared Statements
<?php
  // prepare sql statement
	$stmt = $conn->prepare("INSERT INTO MyGuests (firstname, lastname, email)
					VALUES (:firstname, :lastname, :email)");
	// execute to insert a row
	$stmt->execute(array(':firstname'=>'John',
						':lastname'=>'Doe',
						':email'=>"john@example.com"));
	// execute to insert a row
	$stmt->execute(array(':firstname'=>'Mary',
						':lastname'=>'Moe',
						':email'=>"mary@example.comm"));
?>
Exemple SELECT amb Prepared Statements
<?php
  // 1. prepare sql statement
	$sql = 'SELECT firstname, lastname, email FROM MyGuest WHERE firstname = :firstname';
	$stmt = $conn->prepare($sql);
	// 2. execute to insert a row
	$stmt->execute(array(':firstname'=>'John'));
	// 3. get all rows
	$rows = $stmt->fetchAll();
	// 4. show rows
	foreach ($rows as $row) {
		echo $row['firstname'];
		echo $row['lastname'];
	}
?>
El métode fetch() es pot definir per tal que retorni un array, un objecte, una instància d’una classe, etc.
$rows = $stmt->fetch(PDO::FETCH_ASSOC);
Únicament cal passar com a paràmetre: * PDO::FETCH_ASSOC: Retorna un array associatiu. És el valor per defecte. * PDO::FETCH_BOTH * PDO::FETCH_BOUND * PDO::FETCH_CLASS * PDO::FETCH_OBJ —
PDO DELETE
<?php
	// sql to delete a record
	$sql= "DELETE FROM MyGuests WHERE id=3";
	// use exec() because no results are returned
	$conn->exec($sql);
	echo "Record deleted successfully";
?>
PDO UPDATE
<?php
	$sql= "UPDATE MyGuests SET lastname='Doe' WHERE id=2";
	// Prepare statement
	$stmt= $conn->prepare($sql);
	// execute the query
	$stmt->execute();
	// echo a message to say the UPDATE succeeded
	echo $stmt->rowCount() . " records UPDATED successfully";
?>
MÉS INFO
- 
    MYSQLi W3Schools:http://www.w3schools.com/php/php_mysql_intro.asp 
- 
    PDO PHP.net: http://php.net/manual/es/book.pdo.php