FAQ
PHP Manual

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.

  1. Eu ouvi que é possível acessar o Microsoft SQL Server através do PHP. Como?
  2. Consigo acessar bases de dados Microsoft Access?
  3. 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?
  4. Por que recebo um erro que parece com isto: "Warning: 0 is not a MySQL result index in <file> on line <x>" ou "Warning: Supplied argument is not a valid MySQL result resource in <file> on line <x>"?
Eu ouvi que é possível acessar o Microsoft SQL Server através do PHP. Como?

Em máquinas Unix você pode utilizar o PDO_ODBC ou a API ODBC Unificada.

Em máquinas Windows você também pode utilizar PDO_SQLSRV ou SQLSRV.

Veja também a resposta da questão seguinte.

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 o Microsoft Access em uma box Windows será necessário instalar os drivers ODBC para Unix. » OpenLink Software possui drivers para sistemas baseados em Unix que podem fazer isto.

Outra alternativa é usar um servidor SQL que possua drivers Windows ODBC e utilizá-los para armazenar os dados, que você pode então acessar através do Microsoft Access (usando ODBC) e do PHP (usando os drivers já existentes), ou usando um formato de arquivo intermediário que o Microsoft Access e o 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 intermediária não é uma boa ideia, quando você pode usar o ODBC do PHP diretamente para a base de dados - por exemplo, com os drivers fornecidos pela OpenLink. Se você precisar utilizar um formato de 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 o 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 banco de dados, e configura uma conta de usuário, quando você deve colocar % no campo host, ou o hostname da máquina Windows com a qual você deseja acessar o MySQL. Anote o nome do seu servidor, o usuário e a senha.
  • Baixe o driver MyODBC para Windows através do site oficial do MySQL. Instale-o em sua máquina Windows. Você pode testar a operação com os utilitários inclusos 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 o 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 ao 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 e o 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 servidor MySQL! Você também pode construir queries, importar/exportar tabelas para MySQL, construir forumlários e relatórios, etc.

Dicas e Truques:

  • Você pode construir suas tabelas no Access e exportá-las para o MySQL, e 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 conectá-la novamente no Access. Vá para tools > add-ins > linked table manager, vá até seu ODBC DSN, e selecione a tabela para conectá-la novamente a partir de lá. Você também pode mover seu fonte dsn por ali, apenas selecione o checkbox "always prompt for new location" 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 uma API procedural quanto uma API orientada a objetos, sendo que a versão procedural é similar à 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.

Por que recebo um erro que parece com isto: "Warning: 0 is not a MySQL result index in <file> on line <x>" ou "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;
}
?>
ou
<?php

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


FAQ
PHP Manual