Windows 64 Caveats with ODBC
I'm pretty sure PHP only accesses the 32-bit ODBC stuff on Windows 64. Therefore, you will need to configure your ODBC DSNs via the Data Source Administrator found at:
/WINDOWS/SysWOW64/odbcad32.exe
CVI. ODBC Funktionen
Einführung
Zusätzlich zur normalen ODBC-Unterstützung bieten die ODBC-Funktionen in PHP auch Schnittstellen zu einigen Datenbanken, die Ihre API der Semantik der ODBC-API nachempfunden haben. Statt vielen nahezu identischen Datenbanktreibern wurden diese Treiber zu einer einzigen Gruppe von ODBC-Funktionen zusammengefasst.
Die folgenden Datenbanken werden von den ODBC-Funktionen unterstützt: » Adabas D, » IBM DB2, » iODBC, » Solid und » Sybase SQL Anywhere.
Anmerkung: Es ist kein echtes ODBC in die Kommunikation mit oben genannten Datenbanken involviert. Es handelt sich um echte native Datenbankschnittstellen, die den Funktionsnamen und den Funktionssyntax der ODBC-Funktionen nutzen. Die Ausnahme ist iODBC. Wenn PHP mit iODBC-Unterstützung kompiliert wird, können alle ODBC-kompatiblen Treiber mit PHP genutzt werden. iODBC wird von » OpenLink Software betreut. Mehr Informationen zu iODBC, unter anderem eine HOWTO, finden Sie auf » www.iodbc.org.
Anforderungen
Um die Datenbanken mit PHP nutzen zu können, sollten die dafür benötigten Bibliotheken installiert sein.
Installation
- --with-adabas[=DIR]
Inkludiert Adabas D Unterstützung. DIR ist das Adabas Installationsverzeichnis. Default ist /usr/local.
- --with-sapdb[=DIR]
Inkludiert SAP DB Unterstützung. DIR ist das SAP DB Installationsverzeichnis. Default ist /usr/local.
- --with-solid[=DIR]
Inkludiert Solid Unterstützung. DIR ist das Solid Installationsverzeichnis. Default ist /usr/local/solid.
- --with-ibm-db2[=DIR]
Inkludiert IBM DB2 Unterstützung. DIR ist das DB2 Installationsverzeichnis. Default ist /home/db2inst1/sqllib.
- --with-empress[=DIR]
Inkludiert Empress Unterstützung. DIR ist das Empress Installationsverzeichnis. Default ist $EMPRESSPATH. Ab PHP4 unterstützt diese Option nur Empress Version 8.60 und höher.
- --with-empress-bcs[=DIR]
Inkludiert Empress Local Access Unterstützung. DIR ist das Empress Installationsverzeichnis. Default ist $EMPRESSPATH. Ab PHP4 unterstützt diese Option nur Empress Version 8.60 und höher.
- --with-birdstep[=DIR]
Inkludiert Birdstep Unterstützung. DIR ist das Birdstep Installationsverzeichnis. Default ist /usr/local/birdstep.
- --with-custom-odbc[=DIR]
Inkludiert benutzerdefinierte ODBC Unterstützung. DIR ist das ODBC Installationsverzeichnis. Default ist /usr/local. Stellen Sie sicher, dass CUSTOM_ODBC_LIBS definiert ist und dass sich eine odbc.h in Ihrem Include Verzeichnis befindet. Z.B sollten Sie folgendes für Sybase SQL Anywhere 5.5.00 auf QNX definieren, bevor Sie das Configure Skript starten: CPPFLAGS="-DODBC_QNX -DSQLANY_BUG" LDFLAGS=-lunix CUSTOM_ODBC_LIBS="-ldblib -lodbc".
- --with-iodbc[=DIR]
Inkludiert iODBC Unterstützung. DIR ist das iODBC Installationsverzeichnis. Default ist /usr/local.
- --with-esoob[=DIR]
Inkludiert Easysoft OOB Unterstützung. DIR ist das OOB Installationsverzeichnis. Default ist /usr/local/easysoft/oob/client. defaults to
- --with-unixODBC[=DIR]
Inkludiert unixODBC Unterstützung. DIR ist das unixODBC Installationsverzeichnis. Default ist //usr/local.
- --with-openlink[=DIR]
Inkludiert OpenLink ODBC Unterstützung. DIR ist das OpenLink Installationsverzeichnis. Default ist /usr/local. Dies ist das gleiche wie iODBC.
- --with-dbmaker[=DIR]
Inkludiert DBMaker Unterstützung. DIR ist das DBMaker Installationsverzeichnis. Default ist, wo die letzte Version von DBMaker installiert ist (wie z.B. /home/dbmaker/3.6).
Um unified ODBC Unterstützung in PHP 3 zu deaktivieren, verwenden Sie die Option --disable-unified-odbc. Nur anwendbar, wenn iODBC, Adabas, Solid, Velocis oder eine spezielle ODBC Schnittstelle aktiviert ist.
Die Windowsversion von PHP enthält diese Erweiterung. Um diese Funktionen zu verwenden, müssen Sie keine zusätzlichen Erweiterungen aktivieren.
Laufzeit Konfiguration
Das Verhalten der ODBC-Funktionen wird von den Einstellungen in der globalen Konfigurationsdatei php.ini bestimmt.
Tabelle 187. ODBC-Konfigurationsoptionen
| Name | Standard | Einstellbar in |
|---|---|---|
| odbc.default_db * | NULL | PHP_INI_ALL |
| odbc.default_user * | NULL | PHP_INI_ALL |
| odbc.default_pw * | NULL | PHP_INI_ALL |
| odbc.allow_persistent | "1" | PHP_INI_SYSTEM |
| odbc.check_persistent | "1" | PHP_INI_SYSTEM |
| odbc.max_persistent | "-1" | PHP_INI_SYSTEM |
| odbc.max_links | "-1" | PHP_INI_SYSTEM |
| odbc.defaultlrl | "4096" | PHP_INI_ALL |
| odbc.defaultbinmode | "1" | PHP_INI_ALL |
Weitere Informationen und Definitionen der PHP_INI_*- Einstellungen finden Sie bei ini_set().Anmerkung: Mit * markierte Einträge sind noch nicht implementiert.
Hier eine kurze Erklärung der Konfigurationsoptionen:
- odbc.default_db string
Standard-ODBC-Datenquelle, wenn in odbc_connect() oder odbc_pconnect() keine definiert wird.
- odbc.default_user string
Nutzername, wenn in odbc_connect() oder odbc_pconnect() keiner angegeben wird.
- odbc.default_pw string
Passwort, wenn keines in odbc_connect() oder odbc_pconnect() angegeben wird.
- odbc.allow_persistent boolean
Einstellung, ob persistente ODBC-Verbindungen genutzt werden sollen.
- odbc.check_persistent boolean
Aktiviert eine Überprüfung, ob eine persistente Datenbankverbindung noch aktiv ist, bevor sie weitergenutzt wird.
- odbc.max_persistent integer
Die maximale Anzahl von persistenten ODBC-Verbindungen pro Prozess.
- odbc.max_links integer
Die maximale Anzahl von ODBC-Verbindungen pro Prozess, inklusive persistenten Verbindungen.
- odbc.defaultlrl integer
Bestimmt die Anzahl Bytes, mit denen ein LONG-Feld an PHP übergeben wird.
- odbc.defaultbinmode integer
Definiert die Behandlung von Binärdaten.
Resource Typen
Diese Erweiterung definiert keine Resource-Typen.
Vordefinierte Konstanten
Folgende Konstanten werden von dieser Erweiterung definiert und stehen nur zur Verfügung, wenn die Erweiterung entweder statisch in PHP kompiliert oder dynamisch zur Laufzeit geladen wurde.
- ODBC_TYPE (integer)
- ODBC_BINMODE_PASSTHRU (integer)
- ODBC_BINMODE_RETURN (integer)
- ODBC_BINMODE_CONVERT (integer)
- SQL_ODBC_CURSORS (integer)
- SQL_CUR_USE_DRIVER (integer)
- SQL_CUR_USE_IF_NEEDED (integer)
- SQL_CUR_USE_ODBC (integer)
- SQL_CONCURRENCY (integer)
- SQL_CONCUR_READ_ONLY (integer)
- SQL_CONCUR_LOCK (integer)
- SQL_CONCUR_ROWVER (integer)
- SQL_CONCUR_VALUES (integer)
- SQL_CURSOR_TYPE (integer)
- SQL_CURSOR_FORWARD_ONLY (integer)
- SQL_CURSOR_KEYSET_DRIVEN (integer)
- SQL_CURSOR_DYNAMIC (integer)
- SQL_CURSOR_STATIC (integer)
- SQL_KEYSET_SIZE (integer)
- SQL_CHAR (integer)
- SQL_VARCHAR (integer)
- SQL_LONGVARCHAR (integer)
- SQL_DECIMAL (integer)
- SQL_NUMERIC (integer)
- SQL_BIT (integer)
- SQL_TINYINT (integer)
- SQL_SMALLINT (integer)
- SQL_INTEGER (integer)
- SQL_BIGINT (integer)
- SQL_REAL (integer)
- SQL_FLOAT (integer)
- SQL_DOUBLE (integer)
- SQL_BINARY (integer)
- SQL_VARBINARY (integer)
- SQL_LONGVARBINARY (integer)
- SQL_DATE (integer)
- SQL_TIME (integer)
- SQL_TIMESTAMP (integer)
- SQL_TYPE_DATE (integer)
- SQL_TYPE_TIME (integer)
- SQL_TYPE_TIMESTAMP (integer)
- SQL_BEST_ROWID (integer)
- SQL_ROWVER (integer)
- SQL_SCOPE_CURROW (integer)
- SQL_SCOPE_TRANSACTION (integer)
- SQL_SCOPE_SESSION (integer)
- SQL_NO_NULLS (integer)
- SQL_NULLABLE (integer)
- SQL_INDEX_UNIQUE (integer)
- SQL_INDEX_ALL (integer)
- SQL_ENSURE (integer)
- SQL_QUICK (integer)
Inhaltsverzeichnis
- odbc_autocommit — Ändert das Autocommit-Verhalten
- odbc_binmode — Die Behandlung von Binärdaten
- odbc_close_all — Beendet alle ODBC-Verbindungen
- odbc_close — Beendet eine ODBC-Verbindung
- odbc_columnprivileges — Liefert eine Ergebnis-Resource zurück, die eine Liste von Spalten und damit verbundenen Rechten enthält.
- odbc_columns — Lists the column names in specified tables
- odbc_commit — Führt eine ODBC-Transaktion aus
- odbc_connect — Baut die Verbindung zu einer ODBC-Datenquelle auf
- odbc_cursor — Findet den Cursornamen heraus
- odbc_data_source — Returns information about a current connection
- odbc_do — Ein Synonym für odbc_exec()
- odbc_error — Get the last error code
- odbc_errormsg — Get the last error message
- odbc_exec — Bereitet einen SQL-Befehl auf und führt ihn aus
- odbc_execute — Führt ein vorbereiteten SQL-Befehl aus
- odbc_fetch_array — Fetch a result row as an associative array
- odbc_fetch_into — Eine Ergebniszeile in ein Array stellen
- odbc_fetch_object — Fetch a result row as an object
- odbc_fetch_row — Liefert eine Datenzeile zurück
- odbc_field_len — Bestimmt die Länge eines Feldes
- odbc_field_name — Liefert die Spaltenbezeichnung
- odbc_field_num — Liefert die Spaltennummer für eine Spaltenbezeichnung
- odbc_field_precision — Synonym for odbc_field_len()
- odbc_field_scale — Get the scale of a field
- odbc_field_type — Liefert den Datentyp eines Feldes
- odbc_foreignkeys — Returns a list of foreign keys in the specified table or a list of foreign keys in other tables that refer to the primary key in the specified table
- odbc_free_result — Gibt den durch ein Abfrageergebnis belegten Speicher wieder frei
- odbc_gettypeinfo — Returns a result identifier containing information about data types supported by the data source
- odbc_longreadlen — Steuert die Nutzung von LONG-Spalten
- odbc_next_result — Checks if multiple results are available
- odbc_num_fields — Liefert die Anzahl der Ergebnisspalten
- odbc_num_rows — Ergibt die Zeilenzahl des Abfrageergebnisses
- odbc_pconnect — Öffnet eine persistente Datenbankverbindung
- odbc_prepare — Stellt einen SQL-Befehl zur Ausführung bereit
- odbc_primarykeys — Returns a result identifier that can be used to fetch the column names that comprise the primary key for a table
- odbc_procedurecolumns — Retrieve information about parameters to procedures
- odbc_procedures — Get the list of procedures stored in a specific data source
- odbc_result_all — Gibt das aktuelle Abfrageergebnis als HTML-Tabelle aus
- odbc_result — Erlaubt den Zugriff auf die Ergebnisdaten
- odbc_rollback — Hebt eine Transaktion wieder auf
- odbc_setoption — Verändert die ODBC-Einstellungen
- odbc_specialcolumns — Returns either the optimal set of columns that uniquely identifies a row in the table or columns that are automatically updated when any value in the row is updated by a transaction
- odbc_statistics — Retrieve statistics about a table
- odbc_tableprivileges — Lists tables and the privileges associated with each table
- odbc_tables — Get the list of table names stored in a specific data source
I had big performance problems retrieving data form MS SQL Server with odbc only when the query was unsing a join.
I found out, that I had to connect with the cursor-type "SQL_CUR_USE_ODBC" and everything was ok:
$conn = odbc_connect("ShopLive", 'shop', 'xxx', SQL_CUR_USE_ODBC);
I found this to be a perfect alternative to the MaxDB special drivers of version 7.5.00. Just weren't that easy to install on *nix. Windows seems fine. Anyway The ODBC is a perfect alternative for connecting the SAPDB/MaxDB towards PHP.
Installation guide for the odbc alternative (instead of the MAXDB-php driver) can be found here:
http://maxdb.yapabout.com/viewtopic.php?t=21
If you receive an error stating "Connection is busy with results for another hstmt, SQL state S1000 in SQLExecDirect" try opening your odbc connection using the SQL_CURSOR_FORWARD_ONLY option
<?php
$db_link = odbc_connect($dsn, $username, $password, SQL_CURSOR_FORWARD_ONLY)
or die('Error connecting to server. Server says: '.htmlspecialchars(odbc_errormsg()));
?>
In response to Holger's comment about using @@identity:
Be carefull. If the table you're inserting into has a trigger that also inserts into another table that has an identity column you'll get the key of that other table! use scope_identity() instead of @@identity
I searched for the solution of why odbc connection of a network remote drive under Windows + Apache 2.0.X, cannot give the query, but seems no one provides the solution.
In fact, it is very simple.
Go to Control Panal -> Services;
Find and double click "Apache2";
In the page of "Log On", choose Log on as "This account" and give an account in the web server system which have the right to control the network remote drive;
Finally, restart Apache, and that's it.
Ever wonder why you're experiencing really slow data retrieval times using IBM DB2 Universal Database for Linux, UNIX, and Windows? The default cursor type used by Unified ODBC is not supported by DB2, so it gets downgraded to a forward-only cursor -- and that negotiation occurs with every row fetch.
One way to force your PHP applications to use forward-only cursors is to modify your DB2 client configuration with a handy CLI patch2 setting value of 6:
$ db2 UPDATE CLI CONFIGURATION FOR SECTION dbname USING patch2 6
You have to update this client setting on the same machine on which you are running the PHP application. This works on Windows operating systems as well as on Linux & UNIX operating systems.
I ran a few basic benchmarks (fetch 10,000 rows consisting of 3 INTEGER columns from a remote database server) and concluded that this setting can make a major difference to your application speed:
Without CLI patch2 setting: ~22 seconds
With CLI patch2 setting: ~ 1.75 seconds
Note that the drawback of using this patch setting (or any other method of using forward-only cursors) makes odbc_num_rows() always return "-1" for the number of rows affected by a SELECT statement.
If the bundled ODBC library stumbles on some field formats (like some REAL from Pervasive.SQL), have a look at http://odbtp.sourceforge.net/.
After many headaches, I have adoped odbtp: it's a very solid library and best of all it's not tied to a particular OS.
On my search for a function to retriew the NewID of an inserted row wich has an autoincrement I found this solution like the mysql_insert_id for an ODBC connection to MS-Access :
<?
// make your connection below
$Connection = odbc_connect(...);
$Result = odbc_exec($Connection, "select @@identity");
$NewID = odbc_result($Result, 1);
odbc_free_result($Result);
// make here all what you want with the NewID
odbc_close($Connection);
?>
In my mind this should also work with MS-SQL-Server and with Sybase - via ODBC and direct (mssql_.../sybase_...).
HTH ...
Regards
Holger
