Como acessar o banco de dados com PHP7: mysqli ou PDO?
5 min5 minutos de leitura
5 min5 minutos de leitura
Autor(a)
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
Inscreva-se em nossa Newsletter
Fique por dentro de conteúdos, insights e oportunidades do universo tech. Receba novidades e lançamentos direto no seu e-mail.
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!
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 do php para realizar a conexão! Então, ao desenvolver uma query com a extensão temos algo como:
Ó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:
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:
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:
publicfunctionbuscaPorNome(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:
publicfunctionbuscaPorNome(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