I just spent a couple of hours trying to track down the Exception "Could not find driver". This was despite having ODBC and PDO_ODBC installed, and all of the configuration seemed to be correct.
Turned out the problem was that I used ODBC in upper-case in the dsn. As soon as I changed the dns to "odbc:database" it worked.
As this code used to work a few months ago, this sudden case-sensitivity threw me for a loop. So in case you get this error, check the casing first.ODBC и DB2 PDO драјвер
Почист и полокален преглед на PHP референцата, со задржана структура од PHP.net и подобра читливост за примери, секции и белешки.
ODBC и DB2 PDO драјвер
Референца за `ref.pdo-odbc.php` со подобрена типографија и навигација.
ODBC и PDO драјвер за DB2 (PDO_ODBC)
Вовед
PDO_ODBC е драјвер кој го имплементира интерфејсот PHP Data Objects (PDO) за да овозможи пристап од PHP до бази на податоци преку ODBC драјвери или преку библиотеката IBM DB2 Call Level Interface (DB2 CLI). PDO_ODBC моментално поддржува три различни „вкусови“ на драјвери за бази на податоци:
- ibm-db2
-
Поддржува пристап до сервери IBM DB2 Universal Database, Cloudscape и Apache Derby преку бесплатниот DB2 express-C клиент.
- unixODBC
-
Поддржува пристап до сервери на бази на податоци преку unixODBC менаџерот за драјвери и сопствените ODBC драјвери на базата на податоци.
- generic
-
Нуди опција за компајлирање за менаџери на ODBC драјвери кои не се експлицитно поддржани од PDO_ODBC.
На Windows, php_pdo_odbc.dll мора да се овозможи како екстензија во php.ini. Тој е поврзан со Windows ODBC Driver Manager за да може PHP да се поврзе со која било база на податоци каталогизирана како Системски DSN.
Инсталација
-
PDO_ODBC е вклучен во PHP изворниот код. Можете да го компајлирате PDO_ODBC екстензијата како статички или споделен модул користејќи го следново configure commands.
- ibm_db2
-
За да го изградите PDO_ODBC со ibm-db2 вкус, мора претходно да ги инсталирате DB2 заглавијата за развој на апликации на истата машина на која го компајлирате PDO_ODBC. DB2 заглавијата за развој на апликации се опција за инсталирање во DB2 серверите, а исто така се достапни како дел од DB2 клиентот за развој на апликации, слободно достапен за преземање од IBM developerWorks » веб-страница.
./configure --with-pdo-odbc=ibm-db2,/opt/IBM/db2/V8.1/
Ако не наведете локација за DB2 библиотеки и заглавија до configure команда, PDO_ODBC стандардно користи /home/db2inst1/sqllib.
- unixODBC
-
Ако не наведете локација за unixODBC библиотеки и заглавија до configure команда, PDO_ODBC стандардно користи /usr/local.
./configure --with-pdo-odbc=unixODBC,/usr/local
- generic
-
./configure --with-pdo-odbc=generic,/usr/local,libname,ldflags,cflags
Претходно дефинирани константи
Константите подолу се дефинирани од овој драјвер и ќе бидат достапни само кога екстензијата е компајлирана во PHP или динамички вчитана при извршување. Дополнително, овие константи специфични за драјверот треба да се користат само ако го користите овој драјвер. Користењето атрибути специфични за драјверот со друг драјвер може да резултира со неочекувано однесување. Добиј информации за MySQL хост Константите подолу се дефинирани од овој драјвер и ќе бидат достапни само кога екстензијата е или компајлирана во PHP или динамички вчитана во време на извршување. Покрај тоа, овие константи специфични за драјверот треба да се користат само ако го користите овој драјвер. Користењето атрибути специфични за драјверот со друг драјвер може да резултира со неочекувано однесување. PDO::ATTR_DRIVER_NAME може да се користи за добивање на
-
PDO_ODBC_TYPE(string) -
-
PDO::ODBC_ATTR_USE_CURSOR_LIBRARY(int) -
Псевдоним на
Pdo\Odbc::ATTR_USE_CURSOR_LIBRARY. -
PDO::ODBC_SQL_USE_IF_NEEDED(int) -
Псевдоним на
Pdo\Odbc::SQL_USE_IF_NEEDED. -
PDO::ODBC_SQL_USE_DRIVER(int) -
Псевдоним на
Pdo\Odbc::SQL_USE_DRIVER. -
PDO::ODBC_SQL_USE_ODBC(int) -
Псевдоним на
Pdo\Odbc::SQL_USE_ODBC. -
PDO::ODBC_ATTR_ASSUME_UTF8(bool) -
Псевдоним на
Pdo\Odbc::ATTR_ASSUME_UTF8.
Конфигурација во време на извршување
Поведението на овие функции е под влијание на поставките во php.ini.
| Име | Стандардно | Променливо | Дневник на промени |
|---|---|---|---|
| pdo_odbc.connection_pooling | "strict" | INI_ALL |
|
| pdo_odbc.db2_instance_name | NULL | INI_SYSTEM |
Оваа застарена функција will сигурно ќе биде removed во иднина. |
Еве кратко објаснување на директивите за конфигурација.
-
pdo_odbc.connection_poolingstring -
Дали да се групираат ODBC конекциите. Може да биде една од
"strict","relaxed"or"off"(еднакво на""). Параметарот опишува колку строго менаџерот за конекции треба да биде при совпаѓање на параметрите за конекција со постоечките конекции во пул.strictе препорачаниот стандард и ќе резултира со користење на кеширани конекции само кога сите параметри за конекција се совпаѓаат точно.relaxedќе резултира со користење на кеширани конекции кога се користат слични параметри за конекција. Ова може да резултира со зголемена употреба на кешот, со ризик од протекување информации за конекција помеѓу (на пример) виртуелни хостови.Оваа поставка може да се промени само од php.ini датотека, и влијае на целиот процес; сите други модули вчитани во процесот што ги користат истите ODBC библиотеки ќе бидат засегнати исто така, вклучувајќи го и Обединета ODBC екстензија .
Ги ескејпува специјалните знаци во стринг за употреба во SQL изјаваrelaxedпоклопувањето не треба да се користи на споделен сервер, од безбедносни причини.СоветиОставете ја оваа поставка на стандардната
strictпоставката освен ако немате добра причина да ја промените. -
pdo_odbc.db2_instance_namestring -
Ако го компајлирате PDO_ODBC користејќи го
db2вкус, оваа поставка ја поставува вредноста на променливата на опкружувањето DB2INSTANCE на Linux и UNIX оперативните системи на наведеното име на инстанцата на DB2. Ова му овозможува на PDO_ODBC да ја открие локацијата на DB2 библиотеките и да направи каталогизирани конекции до DB2 базите на податоци.Оваа поставка може да се промени само од php.ini датотека, и влијае на целиот процес; сите други модули вчитани во процесот што ги користат истите ODBC библиотеки ќе бидат засегнати исто така, вклучувајќи го и Обединета ODBC екстензија .
Оваа поставка нема ефект на Windows.
Содржина
- Сега фрла ValueError ако сепараторот, затворачот или бегството се невалидни. Ова го имитира однесувањето на fgetcsv и fputcsv. — Поврзување со ODBC или DB2 бази на податоци
Белешки од корисници 5 белешки
If you want to avoid installing DB2 Connect and/or PECL modules ibm_db2 and PDO_IBM, you can also use IBM DB2 databases trough unixODBC.
If you have DB2 database on a i server you need to install IBM iAccess (http://www.ibm.com/systems/i/software/access/linux/index.html) and unixODBC. Just install the libraries (rpm) and modify configurations in /etc/odbcinst.ini (sample configuration in /opt/ibm/iSeriesAccess/unixodbcregistration) and /etc/odbc.ini.
To my experience this is much easier way than installing DB2 Connect.Using SQL 2005, PDO_ODBC and datetime fields is a royal pain. MSDN documentation on CAST CONVERT shows that there is supposed to be an implicit convert between character types and datetime types. That's true... until you put it in a stored procedure and use variable declarations.
For instance this fails:
declare @date varchar;
SET @date = '20080101';
SELECT cast(@date AS datetime) AS poo
While this succeeds:
declare @date varchar(19);
SET @date = '20080101';
SELECT cast(@date AS datetime) AS poo
The PDO Driver appears to attempt an implicit conversion and so it fails whenever you try to insert data into datetime column types.
So to workaround this nuance in SQL, declare a character column type with explicit width. Then your implicit type conversion will work.Using SQL Server Native Client 11.0 on Linux as a PDO_ODBC driver:
Download the SQL Server Native Client 11.0 on Linux ODBC Driver:
http://www.microsoft.com/download/en/details.aspx?id=28160
Configuration ODBC:
/usr/local/etc/odbcsys.ini
--
[SQL Server Native Client 11.0]
Description = Microsoft SQL Server ODBC Driver V1.0 for Linux
Driver = /opt/microsoft/sqlncli/lib64/libsqlncli-11.0.so.1720.0
UsageCount = 1
/usr/local/etc/odbc.ini
--
[MSSQLServer]
Driver = SQL Server Native Client 11.0
Description = Sample Database
Trace = Yes
Server =
Port = 1433
Database =
Test the connection:
mssqltest.php
--
<?php
putenv('ODBCSYSINI=/usr/local/etc');
putenv('ODBCINI=/usr/local/etc/odbc.ini');
$username = "";
$password = "";
try {
$dbh = new PDO("odbc:MSSQLServer",
"$username",
"$password"
);
} catch (PDOException $exception) {
echo $exception->getMessage();
exit;
}
echo var_dump($dbh);
unset($dbh);
?>MSSQL - PHP on Apache - Linux Redhat
When using php 5.2.10 please beaware of this error:
http://bugs.php.net/bug.php?id=42068
Standard odbc_connect will not work, you must use pdo_odbc
Connecting to MSSQL using pdo odbc - walkthrough..
1. Download and configure FreeTDS with-unixodbc
./configure --prefix=/opt/SYSfreetds --with-unixodbc
make;make test; make install
2. install php-odbc and unixODBC
php-odbc-5.2.10-1.x86_64.rpm
unixODBC.x86_64.x86x64
3. Setup ODBC links
a)
Create a tds.driver file with the following contents
[FreeTDS]
Description = v0.63 with protocol v8.0
Driver = /opt/SYSfreetds/lib/libtdsodbc.so
Register the ODBC driver - the tds.driver file
odbcinst -i -d -f tds.driver
b)
Creating a tds.datasource file - ODBC Data Source with contents:
[SOURCENAME]
Driver=FreeTDS
Description=Test MS SQL Database with FreeTDS
Trace=No
Server=BobTheServer
Port=1433
TDS Version=8.0
Database=youDBname
Register the ODBC data source
odbcinst -i -s -f tds.datasource
Beware that the odbc.ini file will be installed in the current users home directory. This may need to be used if you are using a webserver as the apache home directory could be different.
Ensure .odbc.ini is in apaches home directory, possibly "/var/www"
4. Test the ODBC link on the command line
isql -v SOURCENAME 'username' 'password'
+---------------------------------------+
| Connected! |
| |
| sql-statement |
| help [tablename] |
| quit |
| |
+---------------------------------------+
SQL>
5. Edit /etc/php.ini
Make sure the following is set:
mssql.secure_connection = On
6. Restart apache gracefully
7. PHP to run:
<?
$dbh= new PDO('odbc:SOURCENAME', 'username', 'password');
$stmt = $dbh->prepare("$query");
$stmt->execute();
while ($row = $stmt->fetch()) {
print_r($row);
}
unset($dbh); unset($stmt);
?>
Trouble-shooting:
Please try strace/ truss if you encounter issues. It could be you are referencing wrong libraries somewhere.
Ensure you have restarted apache once the odbc files are in place