(PHP 4, PHP 5, PHP 7, PHP 8)
odbc_connect — Соединяется с источником данных
$dsn,$user = null ,$password = null ,$cursor_option = SQL_CUR_USE_DRIVER Идентификатор соединения, который возвращает функция, потребуется другим ODBC-функциям. Разрешается открывать несколько соединений одновременно, если коннектор установил соединение с разными базами данных или разными учётными данными.
Отдельные ODBC-драйверы, которые выполняют сложные хранимые процедуры, иногда завершаются ошибкой наподобие: "Cannot open a cursor on a stored procedure that has anything other than a single select statement in it" («Невозможно открыть курсор в хранимой процедуре, которая содержит другие команды, кроме одной команды SELECT»). Тип курсора SQL_CUR_USE_ODBC помогает избегать появления этой ошибки. Отдельные драйверы также не поддерживают необязательный параметр row_number в функции odbc_fetch_row() . Курсор SQL_CUR_USE_ODBC также иногда помогает в похожих случаях.
dsnИмя источника базы данных (англ. Database Source Name, DSN) для соединения. Альтернативно функция работает и со строкой соединения без DSN-имени.
user
Имя.
Параметр игнорируется, если dsn содержит uid.
Для подключения без указания user используйте null .
password
Пароль.
Параметр игнорируется, если dsn содержит pwd.
Для подключения без указания password используйте null .
cursor_optionУстанавливает тип курсора для соединения. Обычно этот параметр не требуется, но иногда становится полезным для обхода проблем с отдельными ODBC-драйверами.
Для типа курсора определили следующие константы:
Функция возвращает ODBC-соединение или false , если возникла ошибка.
| Версия | Описание |
|---|---|
| 8.4.0 | Функция теперь возвращает экземпляр соединения Odbc\Connection ; раньше возвращалось значение с типом resource . |
| 8.4.0 |
Параметры user и password теперь допускают
значение null ; они теперь являются необязательными и по умолчанию имеют значение null .
|
| 8.4.0 |
Ранее использование пустой строки для параметра password не включало pwd
в генерируемую строку подключения параметра dsn.
Теперь он генерируется для включения pwd,
который имеет пустую строку в качестве своего значения.
Чтобы восстановить прежнее поведение, в параметр password
теперь можно передать значение null .
|
| 8.4.0 |
Ранее, если dsn содержал uid или pwd,
параметры user и password игнорировались.
Теперь параметр user игнорируется, только если значение параметра dsn
содержит uid, а параметр password игнорируется,
только если значение параметра dsn содержит pwd.
|
Пример #1 Пример соединения без DSN-строки подключения
<?php
// Microsoft SQL Server, который работает через драйвер SQL Native Client 10.0 ODBC Driver, разрешает соединяться
// с серверами SQL 7, 2000, 2005 и 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",
'',
''
);
?>
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>'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.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 ===