Codex


Questões sobre banco de dados

Esta seção possui questões comuns sobre a relação entre o PHP e bases de dados. Sim, o PHP pode acessar virtualmente qualquer base de dados disponível atualmente.

Eu ouvi que é possível acessar Microsoft SQL Server através do PHP. Como?

Em máquinas Windows, você pode simplesmente usar o suporte ODBC já incluso e o driver ODBC correto.

Em máquinas UNIX, você pode usar o driver Sybase-CT para acesssar servidores Microsoft SQL porque os protocolos deles (a maioria) compatíveis. A Sybase criou uma » versão livre das bibliotecas necessárias para sistemas Linux. Para outros sistemas operacionais Unix você precisa contactar a Sybase para as bibliotecas corretas. Veja também a resposta para a próxima pergunta.

Consigo acessar bases de dados Microsoft Access?

Sim. Você já possui todas as ferramentas que precisa se estiver rodando em ambiente Windows 9x/Me, ou NT/2000, onde você pode usar o driver ODBC e os drivers ODBC para bases de dados Microsoft Access.

Se você estiver rodando PHP em uma box Unix e quiser conversar com Microsoft Access em uma box Windows será necessário instalar os drivers ODBC para Unix. » OpenLink Software possui drivers para sistemas Unix-based que podem fazer isto.

Outra alternativa é usar um servidor SQL server que possua drivers Windows ODBC e os utilize para armazenar os dados, que você pode então acessar através do Microsoft Access (usando ODBC) e PHP (usando os drivers já existentes), ou usando um formato de arquivo intermediário que Microsoft Access e PHP consigam entender, como arquivos comuns ou bases de dados dBase. Neste ponto Tim Hayes, da OpenLink Software, escreve:

Usar outra base de dados como intermédio não é uma boa ideia, quando você pode usar o ODBC do PHP diretamente à base de dados - i.e. com drivers fornecidos pela OpenLink. Se você precisar utilizar um arquivo intermediário, a OpenLink lançou o Virtuoso (uma engine de base de dados virtual) para NT, Linux e outras plataformas Unix. Por favor visite » nossa página para um download gratuito.

Uma opção que se mostrou funcional é utilizar MySQL e seus drivers MyODBC no Windows e sincronizar as bases de dados. Steve Lawrence disse:

  • Instale MySQL em sua plataforma normalmente. A ultima versão está disponível em » http://www.mysql.com/ Nenhuma configuração especial é necessária, exceto quando você configura um database, e configura uma conta de usuário, você deve colocar % no campo host, ou o hostname da máquina Windows que vocẽ deseja acessar através do MySQL. Crie uma note do seu server name, usuário e senha.
  • Baixe o driver MyODBC para Windows através do site oficil do MySQL. Instale-o em sua máquina Windows. Você pode testar a operação com as utilidades inclusas no programa.
  • Crie um usuário ou dsn de sistema em seu ODBC Administrator, localizado no painel de controle. Crie um nome dsn, entre com seu hostname, usuário, senha, porta, etc para sua base de dados MySQL configurada no passo 1.
  • Instale Access com uma instalação completa, isto dá certeza de que você instalou os add-ins necessários... você precisará, ao menos, ter suporte à ODBC e o gerenciador de tabelas ligadas (linked table manager).
  • Agora a parte divertida! Crie uma nova base de dados Access. Clique com o botão direito na janela de tabelas e selecione Link Tables, ou sob o menu File selecione Get External Data e depois Link Tables. Quando a caixa de navegação de arquivos aparecer, selecione arquivos do tipo: ODBC. Selecione System dsn eo nome do dsn criado no passo 3. Selecione a tabela para ligar, pressione OK, e presto! Agora você consegue abrir a tabela e adicionar/remover/editar dados em seu MySQL server! Você também pode construir queries, importar/exportar tabelas para MySQL, construir forms e reports, etc.

Truques e Dicas:

  • Você pode construir suas tabelas no Access e exportá-las para o MySQL, então conectá-las de volta. Isto torna o processo de criação de tabelas mais rápido.
  • Quando criar tabelas no Access você deve definir uma chave primária para ter acesso à escrita na tabela no Access. Certifique-se de que criou uma chave primária no MySQL antes de conectá-lo ao Access.
  • Se você alterar a tabela no MySQL, você deve conectar-se novamente ao Access. Vá para tools>add-ins>linked table manager, vá até seu ODBC DSN, e selecione a tabela a conectar novamente através de lá. Você também pode mover seu fonte dsn por alí, apenas selecione o checkbox "always prompt for new location checkbox" antes de pressionar OK.

Por que a extensão MySQL (ext/myqsl) que utilizei por mais de 10 anos deve ser evitada? Ela foi descontinuada? O que posso usar em seu lugar? Como posso migrar?

Existem três extensões MySQL, como descrito na seção Escolhendo uma API MySQL. A antiga API não deve ser utlizada, pois está obsoleta desde o PHP 5.5.0 e foi movida para o PECL a partir do PHP 7.0.0. É fortemente recomendado escrever novos códigos utilizando mysqli ou PDO_MySQL.

Scripts de migração não estão disponíveis neste momento, porém a API mysqli possui tanto o formato procedural quanto o orientado a objetos, sendo que o formato procedural é similar ao do ext/mysql.

Não é possível misturar as extensões. Então, por exemplo, passar uma conexão mysqli para PDO_MySQL ou ext/mysql não vai funcionar.

PHP 5 não traz mais consigo as bibliotecas MySQL client, o que isto significa para mim? Eu ainda posso utilizar MySQL no PHP? Ao tentar utilizar MySQL eu recebo erros "function undefined", o que aconteceu?

Sim. Sempre haverá suporte para MySQL no PHP de um jeito ou de outro. A única mudança no PHP 5 é que não virá mais embutida a biblioteca cliente. Algumas das razões:

  • A maioria dos sistemas atulamente já possuem a biblioteca instalada.

  • Dado o item acima, ter múltiplas versões da biblioteca pode ser problemático. Por exemplo, se você ligar mod_auth_mysql à uma versão e o PHP à outra e então habilitar ambas no Apache, você vai receber um lindo e gordo crash. Além disso, a versão trazida no PHP nem sempre funcionava bem com a versão instalada no servidor. O sintoma mais óbvio disto é o desacordo sobre onde encontrar o arquivo mysql.socket no domínio Unix.

  • A manutenção foi de alguma forma negligenciada e foi caindo mais e mais atrás da versão lançada.

  • Versões futuras da biblioteca estão sob licença GPL e, portanto, não conseguimos achar uma forma de realizar upgrades visto que não podemos trazer uma biblioteca GPL em um projeto licença estilo BSD/Apache-style. Interromper a biblioteca no PHP 5 pareceu ser a melhor opção.

Na verdade isto não vai afetar tanta gente. Usuários Unix, ao menos os que sabem o que estão fazendo, tendem a compilar PHP utilizando a biblioteca libmysqlclient presente no sistema simplesmente adicionando a opção --with-mysql/usr quando compilando o PHP. Usuários Windows deverão habilitar a extensão php_mysql.dll dentro do php.ini. Para mais detalhes, veja a Referência para MySQL para instruções de instalação. Certifique-se também de que o libmysql.dll está disponível na variável de sistema PATH. Para mais detalhes em como fazer, leia o FAQ sobre Como eu adiciono meu diretório PHP no PATH do Windows?. Por conta de o libmysql.dll (e muitos outros arquivos relacionados a PHP) existirem na pasta PHP, você vai querer adicionar a pasta do PHP na variável PATH de seu sistema.

Depois de instalar suporte MySQL compartilhado, o Apache despeja erros assim que a libphp4.so é carregada. Como posso consertar isto?

Se suas bibliotecas MySQL estão ligadas através de pthreads isto vai acontecer. Verifique se utilizam ldd. Se estão, pegue o MySQL tarball e compile-o do código-fonte, ou recompile-o através do rpm e remova o switch no arquivo spec que liga o "threaded client code". Estas duas sugestões consertarão isto. Então recompile PHP com as novas bibliotecas MySQL.

Por que recebo um erro que parece com isto: "Warning: 0 is not a MySQL result index in <file> on line <x>" or "Warning: Supplied argument is not a valid MySQL result resource in <file> on line <x>"?

Você está tentando utilizar um result identifier que tem valor 0. O valor 0 indica que sua consulta falhou por algum motivo. Você deverá verificar erros depois de submeter uma consulta e antes de tentar utilizar o result identifier retornado. A forma correta de fazer isto é semelhante à que segue:

<?php

$result
= mysql_query("SELECT * FROM tables_priv");
if (!
$result) {
echo
mysql_error();
exit;
}
?>
or
<?php

$result
= mysql_query("SELECT * FROM tables_priv")
or die(
"Bad query: " . mysql_error());
?>