update page now
PHP 8.5.2 Released!

odbc_connect

(PHP 4, PHP 5, PHP 7, PHP 8)

odbc_connectConecta a uma fonte de dados

Descrição

odbc_connect(
    string $dsn,
    ?string $user = null,
    #[\SensitiveParameter] ?string $password = null,
    int $cursor_option = SQL_CUR_USE_DRIVER
): Odbc\Connection|false

O ID de conexão retornado por essas funções é necessário para outras funções ODBC. Podem existir várias conexões abertas ao mesmo tempo, desde que usem bancos de dados diferentes ou credenciais diferentes.

Com alguns drivers ODBC, a execução de um procedimento armazenado complexo pode falhar com um erro semelhante a: "Não é possível abrir um cursor em um procedimento armazenado que contenha algo diferente de uma única instrução SELECT". Usar SQL_CUR_USE_ODBC pode evitar esse erro. Além disso, alguns drivers não suportam o parâmetro row_number opcional em odbc_fetch_row(). SQL_CUR_USE_ODBC também pode ajudar nesse caso.

Parâmetros

dsn

O nome da fonte do banco de dados para a conexão. Como alternativa, uma string de conexão sem DSN pode ser usada.

user

O nome de usuário. Este parâmetro é ignorado se dsn contiver uid. Para conectar sem especificar o parâmetro user, use null.

password

A senha. Este parâmetro é ignorado se dsn contiver pwd. Para conectar sem especificar o parâmetro password, use null.

cursor_option

Este parâmetro define o tipo de cursor a ser usado para esta conexão. Este parâmetro normalmente não é necessário, mas pode ser útil para solucionar problemas com alguns drivers ODBC.

As seguintes constantes são definidas para o tipo de cursor:

  • SQL_CUR_USE_IF_NEEDED
  • SQL_CUR_USE_ODBC
  • SQL_CUR_USE_DRIVER

Valor Retornado

Retorna uma conexão ODBC, ou false em caso de falha.

Registro de Alterações

Versão Descrição
8.4.0 odbc agora espera uma instância de Odbc\Connection; anteriormente, esperava um resource.
8.4.0 Esta função agora retorna uma instância de Odbc\Connection; anteriormente, retornava um resource.
8.4.0 user e password agora podem ser nulos e também são opcionais e têm o valor padrão null.
8.4.0 Anteriormente, usar uma string vazia para password não incluiria pwd na string de conexão gerada para dsn. Agora é gerada para uncluir um pwd que tem uma string vazia como seu valor. Para restaurar o comportamento anterior, password agora pode ser definido para null.
8.4.0 Anteriormente, se dsn contivesse uid ou pwd, os parâmetros user e password seriam ignorados. Agora, user somente é ignorado se dsn contiver uid, e password somente é ignorado se dsn contiver pwd.

Exemplos

Exemplo #1 Conexões sem DSN

<?php
// Microsoft SQL Server usando o Driver ODBC SQL Native Client 10.0 - permite conexão ao SQL 7, 2000, 2005 e 2008
$connection = odbc_connect("Driver={SQL Server Native Client 10.0};Server=$server;Database=$database;", $user, $password);

// Microsoft Access
$connection = odbc_connect("Driver={Microsoft Access Driver (*.mdb)};Dbq=$mdbFilename", $user, $password);

// Microsoft Excel
$excelFile = realpath('C:/ExcelData.xls');
$excelDir = dirname($excelFile);
$connection = odbc_connect("Driver={Microsoft Excel Driver (*.xls)};DriverId=790;Dbq=$excelFile;DefaultDir=$excelDir" , '', '');
?>

Veja Também

  • Para conexões persistentes: odbc_pconnect() - Abre uma conexão persistente com o banco de dados

add a note

User Contributed Notes 3 notes

up
20
fr at freedom2ct dot com
6 years ago
Under Windows odbc_connect (and PDO ODBC) apparently uses the Windows locale to handle input and output from e.g. MS access and MS SQL Server databases.

This causes lots of headaches if one is using other than ASCII characters.

Work-round solutions like utf8_encode and mb_convert both fails.

The solution I fund working is to perform the following changes to Windows

Control Panel > Region > Administrative > Change system locale
>Check '<i>Use Unicode UTF-8 for worldwide language support.</i>'
up
6
nunya at damn dot biz
5 years ago
One additional note regarding odbc_pconnect  and possibly other variations of pconnect:

If the connection encounters an error (bad SQL, incorrect request, etc), that error will return with  be present in odbc_errormsg for every subsequent action on that connection, even if subsequent actions don't cause another error.

For example:

A script connects with odbc_pconnect.
The connection is created on it's first use.
The script calls a query "Select * FROM Table1".
Table1 doesn't exist and odbc_errormsg contains that error.

Later(days, perhaps), a different script is called using the same parameters to odbc_pconnect.
The connection already exists, so it is reused.
The script calls a query "Select * FROM Table0".
The query runs fine, but odbc_errormsg still returns the error about Table1 not existing.

I'm not seeing a way to clear that error using odbc_ functions, so keep your eyes open for this gotcha or use odbc_connect instead.
up
3
lffranco at dco.pemex.com
22 years ago
As always Microsoft is clueless... I've been trying to connect to an Access database on a W2K on the network (not a local file, but mapped on the V: drive), via ODBC.

All I got is this message:
Warning: SQL error: [Microsoft][ODBC Microsoft Access Driver] '(unknown)' is not a valid path. Make sure that the path name is spelled correctly and that you are connected to the server on which the file resides., SQL state S1009 in SQLConnect in d:\apache\cm\creaart.php on line 13

So... I started looking al around and looks like the ODBC driver has some severe problems:

1. It cannot access a Access database via a mapped drive. And this is for ANY application, name it PHP, Coldfusion, whatever
2. You cannot make a system DSN with a UNC (\\Server\resource), so you must map the drive

Cute isn't it?

So... I quit on ODBC and went via ADO, this is the code that works:

=== CODE ===

$db = '\\\\server\\resource\\db.mdb';
$conn = new COM('ADODB.Connection');
$conn->Open("DRIVER={Driver do Microsoft Access (*.mdb)}; DBQ=$db");

// Driver do Microsoft Access (*.mdb)
// must be the name in your odbc drivers, the one you get
// from the Data Sources (ODBC).
// In this case, I'm in Mexico but the driver name is in portuguese, thanks Microsoft.

$sql = 'SELECT username FROM tblUsuarios';
$res = $conn->Execute($sql);
while (!$res->EOF)
{
    print $res->Fields['username']->Value . "<br>";
    $res->MoveNext();
}

$res->Close(); 
$conn->Close(); 
$res = null; 
$conn = null;

=== /CODE ===
To Top