PHP 5.4.36 Released

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, e um dia será descontinuada sendo no fim removida do PHP. Por ser uma extensão popular este será um processo demorado, mas é fortemente recomendado que sejam escritos 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());
?>

add a note add a note

User Contributed Notes 5 notes

up
3
knb at gfz-potsdam dot de
10 years ago
This is a crucial piece of information for SYBASE users:

If you are using the free, but old, 11.x client libs from sybase,
then compile with option  "--with-sybase-ct=$SYBASE"
substitute $SYBASE with the appropriate directory name.

option --with-sybase (without ct) can somehow be used to talk to old MS-SQL servers, but only with the 11.x client libs.

If you are using free, or have legally obtained, 12.x client libs from sybase, then compile with option  "--with-sybase-ct=$SYBASE/$SYBASE_OCS"
substitute $SYBASE/$SYBASE_OCS with the appropriate directory name.
up
0
plandis98 at yahoo dot com
9 years ago
If one is using PHP on Windows to connection to MS SQL Server and does not want to pass credentials via the mssql_connect but instead use MS Connectionless NT Authentication, what is the proper syntax/usage? 

I believe you want to turn on secure_connection in php.ini file:
; Use NT authentication when connecting to the server
mssql.secure_connection = On
up
0
djlopez at gmx dot de
9 years ago
How to compile PHP5 when you have installed mysql, but
- you can't find the "mysql header files" or
- get this error: Cannot find MySQL header files under /usr/

If you want to use mysql 4.0 (*not* 4.1 or even higher!) just download & extract the latest mysql4.0 binary distribution to e.g.
/root/mysql40/

but don't start it (it even should not work, if you have a mysql server already running)

Then use --with-mysql=/root/mysql4 within your php5 configuration.

After compiling/installing (make, make install), you may delete the /root/mysql40/ directory, or keep it for later versions of php5.
up
-1
Anonymous
9 years ago
Just a quick note which may help Windows users setting up PHP/Apache/MySQL.  I was receiving these two error messages on Apache startup: 1) "The procedure entry point mysql_thread_end could not be located in the dynamic link library LIBMYSQL.dll" and 2) "PHP Startup: Unable to load dynamic library '<my php installation dir>/ext/php_mysql.dll' - The specified procedure could not be found".  After checking that libmysql.dll did exist in my root PHP install dir, and that this dir was in my path, I determined that the problem was an older version of libmysql.dll.  My solution was to search all harddrives for this file (I found 6 copies of 5 different versions), and rename all of them except my PHP install dir copy.  PHP, Apache and MySQL all function as expected after making this change.
up
-4
ashay dot chaudhary at microsoft dot com
4 years ago
Q: I heard it's possible to access Microsoft SQL Server from PHP. How?

"On Windows machines, you can simply use the included ODBC support and the correct ODBC driver."
There is a better solution now, download the SQL Server Driver for PHP from Microsoft's Download Center, it is officially supported by Microsoft.

Source code: sqlsrvphp.codeplex.com
To Top