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 Unix você pode utilizar o PDO_ODBC ou o Unified ODBC API.

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

Veja também a 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 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());
?>

add a note add a note

User Contributed Notes 3 notes

up
9
knb at gfz-potsdam dot de
13 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
1
plandis98 at yahoo dot com
11 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
-1
doug at unlikelysource dot com
6 months ago
To enable SQL Server access from ubuntu 16.04:

* Run these commands:
```
sudo curl https://packages.microsoft.com/keys/microsoft.asc | sudo apt-key add -
curl https://packages.microsoft.com/config/ubuntu/16.04/prod.list > mssql-release.list
sudo mv mssql-release.list /etc/apt/sources.list.d
sudo apt-get update
sudo ACCEPT_EULA=Y apt-get install msodbcsql unixodbc-dev
sudo apt-get install php7.1-dev
sudo apt-get install autoconf
sudo pecl install pdo_sqlsrv-4.1.6.1
```

*  Confirm ODBC driver installation:
```
odbcinst -q -d -n "ODBC Driver 13 for SQL Server"
```

* Update the php.ini file: run` php --ini` to find the path to your php.ini file
* Add this line to /path/to/php.ini
```
extension=pdo_sqlsrv.so
```
* Run `php -i` to confirm SQLSRV support was added
* NOTE: extensions (on my computer) were installed here:
`/usr/local/lib/php/extensions/no-debug-non-zts-20160303/`

* Test user access directly on the Windows server running MSSQL:
```
sqlcmd -S ip_address -U username -P password -d database -q "select * from table_name"
```
* On the Windows server: open port 1433 in your firewall

* Install the FreeTds utils to test the connection:
```
sudo apt-get install freetds-bin
tsql -H mssql.host.ip.address -U username -P password -D database -p 1433
```

* Formulate the correct DSN (Data Source Name):
    See: http://php.net/manual/en/ref.pdo-sqlsrv.connection.php

* Sample PHP Code:
```
<?php
// Database params
$tcp  = '192.168.3.126';
$port = 1433;
$user = "test";
$password = "Password123";
$database = "test";

// Open connection
try {
   
// Database connect -- use one of the two statements below
   
$dsn 'sqlsrv:Server=tcp:' . $tcp . ',' . $port . ';Database=' . $database;
   
$dbh = new PDO( $dsn, $user, $password, array());
   
// SQL prepare
   
$sql = "SELECT * FROM prospects";
   
$sth = $dbh->prepare($sql);
   
// Execute
   
$sth->execute();
   
// Fetch results
   
$row = $sth->fetch(PDO::FETCH_ASSOC);
    if (
$row) {
       
$output = '<pre>';
       
$output .= implode("\t", array_keys($row)) . PHP_EOL;
       
$output .= implode("\t", $row) . PHP_EOL;
        while (
$row = $sth->fetch(PDO::FETCH_NUM)) {
           
$output .= implode("\t", $row) . PHP_EOL;
        }
    }
} catch (
PDOException $e) {
   
$output .= $e->getMessage();
}
$output .= '</pre>';
echo
$output;
```
To Top