update page now
PHP 8.5.2 Released!

odbc_connect

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

odbc_connectConectar a una fuente de datos

Descripción

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

El identificador de conexión devuelto por esta función es necesario para otras funciones ODBC. Puede tener múltiples conexiones abiertas a la vez siempre que utilicen diferentes bases de datos o diferentes credenciales.

Con algunos controladores ODBC, ejecutar un procedimiento almacenado complejo puede fallar con un error similar a: "No se puede abrir un cursor en un procedimiento almacenado que tenga algo más que una única sentencia SELECT". Usar SQL_CUR_USE_ODBC puede evitar ese error. Además, algunos controladores no soportan el parámetro opcional row_number en odbc_fetch_row(). SQL_CUR_USE_ODBC podría ayudar en ese caso también.

Parámetros

dsn

El nombre de la fuente de datos para la conexión. Alternativamente, se puede usar una cadena de conexión sin DSN.

user

El nombre de usuario. Este parámetro se ignora si dsn contiene uid. Para conectar sin especificar un user, use null.

password

La contraseña. Este parámetro se ignora si dsn contiene pwd. Para conectar sin especificar una password, use null.

cursor_option

Esto establece el tipo de cursor a utilizar para esta conexión. Este parámetro normalmente no es necesario, pero puede ser útil para solucionar problemas con algunos controladores ODBC.

Las siguientes constantes están definidas para cursortype:

  • SQL_CUR_USE_IF_NEEDED
  • SQL_CUR_USE_ODBC
  • SQL_CUR_USE_DRIVER

Valores devueltos

Devuelve una conexión ODBC, o false si ocurre un error.

Historial de cambios

Versión Descripción
8.4.0 odbc ahora espera una instancia de Odbc\Connection; anteriormente, se esperaba un resource.
8.4.0 Esta función ahora devuelve una instancia de Odbc\Connection; anteriormente, se devolvía un resource.
8.4.0 user y password ahora pueden ser nulos, también son opcionales y valen por omisión null.
8.4.0 Anteriormente, el uso de una cadena vacía para password no incluía pwd en la cadena de conexión generada para dsn. Ahora, pwd se incluye en la cadena de conexión, con un valor de cadena vacía. Para restaurar el comportamiento anterior, password puede ser definido como null.
8.4.0 Anteriormente, si dsn contenía uid o pwd, entonces los parámetros user y password eran ignorados. Ahora, user solo es ignorado si dsn contiene uid, y password solo es ignorado si dsn contiene pwd.

Ejemplos

Ejemplo #1 Conexiones sin DSN

<?php
// Microsoft SQL Server usando el controlador ODBC SQL Native Client 10.0 - permite conexión a SQL 7, 2000, 2005 y 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" , '', '');
?>

Ver también

  • Para conexiones persistentes: odbc_pconnect() - Abre una conexión de base de datos persistente

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