Nessa aula você vai entender definitivamente como utilizar o PDO (PHP data objects) para manipular os dados no seu banco de dados. Esse assunto é importante, visto que em muitas linguagens de programação uma das maiores dificuldades é lidar com o paradigma orientado a objetos. Uma das maiores dificuldades reside na persistência de dados, isso acontece considerando a grande popularidade de bancos de dados relacionais. Um banco de dados relacional utiliza tabelas e relacionamentos para realizar o armazenamento de dados, no entanto, lidar com essas tabelas pode ser trabalhoso para o programador.
Para mitigar essa deficiência, ferramentas para o mapeamento objeto-relacional foram desenvolvidas. No Java, javascript, python, entre outras linguagens existem ORMs estáveis e excelentes. No caso do PHP quem faz essa tarefa é o PDO, que será o objeto dessa aula.
Antes de mais nada recomendamos que você também acesse a documentação oficial do PDO.
Como configurar o PDO em seu projeto
O primeiro passo para criar seu projeto e utilizar o PDO é criar um arquivo de configurações no PHP onde serão armazenadas as informações do banco de dados:
<?php
$host = "localhost";
$username = "root";
$password = "12345";
$dbname = "test";
$dsn = "mysql:host=$host;dbname=$dbname";
$options = array(
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
);
É uma boa ideia ainda que realizemos a criação da base de dados utilizando o próprio PHP. Podemos criar um arquivo PHP de instalação contendo:
<?php
require "config.php";
try {
$connection = new PDO("mysql:host=$host", $username, $password, $options);
$sql = file_get_contents("data/init.sql");
$connection->exec($sql);
echo "Database and table users created successfully.";
} catch(PDOException $error) {
echo $sql . "<br>" . $error->getMessage();
}
Execute o projeto utilizando um servidor Apache e acesse a página install.php.
Entendendo a utilização do PDO para inserção
Estamos utilizando o PHP puro e a lógica para inserção é muito semelhante a de qualquer projeto php. Observe o código:
<?php
/**
* Use an HTML form to create a new entry in the
* users table.
*
*/
require "../config.php";
require "../common.php";
if (isset($_POST['submit'])) {
if (!hash_equals($_SESSION['csrf'], $_POST['csrf'])) die();
try {
$connection = new PDO($dsn, $username, $password, $options);
$new_user = array(
"firstname" => $_POST['firstname'],
"lastname" => $_POST['lastname'],
"email" => $_POST['email'],
"age" => $_POST['age'],
"location" => $_POST['location']
);
$sql = sprintf(
"INSERT INTO %s (%s) values (%s)",
"users",
implode(", ", array_keys($new_user)),
":" . implode(", :", array_keys($new_user))
);
$statement = $connection->prepare($sql);
$statement->execute($new_user);
} catch(PDOException $error) {
echo $sql . "<br>" . $error->getMessage();
}
}
?>
<?php require "templates/header.php"; ?>
<?php if (isset($_POST['submit']) && $statement) : ?>
<blockquote><?php echo escape($_POST['firstname']); ?> successfully added.</blockquote>
<?php endif; ?>
<h2>Add a user</h2>
<form method="post">
<input name="csrf" type="hidden" value="<?php echo escape($_SESSION['csrf']); ?>">
<label for="firstname">First Name</label>
<input type="text" name="firstname" id="firstname">
<label for="lastname">Last Name</label>
<input type="text" name="lastname" id="lastname">
<label for="email">Email Address</label>
<input type="text" name="email" id="email">
<label for="age">Age</label>
<input type="text" name="age" id="age">
<label for="location">Location</label>
<input type="text" name="location" id="location">
<input type="submit" name="submit" value="Submit">
</form>
<a href="index.php">Back to home</a>
<?php require "templates/footer.php"; ?>
Caso a variável $_POST[‘submit’] existir o arquivo php executará a instrução de Insert no banco de dados com os dados submetidos.
Como ler dados do banco usando PDO
A leitura dos dados é realizada a cada vez que a página Read.php é executada. Observe:
<?php
/**
* Function to query information based on
* a parameter: in this case, location.
*
*/
require "../config.php";
require "../common.php";
if (isset($_POST['submit'])) {
if (!hash_equals($_SESSION['csrf'], $_POST['csrf'])) die();
try {
$connection = new PDO($dsn, $username, $password, $options);
$sql = "SELECT *
FROM users
WHERE location = :location";
$location = $_POST['location'];
$statement = $connection->prepare($sql);
$statement->bindParam(':location', $location, PDO::PARAM_STR);
$statement->execute();
$result = $statement->fetchAll();
} catch(PDOException $error) {
echo $sql . "<br>" . $error->getMessage();
}
}
?>
<?php require "templates/header.php"; ?>
<?php
if (isset($_POST['submit'])) {
if ($result && $statement->rowCount() > 0) { ?>
<h2>Results</h2>
<table>
<thead>
<tr>
<th>#</th>
<th>First Name</th>
<th>Last Name</th>
<th>Email Address</th>
<th>Age</th>
<th>Location</th>
<th>Date</th>
</tr>
</thead>
<tbody>
<?php foreach ($result as $row) : ?>
<tr>
<td><?php echo escape($row["id"]); ?></td>
<td><?php echo escape($row["firstname"]); ?></td>
<td><?php echo escape($row["lastname"]); ?></td>
<td><?php echo escape($row["email"]); ?></td>
<td><?php echo escape($row["age"]); ?></td>
<td><?php echo escape($row["location"]); ?></td>
<td><?php echo escape($row["date"]); ?> </td>
</tr>
<?php endforeach; ?>
</tbody>
</table>
<?php } else { ?>
<blockquote>No results found for <?php echo escape($_POST['location']); ?>.</blockquote>
<?php }
} ?>
<h2>Find user based on location</h2>
<form method="post">
<input name="csrf" type="hidden" value="<?php echo escape($_SESSION['csrf']); ?>">
<label for="location">Location</label>
<input type="text" id="location" name="location">
<input type="submit" name="submit" value="View Results">
</form>
<a href="index.php">Back to home</a>
<?php require "templates/footer.php"; ?>
Para realizar a leitura você informa qual a localização do usuário e o sistema realizará um filtro para selecionar todos os usuários daquela localidade.
Vantagens da utilização do PDO
Utilizando o PDO isola a responsabilidade de conexão com a base de dados e poderíamos alterar a base de dados a qualquer momentos sem prejudicar o funcionamento do sistema. Download do exemplo no GitHub