Aprenda PHP com PDO

  • Página Inicial
  • Contato!
  • Tudo sobre PHP com PDO Parte 1!
  • Tudo sobre PHP com PDO Parte 2!
  • Tudo sobre PHP com PDO Parte 1

    Criando Conexão

    Para começar, crie um banco de dados com esse código:

    
    create database mercadophp
    default character set utf8
    default collate utf8_general_ci;
    
    use mercadophp;
    create table produto (
        id int not null auto_increment,
        descricao varchar(30) unique,
        qtd int,
        valor decimal(10, 2),
        primary key(id)
    )
    default charset = utf8;
    
    

    Para trabalhar com PDO, crie uma página com o nome dados.php e coloque esse código:

    
    $hostname = "mysql:host=localhost;dbname=mercadophp;charset=utf8";
    $username = "root";
    $password = "";
    
    $conexao = new PDO($hostname, $username, $password);
    
    

    Como visto, a conexão não é muito diferente do mysqli, tirando o fato do hostname ter que indicar não apenas o host, mas também o banco de dados e o charset, na mesma variável. E a conexão é criada com um objeto PDO.

    PS: É possível usarmos outros tipos de bancos de dados, como o PostgreSQL, caso o banco de dados seja PostgreSQL, utilize pgsql, se for Oracle SQL, use oci e se for Microsoft SQL Server, use dblib.

    Só que é necessário tratar os erros da conexão com try catch, dessa forma:

    
    try {
        $conexao = new PDO($hostname, $username, $password);
    }
    catch(PDOException $ex) {
        echo "ERRO: {$ex->getMessage()}";
    }
    
    

    Como isso utiliza orientação a objetos, se torna mais seguro e fácil de criar.

    Salvando com Prepare

    O mesmo código feito na parte anterior em dados.php, coloque numa função, no mesmo arquivo, dessa forma:

    
    function getConnection() {
        $hostname = "mysql:host=localhost;dbname=mercadophp;charset=utf8";
        $username = "root";
        $password = "";
    
        try {
            $conexao = new PDO($hostname, $username, $password);
    
            return $conexao; // Não esqueça do retorno
        }
        catch(PDOException $ex) {
            echo "ERRO: {$ex->getMessage()}";
        }
    }
    
    

    PS: Observe que tem um retorno dentro do try.

    E crie um arquivo PHP com o nome inserir, dessa forma:

    
    include_once "dados.php";
    
    $conn = getConnection(); // Isso cria a conexão.
    
    $sql = "insert into produto (descricao, qtd, valor) values (?, ?, ?)";
    
    $stmt = $conn->prepare($sql); // Isso pega os dados da variável
    
    $stmt->bindValue(1, "Arroz"); // Isso substitui os ? na ordem numérica
    $stmt->bindValue(2, 10);
    $stmt->bindValue(3, 4.50);
    
    if($stmt->execute()) { // Isso executa o SQL
        echo "Salvo com Sucesso!";
    }
    else {
        echo "Erro ao Salvar!";
    }
    
    

    O ideal, no entando, é passar as variáveis, que serão referenciadas, assim:

    
    $descricao = "Farinha";
    $qtd = 10;
    $valor = 10.80;
    
    $stmt = $conn->prepare($sql); // Isso pega os dados da variável
    
    $stmt->bindValue(1, $descricao); // Isso substitui os ? na ordem numérica
    $stmt->bindValue(2, $qtd);
    $stmt->bindValue(3, $valor);
    
    

    Ao invés de números, podemos passar os parâmetros assim:

    
    $sql = "insert into produto (descricao, qtd, valor) values (:desc, :qtd, :val)";
    
    $descricao = "Farinha";
    $qtd = 10;
    $valor = 10.80;
    
    $stmt = $conn->prepare($sql); // Isso pega os dados da variável
    
    $stmt->bindValue(":desc", $descricao); // Isso substitui os ? na ordem numérica
    $stmt->bindValue(":qtd", $qtd);
    $stmt->bindValue(":val", $valor);
    
    

    Salvando com Exec

    Também podemos salvar com exec, dessa forma (podemos criar um arquivo só pra isso):

    
    include_once "dados.php";
    
    $conn = getConnection(); // Isso cria a conexão.
    
    $sql = "insert into produto (descricao, qtd, valor) values ('Sal', 10, 2.50)";
    
    if($conn->exec($sql)) { // Isso executa o SQL
        echo "Salvo com Sucesso!";
    }
    else {
        echo "Erro ao Salvar!";
    }
    
    

    O problema é que dessa forma, apesar de ser mais simples, é mais vulnerável à SQL Injection. Por isso deve se usar consultas preparadas com o bindValue e as interrogações ou labels com dois pontos.

    Consulta com Prepare

    Crie um arquivo com o nome consultas.php e coloque esse código:

    
    include_once "dados.php";
    
    $conn = getConnection(); // Isso cria a conexão.
    
    $sql = "select * from produto";
    
    $stmt = $conn->prepare($sql); // Isso pega os dados da variável
    
    $stmt->execute(); // Isso executa o SQL
    
    $result = $stmt->fetchAll(); // Isso retorna o array com os dados do banco
    
    var_dump($result);
    
    

    Claro que usar o var_dump() vai mostrar os dados de forma complicada de visualizar, nesse caso, substituiremos pelo foreach, assim:

    
    foreach($result as $value) {
        echo "Descrição: " . $value['descricao'] . "<br/>";
    }
    
    

    Da mesma forma, podemos colocar os outros campos do array e colocar ele com tags HTML para ser formatada na página.

    Podemos usar outros parâmetros também, por exemplo:

    
    $sql = "select * from produto where id = :id";
    
    $stmt = $conn->prepare($sql);
    
    $stmt->bindValue(":id", 1);
    
    $stmt->execute();
    
    

    Update com Prepare

    Agora crie um arquivo com o nome update.php, com esse código:

    
    include_once "dados.php";
    
    $conn = getConnection(); // Isso cria a conexão.
    
    $sql = "update produto set descricao = :desc, qtd = :qtd, valor = :val where id = :id";
    
    $descricao = "Farinha de Trigo";
    $qtd = 10;
    $valor = 10.80;
    $id = 2;
    
    $stmt = $conn->prepare($sql); // Isso pega os dados da variável
    
    $stmt->bindValue(":desc", $descricao); // Isso substitui os ? na ordem numérica
    $stmt->bindValue(":qtd", $qtd);
    $stmt->bindValue(":val", $valor);
    $stmt->bindValue(":id", $id);
    
    if($stmt->execute()) {
        echo "Atualizado com Sucesso!";
    }
    else {
        echo "Erro ao Atualizar!";
    }
    
    

    Não tem segredo, pode ver que são poucas as alterações em relação ao inserir.

    Delete com Prepare

    Também não tem segredo em relação ao inserir e atualizar, e é ainda mais fácil, crie um arquivo com o nome deletar.php e coloque o código abaixo:

    
    include_once "dados.php";
    
    $conn = getConnection(); // Isso cria a conexão.
    
    $sql = "delete from produto where id = :id";
    
    $id = 1;
    
    $stmt = $conn->prepare($sql); // Isso pega os dados da variável
    
    $stmt->bindValue(":id", $id); // Isso substitui os ? na ordem numérica
    
    if($stmt->execute()) {
        echo "Deletado com Sucesso!";
    }
    else {
        echo "Erro ao Excluir!";
    }