usar - php mysql pdo or mysqli




mysqli ou PDO-quais são os prós e contras? (9)

Aqui está outra coisa para se ter em mente: Por enquanto (PHP 5.2) a biblioteca PDO está com bugs . Está cheio de bugs estranhos. Por exemplo: antes de armazenar um PDOStatement em uma variável, a variável deve ser unset() para evitar uma tonelada de bugs. A maioria destes foi corrigida no PHP 5.3 e eles serão lançados no início de 2009 no PHP 5.3, que provavelmente terá muitos outros bugs. Você deve se concentrar em usar o PDO para PHP 6.1, se você quer uma versão estável e usar o PDO para PHP 5.3, se você quiser ajudar a comunidade.

Em nosso lugar, estamos divididos entre usar o mysqli e o PDO para coisas como instruções preparadas e suporte a transações. Alguns projetos usam um, alguns o outro. Há poucas probabilidades realistas de nos mudarmos para outro SGBDR.

Eu prefiro PDO pela única razão que permite parâmetros nomeados para instruções preparadas, e tanto quanto sei, o mysqli não.

Existem outros prós e contras para escolher um sobre o outro como padrão, à medida que consolidamos nossos projetos para usar apenas uma abordagem?


Bem, você poderia argumentar com o aspecto orientado a objetos, as declarações preparadas, o fato de que se torna um padrão, etc. Mas eu sei que na maioria das vezes, convencer alguém trabalha melhor com um recurso matador. Então é isso:

Uma coisa muito legal com o PDO é que você pode buscar os dados, injetando-os automaticamente em um objeto. Se você não quiser usar um ORM (porque é apenas um script rápido), mas você gosta de mapeamento de objetos, é realmente legal:

class Student {

    public $id;
    public $first_name;
    public $last_name

    public function getFullName() {
        return $this->first_name.' '.$this->last_name
    }
}

try 
{
    $dbh = new PDO("mysql:host=$hostname;dbname=school", $username, $password)

    $stmt = $dbh->query("SELECT * FROM students");

    /* MAGIC HAPPENS HERE */

    $stmt->setFetchMode(PDO::FETCH_INTO, new Student);


    foreach($stmt as $student)
    {
        echo $student->getFullName().'<br />';
    } 

    $dbh = null;
}
catch(PDOException $e)
{
    echo $e->getMessage();
}

Há uma coisa a ter em mente.

O Mysqli não suporta a função fetch_assoc () que retornaria as colunas com chaves representando os nomes das colunas. É claro que é possível escrever sua própria função para fazer isso, não é nem muito longo, mas eu realmente tive dificuldade em escrevê-la (para os não-crentes: se parecer fácil para você, tente por conta própria algum tempo e não faça isso) t enganar :))


Mover um aplicativo de um banco de dados para outro não é muito comum, mas mais cedo ou mais tarde você pode se ver trabalhando em outro projeto usando um RDBMS diferente. Se você está em casa com o PDO, então haverá pelo menos uma coisa a menos para aprender nesse ponto.

Além disso, acho a API do PDO um pouco mais intuitiva e me sinto mais orientada a objetos. O mysqli parece que é apenas uma API processual que foi objetivada, se você sabe o que quero dizer. Em suma, acho mais fácil trabalhar com o DOP, mas isso é obviamente subjetivo.


No sentido de velocidade de execução, o MySQLi ganha, mas a menos que você tenha um bom wrapper usando o MySQLi, suas funções lidando com declarações preparadas são terríveis.

Ainda há erros no meu, mas se alguém quiser, aqui está .

Então, resumindo, se você está procurando por um ganho de velocidade, então o MySQLi; Se você quiser facilidade de uso, então PDO.


O PDO é o padrão, é o que a maioria dos desenvolvedores espera usar. O mysqli era essencialmente uma solução sob medida para um problema em particular, mas tem todos os problemas das outras bibliotecas específicas do DBMS. PDO é onde todo o trabalho duro e pensamento inteligente irá.


Outra notável diferença (boa) sobre o PDO é que o método PDO::quote() adiciona automaticamente as aspas, enquanto mysqli::real_escape_string() (e similares) não:

PDO :: quote () coloca aspas em torno da string de entrada (se necessário) e escapa caracteres especiais dentro da string de entrada, usando um estilo de aspas apropriado para o driver subjacente.


Pessoalmente eu uso PDO, mas acho que é principalmente uma questão de preferência.

O PDO tem alguns recursos que ajudam na injeção de SQL ( instruções preparadas ), mas se você for cuidadoso com seu SQL, você pode conseguir isso com o mysqli também.

Mudar para outro banco de dados não é tanto um motivo para usar o PDO. Contanto que você não use "recursos especiais do SQL", poderá alternar de um banco de dados para outro. No entanto, assim que você usar, por exemplo, "SELECT ... LIMIT 1" você não pode ir para o MS-SQL, onde é "SELECT TOP 1 ...". Então isso é problemático de qualquer maneira.


Resposta editada

Depois de ter alguma experiência com essas duas APIs, eu diria que existem dois recursos de nível de bloqueio que tornam o mysqli inutilizável com instruções nativas preparadas.
Eles já foram mencionados em duas excelentes respostas (ainda subestimadas):

  1. Vinculando valores ao número arbitrário de espaços reservados
  2. Retornando dados como um mero array

(ambos também mencionados nesta resposta )

Por alguma razão, o mysqli falhou com ambos.
Hoje em dia tem alguma melhoria para o segundo ( get_result ), mas funciona apenas em instalações do mysqlnd, significa que você não pode confiar nesta função em seus scripts.

No entanto, não tem valor por valor até hoje.

Então, há apenas uma escolha: PDO

Todas as outras razões, como

  • espaços reservados nomeados (esta sintaxe de açúcar é superestimada)
  • suporte a bancos de dados diferentes (ninguém na verdade já usou)
  • buscar em objeto (apenas açúcar de sintaxe inútil)
  • diferença de velocidade (não há nenhum)

não são de importância significativa.

Ao mesmo tempo, essas duas APIs carecem de alguns recursos importantes , como

  • espaço reservado para o identificador
  • espaço reservado para os tipos de dados complexos para tornar a ligação dinâmica menos trabalhosa
  • código de aplicação mais curto.

Assim, para cobrir as necessidades da vida real , é preciso criar sua própria biblioteca de abstração, com base em uma dessas APIs, implementando marcadores de posição analisados ​​manualmente. Neste caso eu prefiro o mysqli, pois tem menor nível de abstração.





database-abstraction