quinta-feira, 15 de setembro de 2011

Migrar da extensão do MySQL ao DOP


Este guia é uma visão prática para ajudar você a começar a migrar o seu código PHP existente de usar a antiga extensão MySQL para a nova abstração de banco de dados do DOP. Eu não vou entrar em todos os recursos disponíveis para você com DOP, mas vai compartilhar com você os métodos básicos que você precisa saber e oferecer algumas dicas para que sua migração será tão rápida e indolor possível.



Primeiro, você deve entender de onde DOP senta no ecossistema PHP. Na verdade, existem três formas de interface com um banco de dados MySQL do PHP: o primeiro é com a extensão MySQL, o segundo é com a extensão MySQLi ea terceira é com DOP.
A extensão do MySQL é o mais antigo dos três e foi o desenvolvedores opção original usado para se comunicar com MySQL. A extensão está sendo preterido em favor das outras duas alternativas por causa das melhorias feitas nas versões mais recentes do PHP e MySQL.
MySQLi é a extensão "melhoradas" para trabalhar com bases de dados MySQL. Ela tira proveito de recursos que estão disponíveis em versões mais recentes do servidor MySQL, expõe tanto uma função orientada e uma interface orientada a objetos para o desenvolvedor e faz algumas outras coisas interessantes. Se DOP não está certo para o seu projeto, então esta é a extensão que você deve usar.
Então extensão mais recente é PDO, que significa "PHP Data Objects." DOP oferece uma API que consolida a maioria das funcionalidades que estava anteriormente espalhados por todo o banco de dados de grandes extensões de acesso, ou seja, MySQL, PostgreSQL, SQLite, MSSQL, etc A interface expõe objetos de alto nível para o programador para trabalhar com conexões de banco de dados, consultas e conjuntos de resultados, e controladores de baixo nível executar a comunicação e manipulação de recursos com o servidor de banco de dados. Um monte de discussão e trabalho está indo para DOP e é considerado o método adequado de se trabalhar com bases de dados em código, moderno e profissional.
Quando possível, eu recomendo que as pessoas pular o homem médio, por assim dizer e migrar da extensão MySQL para DOP em vez de MySQLi. DOP oferece uma API consistente para trabalhar com uma variedade de bases de dados, assim você não terá que modificar seu código PHP, se você nunca tem que usar outro banco de dados. Além disso, enquanto a extensão MySQLi é atualmente mantido, há sempre a chance pode ser obsoleto no futuro. Escolhendo a migrar para DOP agora significa que você não terá que migrar para mais tarde e atualizar o código duas vezes. Eu uso DOP e você deve também!
Instalando e configurando DOP
Uma vez que você decidiu que você quer modernizar seu código, você vai precisar para fazer DOP certeza está devidamente instalado e configurado. Como mencionei antes, DOP consiste de duas partes: a extensão em si, que expõe a interface e um baixo nível de banco de dados específicos de driver. Drivers existem para uma lista crescente de bancos de dados , incluindo MySQL.
DOP eo driver SQLite específicas deveria ser parte da instalação padrão do PHP a partir da versão 5.1.0 eo driver MySQL-específicas ainda precisam ser instalados, mas a maioria das distribuições Linux muitas vezes têm idéias diferentes como o PHP deve ser compilado e empacotado. De fato, muitos dos principais distros agora o pacote de extensão MySQL, a extensão MySQLi ea MySQL driver PDO juntos no mesmo pacote. Provavelmente, se você está usando o MySQL em um sistema desse tipo, em seguida, DOP provavelmente já está configurado para você.
Ubuntu constrói PHP com DOP (mas não o pacote de driver SQLite por padrão) e agrupa as extensões MySQL e motorista. Você pode instalar as extensões e motorista executando sudo apt-get install php5-mysql .
O Fedora também pacotes de extensões e motorista juntos, mas pacotes PDO como um módulo carregável. Executando sudo yum install php-mysql instala as extensões MySQL e motorista eo php-pdo pacote será automaticamente incluído como uma dependência.
SUSE é a única distribuição dos três que constrói a forma como o PHP PHP Equipe recomenda que diz respeito à DOP; que constrói PHP com DOP e incluir o driver SQLite. yast2 - install php5-mysql irá instalar as extensões MySQL e driver que necessita.
No Windows, todos os drivers PDO são incluídos na pasta ext que foi criado quando você instalou o PHP a partir do arquivo do binário pré-compilado é. Você só precisa atualizar seu php.ini adicionando ou descomentando a linha:


extension = php_pdo_mysql.dll


É sempre possível compilar os drivers de si mesmo em um cenário de pior caso. Certifique-se que as bibliotecas MySQL e arquivos de desenvolvimento estão instaladas e acessível em seu ambiente de compilação já que a maioria dos problemas que as pessoas se deparam ao tentar compilar resultados algo quando o compilador não pode encontrar vários arquivos de cabeçalho ou bibliotecas para ligar contra.
Consultando básico
O fluxo de trabalho básico para a utilização de funções a extensão MySQL para trabalhar com um banco de dados pode ser pensado como um processo de cinco etapas:
Estabelecer uma conexão com o servidor de banco de dados e selecione o banco de dados você estará trabalhando com
Construir uma consulta para enviar o servidor
Enviar a consulta
Iterar sobre as linhas de resultados retornado
Liberar os recursos usados ​​pelo resultado e, possivelmente, a conexão do banco de dados


<? Php


/ / Passo 1: Estabelecer uma conexão
$ Db = mysql_connect ( "localhost" , "testusr" , "secretpass" );
mysql_select_db ( "testdb" , $ db );

/ / Passo 2: Construa uma consulta
$ Query = "SELECT * FROM foo ONDE bar = '" . mysql_real_escape_string ( $ zip ). "'" ;


/ / Passo 3: Envie a consulta
$ Result = mysql_query ( $ query , $ db );


/ / Passo 4: iterar sobre os resultados
enquanto ( $ linha = myql_fetch_assoc ( $ result )) {
    print_r ( $ row );
}


/ / Passo 5: Free recursos utilizados
mysql_free_result ( $ result );
mysql_close ( $ db );


Com DOP, o mesmo processo pode ser seguido e se parece com isto:


<? Php


/ / Passo 1: Estabelecer uma conexão
$ Db = novo DOP ( "mysql: host = localhost; dbname = testdb" , "testusr" , "secretpass" );


/ / Passo 2: Construa uma consulta
$ Query = "SELECT * FROM foo ONDE bar =" . $ db -> quote ( $ zip );


/ / Passo 3: Envie a consulta
$ Result = $ db -> query ( $ query );


/ / Passo 4: iterar sobre os resultados
enquanto ( $ row = $ result -> fetch (PDO:: FETCH_ASSOC)) {
    print_r ( $ row );
}


/ / Passo 5: Free recursos utilizados
$ Resultado -> closeCursor ();
$ Db = null;


O processo de conexão com o servidor e selecionando o banco de dados com DOP é realizada usando um DSN em vez do myql_connect () e mysql_select_db () . Um DSN é uma abreviação para "Data Source Name", que é uma string que identifica qual driver PDO usar para se comunicar com o banco de dados e transmite todas as informações essenciais, tais como conexão do servidor host, porta de conexão eo nome do banco de dados. Dependendo do seu banco de dados, o formato do DSN que você fornece pode variar. Os principais componentes necessários para cada driver estão documentados no php.net, mas infelizmente às vezes são difíceis de encontrar. Eu recomendo usar o recurso do site de busca para procurar o termo "DSN" na documentação online .
Notar também que PDO:: quote () tanto escapa e cita um valor enquanto mysql_real_escape () só escapa o valor. Você deve manter isso em mente, para que você não acabar com aspas extras na consulta final e raspar a cabeça se perguntando de onde eles vieram.
Embora às vezes você pode sair sem liberar o recurso de resultado com mysql_free_result () , eu recomendo que você não entrar em hábitos tão preguiçoso quando usando PDO. Se você ainda tem um conjunto de resultados a partir de um SELECIONAR consulta que não tem chamado closeCursor () ainda e você tenta fazer uma instrução INSERT ou ATUALIZAÇÃO sobre a mesa, a mudança pode falhar silenciosamente e, novamente, você vai ficar coçando a cabeça. É melhor fazer um hábito de fazer as coisas corretamente para evitar situações frustrantes mais tarde.
Escavação (ligeiramente) Deeper
O que tem sido coberto até agora é suficiente para você começar em migrar sua aplicação PHP do MySQL para DOP mais rápida e indolor possível, mas há mais a DOP do que eu mostrei. Eu gostaria de destacar também um par de DOP outras características que podem ser úteis: instruções preparadas e tratamento de erros.


Declarações preparadas
A declaração preparada é uma representação de uma consulta como um objeto. O benefício de representar uma consulta como um objeto é que a lógica adicional pode ser associado a ele que seria difícil de gerir para um representação de seqüência plana. Por exemplo, você pode especificar espaços reservados em uma consulta que são então obrigados a variáveis ​​em seu script. Isso é útil se você estiver executando a mesma consulta várias vezes para satisfazer o pedido, mas com parâmetros diferentes. A consulta só precisa ser preparada uma vez, mas pode ser executado várias vezes com diferentes valores como o valor das variáveis ​​mudam.


<? Php
/ / Coleta de informações do usuário para importar para o banco de dados
$ Users = ...


/ / Especificar o "modelo" consulta
$ Query = $ db -> prepare ( "INSERT INTO utilizadores (first_name, last_name, email) VALUES (: fname: lname: e-mail)" );


/ / Bind os nomes de espaço reservado para variáveis ​​script específico
$ Query -> bindParam ( ": fname" , $ firstName );
$ Query -> bindParam ( ": lname" , $ lastName );
$ Query -> bindParam ( ": e-mail" , $ email );
/ / Atribuir valores para as variáveis ​​específicas e executar a consulta
foreach ( $ users como $ u ) {
    FirstName $ = $ u [ "first_name" ];
    LastName $ = $ u [ "last_name" ];
    $ Email = $ u [ "email" ];
    $ Query -> execute ();
}
Os parâmetros não têm de ser citado ou escapou com instruções preparadas porque o subjacente driver automaticamente citações e escapes quaisquer parâmetros ligado para você. Devido a isso, muitas pessoas gostam de usar declarações preparadas para se proteger contra vulnerabilidades de injeção SQL, mesmo que a consulta só é executado uma vez.
Tratamento de erros


Você pode especificar um dos três paradigmas de erro diferente manuseio com DOP usando PDO:: setAttribute () para definir o modo de tratamento de erros.


<? Php
$ Db = novo DOP ( $ dsn , $ user , $ passwd );
$ Db -> setAttribute (PDO:: ATTR_ERRMODE, PDO:: ERRMODE_EXCEPTION);


Os modos são:
Silenciosa Mode ( PDO:: ERRMODE_SILENT ) - define o código de erro interno, mas não interromper a execução do script (esta é a configuração padrão)
Modo de advertência ( PDO:: ERRMODE_WARNING ) - define o código de erro e dispara uma mensagem E_WARNING
Modo de exceção ( PDO:: ERRMODE_EXCEPTION ) - define o código de erro e joga um objeto PDOException
Independentemente de qual modo é definido, há um código de erro interno que é definido e você pode verificar usando o errorCode () e errorInfo () métodos da PDO e PDOStatement objetos. Estes são análogos aos mysql_errno () e mysql_error () . errorCode () retorna uma seqüência de 5 caracteres, conforme definido no SQL ANSI-92 . errorInfo () é geralmente mais útil, pois retorna uma matriz que inclui uma mensagem de erro, além de o código de 5 caracteres.


<? Php
$ Query = "SELECT * FROM foo WHERE query mal formado" ;
$ Result = $ db -> query ( $ query );
$ Erro = $ db -> errorInfo ();
se (! is_null ( $ erro [2])) {
    echo "Consulta falhou!" . $ erro [2];
}
...
Se você estiver usando o modo de exceção, uma descrição do que aconteceu de errado está disponível através do objeto de exceção de getMessage () método.


<? Php
$ Query = "SELECT * FROM foo WHERE query mal formado" ;
try {
    $ Result = $ db -> query ( $ query );
    ...
}
catch (PDOException $ e ) {
    echo $ e -> getMessage ();
}
Conclusão
Agora você deve ter os conhecimentos básicos necessários para iniciar a migração da extensão MySQL mais velhos para a extensão PDO mais recentes. Você viu que enquanto a maioria da DOP tempo já está disponível, é fácil de configurar, se por algum motivo, não é. Você também viu como é fácil se conectar a um servidor de banco de dados MySQL, consultas emitir e receber os resultados. Claro que isso era apenas uma visão prática, para aprender mais sobre o DOP tem para oferecer e como você pode tirar vantagem disso, encorajo-vos a ler a documentação disponível no php.net.

Nenhum comentário :

Postar um comentário

Total de visualizações de página