Aula 08 - Criando a persistência de dados via PDO

Introdução

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 BD 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.

2- 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.

3- 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.


4- Realizando a leitura de dados na base de dados

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.

5- 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

Aula 08 - Criando a persistência de dados via PDO Aula 08 - Criando a persistência de dados via PDO Reviewed by Vinicius dos Santos on 05:59:00 Rating: 5

Nenhum comentário

Escreve ai sua opinião!