Como acessar o banco de dados com PHP7: mysqli ou PDO?

Como acessar o banco de dados com PHP7: mysqli ou PDO?
André Chaves
André Chaves

Compartilhe

Está com dúvidas sobre como deve acessar o banco de dados com PHP7? Sendo assim, entenda a diferença entre mysqli e PDO.

Com a nova atualização do php de 5.6 para a versão 7, a extensão mysql_* para conexão com banco de dados, já depreciada na versão antiga, deixou de existir! Já se recomendava utilizar as extensões mysqli ou PDO [(PHP Data Objects)](http://php.net/manual/pt_BR/intro.pdo.php) e agora as duas se tornaram nossas únicas opções para essa funcionalidade.

Mas, qual das duas utilizar? As duas fazem a mesma coisa? É comum que este tipo de duvida apareça, até mesmo para quem já conhecia as extensões anteriormente!

Banner da Escola de Programação: Matricula-se na escola de Programação. Junte-se a uma comunidade de mais de 500 mil estudantes. Na Alura você tem acesso a todos os cursos em uma única assinatura; tem novos lançamentos a cada semana; desafios práticos. Clique e saiba mais!

Quando estamos desenvolvendo um sistema em PHP, uma hora ou outra nos deparamos com a necessidade de utilizar um banco de dados. Nesse momento podemos escolher qualquer um: PostgreSQL, MySQL, Oracle, SQLite, entre outros.

O mais comum entre a maioria dos desenvolvedores é o MySQL. Assim, podemos usar a extensão mysqli do php para realizar a conexão! Então, ao desenvolver uma query com a extensão mysqli temos algo como:


<?php $mysqli = new mysqli("localhost", "usuario", "senha", "database");

public function buscaPorNome(String $nome){ 
    $query = "SELECT \* FROM Pessoa WHERE NOME = ? ";

$statement = $mysqli->prepare($query);
$statement->bind_param("s",$nome)
$statement->execute();

$result = $statement->get_result();
$pessoaArray = $result->fetch_assoc();

return $pessoaArray; 
} ?>

Perfeito, realizamos uma busca simples com um parâmetro através da extensão mysqli. Mas, e com PDO? nesse caso ficaria:


<?php $pdo = new PDO('mysql:host=localhost;dbname=database', 'usuario', 'senha');

public function buscaPorNome(String $nome){ 
    $query = "SELECT \* FROM Pessoa WHERE NOME=:nome";

$statement = $pdo->prepare($query); 
$statement->bindValue(":nome",$nome); 
$statement->execute();

$pessoaArray = $stm->fetch(PDO::FETCH_ASSOC);

return $pessoaArray; 
} ?>

Ótimo, as duas formas funcionam e retornam o mesmo array $pessoaArray! Mas, já da pra ver que existem algumas diferenças entre as extensões.

Primeiro que ao instanciar PDO, precisamos de um prefixo mysql antes de passar o host, entretanto, com mysqli, não havia essa necessidade. Isso porque o PDO, ao contrario do Mysqli, consegue trabalhar com vários bancos de dados, então precisamos dizer com qual banco vamos trabalhar.

Caso houvesse uma migração de MySql para PostgreSQL, a única mudança necessária no nosso projeto com PDO seria:


$pdo = new PDO('pgsql:host=localhost;dbname=database', 'usuario', 'senha');

Com mysqli essa migração simples não seria possível!

Outra diferença nos códigos é que com mysqli passamos o atributo $nome do método associado ao atributo ? da query pelo método ->bind_param . Já com PDO definimos um atributo :nome dentro da query e depois relacionamos :nome com $nome pelo método ->bindValue.

Além disso, com mysqli, precisamos especificar o tipo do atributo $nome como String através da letra "s". Isso porque o método ->bind_param segue a estrutura:

php ->bind_param("primeira silaba do tipo do parametro",$parametro)

Já o método ->bindValue segue a seguinte estrutura:

php ->bindValue(":parametroDaQuery",$parametroQueSeraAtribuido)

Isso faz com que a realização de queries em PDO seja muito mais fácil pois sabemos exatamente qual atributo estamos associando. No caso de termos mais de um parametro o código com mysqli ficaria:


public function buscaPorNome(String $nome, Long $id){
     $query = "SELECT \* FROM Pessoa WHERE NOME = ? AND ID = ?";

$statement = $mysqli->prepare($query);
$statement->bind_param("si",$nome,$id); 
$statement->execute();

$result = $statement->get_result();
$arrayPessoa = $result->fetch_assoc();

return $arrayPessoa; }

Agora precisamos seguir a ordem com que os parametros ? foram inseridos na query e especificar o tipo do $id como Int através da letra i. Caso houvesse uma simples mudança na ordem:


$query = "SELECT * FROM Pessoa WHERE ID = ? AND NOME = ?";

precisariamos lembrar de inverter os parametros e as especificações de tipo no método bind_param() para:


$statement->bind_param("is",$id,$nome);

Já com PDO, a mesma situação ficaria:


public function buscaPorNome(String $nome, Int $id){ 
    $query = "SELECT * FROM Pessoa WHERE ID = :id AND NOME = :nome";

$statement = $pdo->prepare($query);
$statement->bindValue(":nome",$nome);
$statement->bindValue(":id",$id);

$statement->execute(); 
$pessoaArray = $stm->fetch(PDO::FETCH_ASSOC);

return $pessoaArray; }

Assim, não importa a ordem dos parâmetros, sempre estamos associando o parâmetro certo!

Com nosso exemplo simples de buscar uma pessoa pelo nome no banco de dados podemos perceber algumas vantagens do PDO e outras do mysqli:

  • Com PDO conseguimos utilizar varios bancos de dados, facilitando possiveis migrações além de nos possibilitar desenvolver códigos mais semanticos, o que facilita muito a manutenção e melhora a legibilidade
  • Com mysqli trabalhamos especificamente com banco de dados MySQL, o que da para essa extensão maior perfomance e algumas funcionalidades a mais

Então, quando devemos utilizar PDO ou mysqli? Para um projeto em que performance é de extrema importância, podemos optar pelo mysqli. Em outro projeto, no qual vamos trabalhar com mais de um banco de dados, podemos optar pelo PDO! Por isso, é importante refletir sobre qual deles utilizar em nossos projetos a partir de nossas necessidades e limitações.

Nesse post a gente viu as principais diferenças entre a extensão mysqli e PDO, um pouco da sintaxe dos dois e como escolher qual deles utilizar em nossos projetos! Mas, e você? Qual você mais utiliza, ou pretende utilizar, no seu dia-a-dia? Comente aqui!

Quer ver mais diferenças entre PDO, mysqli e o antigo mysql_*? Da uma olhada aqui no php.net (Disponível em inglês). Você também pode encontrar tudo sobre PHP e mysqli nos cursos online da alura: PHP e MySQL I e PHP e MySQL II

André Chaves
André Chaves

Instrutor na Caelum e líder técnico na Hefesto Software House. No tempo livre, escritor no blog https://medium.com/code-maestro. Twitter @andrechavesg

Veja outros artigos sobre Programação