curso php unifacs 2014.1 – databases & sessions
TRANSCRIPT
Curso PHP
@JonataWeber2014
Databases & Sessions
PHP Sessions
• Como identificar um usuário na internet?
• Sessōes trabalham com identificador único (UID)
• Armazenamento temporário
PHP Sessions<?php!!// inicia um PHP Session!session_start();!!// guarda uma informação na sessão!$_SESSION['message'] = 'Hello, Session!';!!// recupera uma informação da sessão!echo $_SESSION['message'];!!// remove parte da sessão !unset($_SESSION['message']);!!// remove a sessão inteira !session_destroy();!
Databases• Necessidade de Persistir e
Recuperar dados por tempo indeterminado
• Geralmente possui armazenamento não-volátil
Drivers Nativos
• Uma API diferente para cada banco de dados
• mysqli, pgsql, mssql, etc.
• Melhor opção até o PHP 5.1.0
MySQL Extension
• Será removida nas próximas versões
• Funções iniciadas com mysql_*
• mysql_connect, mysql_query, mysql_num_rows, etc…
• Substituir por mysqli ou PDO
Depreciada no PHP 5.5.0
MySQLi Extensionhttp://php.net/mysqli
<?php!// mysqli!$mysqli = new mysqli("localhost", "root", "mysqlpwd", “test");!!$result = $mysqli->query("SELECT 'Olá, usuário MySQL!' AS _message FROM DUAL");!!$row = $result->fetch_assoc();!!echo $row['_message'];!
PDO Extensionhttp://www.php.net/pdo
<?php!!// PDO!$pdo = new PDO('mysql:host=localhost;dbname=test', 'root', ‘mysqlpwd');!!$statement = $pdo->query("SELECT 'Olá, usuário MySQL!' AS _message FROM DUAL");!!$row = $statement->fetch(PDO::FETCH_ASSOC);!!echo $row['_message'];!
PDO Extension• Não irá traduzir suas consultas SQL
• Conexão com múltiplos banco de dados usando a mesma API
• Mais importante: PDO evita ataques de SQL Injections
• PDO Statements + Bind Parameters
SQL Injection<?php!!$pdo = new PDO('sqlite:/path/db/users.db');!$pdo->query("SELECT name FROM users WHERE id = ".$_GET['id']); // <-- NO!!
SELECT name FROM users WHERE id = 50!
http://yourdomain.com/users?id=50
Resultado:
SQL Injection
SELECT name FROM users WHERE id = 50;DELETE FROM users!
E se…http://yourdomain.com/users?id=50%3BDELETE+FROM+users
Resultado:
<?php!!$pdo = new PDO('sqlite:/path/db/users.db');!$pdo->query("SELECT name FROM users WHERE id = ".$_GET['id']); // <-- NO!!
SQL Injection Como evitar?
<?php!!$pdo = new PDO('sqlite:/path/db/users.db');!$stmt = $pdo->prepare('SELECT name FROM users WHERE id = :id');!$stmt->bindParam(':id', $_GET['id'], PDO::PARAM_INT); // <-- Automatically sanitized by PDO!$stmt->execute();!
Maiores informações: https://www.owasp.org/index.php/SQL_Injection
Front Controller• Padrão Arquitetural
• Bastante utilizado em Aplicações Web
• Responsável pelo Fluxo da Aplicação
• Evita duplicação de código
• Manipulação de Sessões, Caching, Filtro de dados, Autenticação, etc.
Referências
• http://www.phptherightway.com/
• http://www.php.net/