Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

tesla

PDO: Quando e por que?

Recommended Posts

Quero aqui abrir uma discussão saudável com os amigos do iMasters sobre algo que ultimamente tem sido assunto de destaque no que se relaciona entre PHP e SGDB: PDO. Creio que a maioria saiba o que seja, então não vou me preocupar em explicar a classe. Quero por em questão outro assunto.

 

Quando e por que usar PDO?

Muitos vão me dizer que PDO deve ser utilizado pela mesma explicação do manual, oferecer uma camada de abstração, mesmo que ainda tenhamos que escrever nos padrões SQL de cada SGDB usado.

 

Mas aí é que entra a questão: a maioria dos sistemas são dedicados à somente um SGDB, não existe esta necessidade de termos que trabalhar com mais de um SGDB. Até mesmo porque esta mudança, ou aumento de portabilidade causaria alguns impactos como a própria reescrita de alguns comandos SQL, já que não existe um padrão entre os SGDB's mesmo sendo a SQL uma pseudo-linguagem, ou até mesmo linguagem, chamem como preferirem.

 

Então suponhamos um sistema comum, onde trabalhamos somente com MySQL.

 

  1. Qual seria a vantagem de utilizar a classe PDO?
  2. Porque não utilizar extensões do PHP como a própria MySQL ou Mysqli (versão melhorada da extensão MySQL que é compatível com funcionalidade do MySQL 4.1 ou posterior).
  3. Quando utilizar ela se faz uma necessidade

 

Postem seus pontos de vistas, seus argumentos, suas críticas desde que seja tudo construtivo e sistemático.

 

Obrigado

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não é quando usar.

o PDO é um driver nativo do PHP que tem habilitado em 90% dos servidores, como também dá suporte a vários SGDB's, como também é preciso na execução de querys no banco de dados.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Mas o fato dele ser nativo não quer dizer que é um motivo para utilizá-lo. Vou ser imparcial, dizendo que da mesma forma que as extensões MySQL e Mysqli também são nativas mas não é um motivo para usá-las.

 

E esta parte: "é preciso na execução de querys" ficou meio vaga.

 

Ahh e só mais um problema:

A maioria do pessoal utiliza serviço de hospedagem. Não usam revenda ou dedicados. Então na maioria das vezes não temos acesso ao php.ini. Qual o problema disso? O problema é que na maioria das hospedagens a PDO é exatamente a que vem padrão do PHP, ocorrendo que os únicos drivers que vem habilitados por default são sqlite e sqlite2.

 

Não estou dizendo que PDO é uma classe inútil, de forma alguma. Estou dizendo que creio que em alguns projetos se torna desnecessária uma abstração quando se vai utilizar apenas um SGDB.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Quando e por que usar PDO?

na minha opinião. Use PDO, qndo você achar ou tiver certeza, de que precisará migrar de banco de dados.

Apesar de ter que reescrever boa parte do SQL, pelo menos a abstração do acesso aos dados, estará garantida, e você terá menos trabalho, do que se tivesse que adequar o retorno para cada driver que fosse trocado

 

suponhamos um sistema comum, onde trabalhamos somente com MySQL.
todos os meus são assim, por isso uso mysqli

 

[*]Qual seria a vantagem de utilizar a classe PDO?

podem dizer: 'segurança', 'escalabilidade'(trocar de sgdb como citei acima).

[*]Porque não utilizar extensões do PHP como a própria MySQL ou Mysqli (versão melhorada da extensão MySQL que é compatível com funcionalidade do MySQL 4.1 ou posterior).

mysql_ não, por favor. MySQLi melhorada. Não tem pq usar a mysql_.

 

[*]Quando utilizar ela se faz uma necessidade

a mesma resposta que dei acima.

 

A discussão então muda para PDO versus MySQLi.

Pelos testes de performance que já vi, trabalhando com mysql, a extensão mysqli é mais rápida, e apesar de não oferecer a 'tão vangloriada' segurança, que PDO tem, você é capaz de programar de forma tão segura qnto queira, e não ficar dependente da extensão somente.

 

 

 

creio que em alguns projetos se torna desnecessária uma abstração quando se vai utilizar apenas um SGDB.

concordo com isso. E não estou subestimando a aplicação.

Eu realmente sei, que se meus projetos atuais desenvolvidos chegarem a 5mil visitantes únicos por dia, esse é o máximo.

E também sei que MySQL aguenta isso(pois é oque acontece atualmente), e deve aguentar muito mais.

Compartilhar este post


Link para o post
Compartilhar em outros sites

A principal vantagem em se usar o PDO é que ele fornece métodos abstratos para se trabalhar com diferentes banco de dados.

 

Imagine que hoje você cria uma aplicação usando as funções mysql ou mysqli e daqui um tempo precisa migrar para o banco de dados PostgreSQL, o que você teria que fazer? Mudar todos os códigos da sua aplicação para em vez de mysql ou mysqli usar as funções pg. Já com o PDO, você só precisaria alterar os dados de conexão.

 

Ao contrário do que muitos dizem, o PDO não faz abstração de dados, ele apenas abstrai a chamada aos métodos.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Imagine que hoje você cria uma aplicação usando as funções mysql ou mysqli e daqui um tempo precisa migrar para o banco de dados PostgreSQL, o que você teria que fazer? Mudar todos os códigos da sua aplicação para em vez de mysql ou mysqli usar as funções pg. Já com o PDO, você só precisaria alterar os dados de conexão.

@Leozitho, acho que na verdade é um pouco mais profundo do que apenas isso.

 

Pq se fosse só isso, trabalhando corretamente com uma aplicação OO, eu teria uma camada abstrata Db, onde as demais Models do meu sistema, usariam essa class Db, sem saber qual a implementação interna dela.

Podendo eu fazer um Factory simples, entre mysql_, e pg_, nessa minha Db, e assim, não precisando alterar absolutamente nada nas demais.

 

a 'vantagem' do PDO, é fornecer esse retorno dos dados, e das informações deles, já abstraida. Porém é sim muito possível, nós mesmos programarmos essa abstração.

Por isso 'ter que trocar tudo', não é uma boa justificativa. A consistência, e essa abstração pronta, para não precisarmos reinventar essa roda, seriam os motivos.

 

Porém para sistemas que usam e usarão mysql sempre, tb não vejo motivo de usar PDO.

Compartilhar este post


Link para o post
Compartilhar em outros sites

@William Bruno

 

Na questão da segurança pelo que li, seria basicamente voltado para SQL Injection certo? Ou tem alguma outra vantagem na segurança? Pois SQL Injection ao meu ver, é algo que pode ser contornado facilmente quando se tem como meta uma forma de programar que seja segura e precavida de usuários mal intencionados.

 

@Leozitho

 

Sabe como eu contorno este problema? Simples. Eu crio minha própria classe de abstração. Só que com uma diferença. Ela é dedicada para apenas um SGDB. Vamos supor uma classe Connection. Ela teria alguns métodos como "exeQuery", "disconnect", "rollback". Só que para um sistema X, ela é escrita para MySQL. Caso este sistema X precise migrar para PostgreSQL por exemplo, eu não preciso alterar o sistema todo, mas apenas a classe Connection.

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Leozitho, acho que na verdade é um pouco mais profundo do que apenas isso.

 

Eu não disse que é apenas isso, disse que essa é a principal vantagem do PDO, abstrair a chamada aos métodos. ;)

 

A principal vantagem em se usar o PDO é que ele fornece métodos abstratos para se trabalhar com diferentes banco de dados.

Compartilhar este post


Link para o post
Compartilhar em outros sites

De um modo geraj, o developer deve pensar na finalidade do desenvolvimento.

Se for voltado ao comércio, deve focar nos clientes e suas necessidades.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Concordo com você hinom. Só que dessa forma que eu e creio que o William Bruno criamos a classe de conexão com o banco de dados fica muito fácil trocar de SGDB sem precisar alterar o sistema. E creio também que sempre devemos oferecer o melhor que nossos sistemas podem oferecer.

 

Então se eu disser para o cliente: "O sistema que te ofereço é dotado de X, Y e Z funcionalidades e ele é desenvolvido para MySQL", acho muito difícil ele dizer: "Ahhh mas eu quero PostgreSQL" ou "eu quero Access" e por aí vai. Porque o que a gente tem que visar é se com o SGDB atual, o sistema vai suprir as necessidades do cliente. Logo se o MySQL, ou o PostgreSQL ou o Access suprir o que ele demanda, não vai haver motivo para alterar o SGDB em que o sistema foi desenvolvido.

Compartilhar este post


Link para o post
Compartilhar em outros sites

É bem possível criar um conjunto de classes e interfaces para abstrair, sanitizar, executar e manipular com PHP puro.

 

Vai ser ligeiramente de performance inferior, afinal passará pelo PHP primeiro, mas é possível.

 

Usar a PDO tem suas vantagens? Sim, tem. Mas, com base no William me orientou recentemente, posso dizer que falta-lhe algo importante, que seria abstrair completamente os bancos de dados.

 

O dia que a PDO fizer isso vai se tornar a melhor opção, já que REALMENTE só precisaria alterar o DSN de conexão, uma vez que um mesmo SQL seria compatível em qualquer SGBD suportado.

 

Particularmente, eu uso por comodismo. Já que não há abstração completa, tento fazer minhas queries o mais simples possível, para que rode em qualquer SGBD. Felizmente até hoje não vivenciei nenhum caso de imcompatibilidade, pelo menos não entre os dois SGBD's que uso: MySQL e SQLITE

Compartilhar este post


Link para o post
Compartilhar em outros sites

William Bruno, MySQLi não tem em todos os servidores, mysql_ é lento, e também não oferece todas as funções e métodos que o PDO e MySQL tem, eu sou obrigado a concordar com o Leozitho, se você faz Objeto( class ) para serem reaproveitáveis, você tenta reaproveitar a parte do banco também, coloca na situação do Postgres .. e aí, se o cara tiver que mudar ? ele usando MySQLi ou mysql_, vai ter que mudar código por código, e depois, se o cliente não agradar do banco, quiser mudar para oracle ou firebird ?

Bruno Augusto, você que utiliza PDO, poderia me explicar qual é a vantagem que ele leva na segurança?

Eu não sou o Bruno Augusto, mas vou responder por mim mesmo: Nenhum, você quem faz a segurança utilizando os métodos dele

Compartilhar este post


Link para o post
Compartilhar em outros sites

Mas a extensão mysql_ seria mais lenta que a PDO?

Estou vendo que a solução para o meu sistema será:

Criar 3 classes de conexão com o MySQL. Uma utilizando mysql_, outra com MySQLi e outra com PDO. Mesmo sabendo que minha revenda possui o MySQLi, caso algum cliente queira utilizar o próprio serviço de hospedagem tenho que dar este suporte.

 

@Andrey Knupp

Neste caso seria uma simples solução: mudar a classe de conexão da base do MySQLi ou mysql_, para PDO. Sendo que não terei que alterar nada em meus códigos, além da classe de conexão. Fora que, desenvolvendo mais classes, eu vou ter ela disponível para utilizar em meus outros sistemas.

 

Eu sinceramente utilizaria PDO, mas só se ele tivesse dois pontos:

Viesse como default no PHP e seus drivers não fossem limitados por default nas extensões sqlite e sqlite2.

 

Para mim não seria nenhum problema utilizar PDO, o único problema é que o sistema será vendido às vezes à alguns clientes "chatos", que querem porque querem utilizar um serviço de hospedagem que eles escolheram. Muitas vezes sem a PDO ou sem os drivers habilitados.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Claro, mysql_ é resource cara .. você leu tudo que eu escrevi sobre a situação em troca de SGDB's ?

Não complica o simples amigo, se vai usar mysqli usa mysqli, se vai usar pdo, USA PDO .. eu ainda recomendo que use PDO

pelo fato de migração de banco de dados.

Compartilhar este post


Link para o post
Compartilhar em outros sites

William Bruno, MySQLi não tem em todos os servidores

pelo menos com os que já trabalhei, sempre tive mysqli habilitado.

vale lembrar que mysql_ é lento, e cairá em desuso, então os servidores habilitam mysqli sempre.

 

com PDO não é a mesma coisa.

, mysql_ é lento

é mais lento que as outras opções.

 

se o cara tiver que mudar ?

nos meus sistemas atuais, o cara não tem que mudar. Simples.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Isso, mas você se referiu a você, como em tópicos antigos, o mesmo autor desse relatou que possivelmente ia ter integração via Postgres, agora eu não sei se trata do mesmo sistema relacionado a esse tópico.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bruno Augusto, você que utiliza PDO, poderia me explicar qual é a vantagem que ele leva na segurança?

Com a PDO::prepare(), os dados são sanitizados de acordo com aquilo que é passado para PDOStatement::execute().

 

Não dispensa uma filtragem e uma validação, mas é uma coisa a menos para se preocupar.

 

William Bruno, MySQLi não tem em todos os servidores, mysql_ é lento, e também não oferece todas as funções e métodos que o PDO e MySQL tem, eu sou obrigado a concordar com o Leozitho, se você faz Objeto( class ) para serem reaproveitáveis, você tenta reaproveitar a parte do banco também, coloca na situação do Postgres .. e aí, se o cara tiver que mudar ? ele usando MySQLi ou mysql_, vai ter que mudar código por código, e depois, se o cliente não agradar do banco, quiser mudar para oracle ou firebird ?

Bruno Augusto, você que utiliza PDO, poderia me explicar qual é a vantagem que ele leva na segurança?

Eu não sou o Bruno Augusto, mas vou responder por mim mesmo: Nenhum, você quem faz a segurança utilizando os métodos dele

Exato, porém uma pequena parte da segurança já é feita pra você.

 

nos meus sistemas atuais, o cara não tem que mudar. Simples.

Apesar de eu achar essa colocação errada, afinal confia cegamente no usuário final, você tem a seu favor o foco. Ao invés de ficar se arrebentando de testar em trocentos SGBD's, escolhe um e vai embora.

 

Sobre a implementação de abstração, dêem uma olhada nesse mega post do JBN.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Apesar de eu achar essa colocação errada, afinal confia cegamente no usuário final, você tem a seu favor o foco. Ao invés de ficar se arrebentando de testar em trocentos SGBD's, escolhe um e vai embora.

o foco, e os requisitos do projeto.

Sei trabalhar com PDO, poderia muito bem fazer com a lib, para não preciso dela. Seria gordura

 

lembra da frase: "Você não vai precisar disso ?"

pois é :lol:

Compartilhar este post


Link para o post
Compartilhar em outros sites

creio que todo developer que se preze sabe das vantagens e desvantagens, sobre as gorduras, padronizações, sustentabilidade do projeto, etc..

 

quem não sabe vai aprender de uma forma ou de outra.. a maioria aprende quebrando a cara..

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.