As of 09/29/2015 when using the ibm_db2 driver and specifying an invalid library list with the 'i5_libl' option, the connection will be successfully created but with a default library list. What happens is the connection is made and THEN the library list is attempted to be changed. The connection will be a success but the library list change will fail without "db2_conn_error()" or "db2_conn_errormsg()" reporting anything and a default library list will be used. However, "db2_stmt_error()" and "db2_stmt_errormsg()" will register with a value. Also if error reporting is enable, the warning will be output to the screen. This is not a bug, rather intended behavior according to Zend (I opened a ticked) and depending on which library list is used/swapped could lead to major problems (development VS production). I stumbled upon this behavior when an anomaly (which I still can't explain) was imploding my library list with the character 'Z'. I realized I was in my development environment but accessing production data as a result. Going forward I will make sure to add this additional check for good measure.
See below to recreate behavior:
<?php
ini_set("display_errors", 1);
$systemName = 'systemName';
$userID = 'userName';
$password = 'password';
$options['i5_libl'] = implode('Z', array(
'INVALID',
'LIB',
'LIST',
'IMPLODED',
'WITH',
'THE',
'LETTER',
'Z'
));
$options['i5_naming'] = DB2_I5_NAMING_ON;
$conn = db2_connect($systemName, $userID, $password, $options);
//This line causes "ini_set("display_errors", 1)" to dislay this warning on the screen:
//Warning: db2_connect(): Statement Execute Failed in /PATH/TO/FILE/test.php on line 58
if (db2_stmt_error()) { //Evaluates to true
echo "error ID: " . (db2_stmt_error()); //Displays error code: 38501
echo "<br>error message: " . (db2_stmt_errormsg()); //Displays: Trigger program or external routine detected an error. SQLCODE=-443
}
echo "<br />|".db2_conn_error()." ||| ".db2_conn_errormsg()."|<br />"; //Only "| ||| |" is displayed
print_r($conn); //A resource ID is displayed
echo "<br />";
if(isset($conn) && $conn === true){
echo "Boolean true<br />";
//never executes, but not expected since either false or a resource ID should be returned.
//Plus it is clear $conn contains a resource ID from above.
}
if(isset($conn) && $conn == true){
echo "Non-Boolean true 2<br />";
//This always executes regardless of an accurate library list or not
//I suppose "if($conn)" would evaluate to non-boolean true so this makes sense.
}
if(isset($conn) && $conn == "true"){
echo "String true";
//Never executes, but not expected.
}
if(isset($conn) && $conn === false){
echo "Boolean false<br />";
//never executes because the connection itself was a success.
//If invalid credentials were provided this executes.
}
if(isset($conn) && $conn == false){
echo "Non-Boolean false 2<br />";
//never executes because the connection itself was a success.
//Added this here because I was unsure if a boolean false would be returned or not.
//If invalid credentials were provided this executes as well.
}
if(isset($conn) && $conn == "false"){
echo "String false";
//never executes because the connection itself was a success.
//Added this here because I was unsure if a String "false" would be returned
}
?>db2_connect
Почист и полокален преглед на PHP референцата, со задржана структура од PHP.net и подобра читливост за примери, секции и белешки.
db2_connect
Референца за `function.db2-connect.php` со подобрена типографија и навигација.
db2_connect
("PECL ibm_db2" >= 1.0.0)
db2_connect — Враќа врска до база на податоци
= NULL
string
$database,?string
$username,?string
$password,array
$options = []): resource|false
Креира нова врска до база на податоци IBM DB2 Universal Database, IBM Cloudscape или Apache Derby.
Параметри
database-
За каталогизирана врска до база на податоци,
databaseја претставува алијасот на базата на податоци во каталогот на клиентот DB2.За некатализирана врска до база на податоци,
databaseја претставува целосната низа за поврзување во следниот формат:DATABASE=
database;HOSTNAME=hostname;PORT=port;PROTOCOL=TCPIP;UID=username;PWD=password;
каде што параметрите ги претставуваат следните вредности:Забелешка:
При поврзување со Db2 на IBM i, основните системски повици » SQLDriverConnect, кој прифаќа само DSN, UID и PWD за » низа за поврзување. Вака:
DSN=
database;UID=username;PWD=password;database- Името на базата на податоци.
hostname- Име на хост или IP адреса на серверот на базата на податоци.
port- TCP/IP портата на која базата на податоци слуша за барања.
username- Корисничкото име со кое се поврзувате на базата на податоци.
password- Лозинката со која се поврзувате на базата на податоци.
username-
Корисничкото име со кое се поврзувате на базата на податоци.
За некатализирани врски, мора да поминете
nullвредност или празна низа. password-
Лозинката со која се поврзувате на базата на податоци.
За некатализирани врски, мора да поминете
nullвредност или празна низа. options-
Асоцијативен список на опции за поврзување што влијаат на однесувањето на врската, каде што валидните клучеви на списокот вклучуваат:
autocommit-
Поминување на
DB2_AUTOCOMMIT_ONвредноста го вклучува авто-commit за оваа врска. Поминување наDB2_AUTOCOMMIT_OFFвредноста го вклучува авто-комитирањето за оваа конекција. DB2_ATTR_CASE-
Поминување на
DB2_CASE_NATURALвредноста го исклучува авто-комитирањето за оваа конекција. Поминување наDB2_CASE_LOWERвредноста специфицира дека имињата на колоните се враќаат во природна големина. Поминување наDB2_CASE_UPPERвредноста специфицира дека имињата на колоните се враќаат со мали букви. CURSOR-
Поминување на
DB2_FORWARD_ONLYвредноста специфицира дека имињата на колоните се враќаат со големи букви. Поминување наDB2_SCROLLABLEвредноста специфицира курсор само за напред за ресурс на изјава. Овој тип на курсор е стандарден и поддржан на сите серверски бази на податоци.
вредноста специфицира курсор што може да се скрола за ресурс на изјава. Овој режим овозможува случаен пристап до редовите во сет на резултати, но моментално е поддржан само од IBM DB2 Universal Database.
trustedcontext-
Следната нова опција е достапна во верзијата ibm_db2 1.7.0 и понова.
db2_set_option().
Поминувањето на вредноста DB2_TRUSTED_CONTEXT_ENABLE го вклучува доверливиот контекст за оваа конекција. Овој параметар не може да се постави со користење на
Овој клуч работи само ако базата на податоци е каталогизирана (дури и ако базата на податоци е локална), или ако го специфицирате целосниот DSN кога ја креирате врската.
db2 catalog tcpip node loopback remote <SERVERNAME> server <SERVICENAME> db2 catalog database <LOCALDBNAME> as <REMOTEDBNAME> at node loopback db2 "update dbm cfg using svcename <SERVICENAME>" db2set DB2COMM=TCPIP
За да ја каталогизирате базата на податоци, користете ги следните команди:
i5_lib- Следните нови опции за i5/OS се достапни во верзијата ibm_db2 1.5.1 и понова.
i5_naming-
DB2_I5_NAMING_ONВредност од тип карактер што укажува на стандардната библиотека што ќе се користи за решавање на неквалификувани референци на датотеки. Ова не е валидно ако врската користи режим на именување на системот.DB2_I5_NAMING_OFFвредноста го вклучува режимот на именување на системот DB2 UDB CLI iSeries. Датотеките се квалификуваат со користење на разделувачот коса црта (/). Неквалификуваните датотеки се решаваат со користење на списокот на библиотеки за задачата. i5_commit-
На
i5_commitвредноста го исклучува стандардниот режим на именување DB2 UDB CLI, кој е SQL именување. Датотеките се квалификуваат со користење на разделувачот точка (.). Неквалификуваните датотеки се решаваат со користење на стандардната библиотека или тековниот кориснички ID. db2_connect()атрибутот треба да се постави пред db2_connect() . Ако вредноста се промени откако е воспоставена врската, и врската е со оддалечен извор на податоци, промената нема да стапи на сила до следната успешнаЗабелешка: за рачката на конекцијата.
ibm_db2.i5_allow_commitПоставката во php.iniDB2_I5_TXN_NO_COMMITе стандардно, но може да биде надминато соi5_commitoption.DB2_I5_TXN_NO_COMMIT- Контролата на трансакциите не се користи.DB2_I5_TXN_READ_UNCOMMITTED- Можни се неуспешни читања, повторливи читања и призраци.DB2_I5_TXN_READ_COMMITTED- Неуспешни читања не се можни. Повторливи читања и призраци се можни.DB2_I5_TXN_REPEATABLE_READ- Неуспешни читања и повторливи читања не се можни. Призраци се можни.DB2_I5_TXN_SERIALIZABLE- Трансакциите се серијализирани. Неуспешни читања, повторливи читања и призраци не се можни. i5_query_optimize-
DB2_FIRST_IOСите прашања се оптимизирани со цел да се врати првата страница од излезот што е можно побрзо. Оваа цел добро функционира кога излезот е контролиран од корисник кој најверојатно ќе го откаже прашањето откако ќе ја прегледа првата страница од податоците од излезот. Прашањата кодирани со клаузула OPTIMIZE FOR nnn ROWS ја почитуваат целта специфицирана од клаузулата.DB2_ALL_IOСите прашања се оптимизирани со цел да се изврши целото прашање до завршување за најкратко време. Ова е добра опција кога излезот на прашањето се запишува во датотека или извештај, или интерфејсот ги реди податоците од излезот. Прашањата кодирани со клаузула OPTIMIZE FOR nnn ROWS ја почитуваат целта специфицирана од клаузулата. Ова е стандардно. i5_dbcs_alloc-
DB2_I5_DBCS_ALLOC_ONвредноста го вклучува шемата за алокација DB2 6X за раст на големината на колоната за превод на DBCS.DB2_I5_DBCS_ALLOC_OFFвредноста го исклучува шемата за алокација DB2 6X за раст на големината на колоната за превод на DBCS. Забелешка: поставка на php.iniibm_db2.i5_dbcs_allocПоставката во php.iniDB2_I5_DBCS_ALLOC_OFFе стандардно, но може да биде надминато соi5_dbcs_allocoption. i5_date_fmt-
DB2_I5_FMT_ISO- Меѓународната организација за стандардизација (ISO) формат на датум г-гггг-мм-дд се користи. Ова е стандардно.DB2_I5_FMT_USA- Форматот на датум на САД мм/дд/гггг се користи.DB2_I5_FMT_EUR- Европскиот формат на датум дд.мм.гггг се користи.DB2_I5_FMT_JIS- Јапонскиот индустриски стандарден формат на датум г-гггг-мм-дд се користи.DB2_I5_FMT_MDY- Форматот на датум мм/дд/гггг се користи.DB2_I5_FMT_DMY- Форматот на датум дд/мм/гггг се користи.DB2_I5_FMT_YMD- Форматот на датум гг/мм/дд се користи.DB2_I5_FMT_JUL- Јулијанскиот формат на датум гг/ддд се користи.DB2_I5_FMT_JOB- Се користи стандардното поставување на задачата. i5_date_sep-
DB2_I5_SEP_SLASH- Коса црта ( / ) се користи како разделувач на датум. Ова е стандардно.DB2_I5_SEP_DASH- Коса црта ( / ) се користи како разделувач на датум. Ова е стандардно.DB2_I5_SEP_PERIOD- Цртичка ( - ) се користи како разделувач на датум.DB2_I5_SEP_COMMA- Точка ( . ) се користи како разделувач на датум.DB2_I5_SEP_BLANK- Запирка ( , ) се користи како разделувач на датум.DB2_I5_SEP_JOB- Празно место се користи како разделувач на датум. i5_time_fmt-
DB2_I5_FMT_ISOСтандардното за работа се користиDB2_I5_FMT_USA- Меѓународната организација за стандардизација (ISO) формат на време hh.mm.ss се користи. Ова е стандардно.DB2_I5_FMT_EUR- Форматот на време hh:mmxx во САД се користи, каде што xx е AM или PM.DB2_I5_FMT_JIS- Европскиот формат на време hh.mm.ss се користи.DB2_I5_FMT_HMS- Јапонскиот индустриски стандарден формат на време hh:mm:ss се користи. i5_time_sep-
DB2_I5_SEP_COLON- Форматот hh:mm:ss се користи.DB2_I5_SEP_PERIOD- Двоеточие ( : ) се користи како разделувач на време. Ова е стандардно.DB2_I5_SEP_COMMA- Точка ( . ) се користи како разделувач на време.DB2_I5_SEP_BLANK- Запирка ( , ) се користи како разделувач на време.DB2_I5_SEP_JOB- Се користи стандардното поставување на задачата. i5_decimal_sep-
DB2_I5_SEP_PERIOD- Празно место се користи како разделувач на време.DB2_I5_SEP_COMMA- Точка ( . ) се користи како разделувач на децимали. Ова е стандардно.DB2_I5_SEP_JOB- Се користи стандардното поставување на задачата.
- Запирка ( , ) се користи како разделувач на децимали.
i5_libl-
Следната нова опција i5/OS е достапна во верзијата ibm_db2 1.8.0 и понова.
Забелешка:
i5_liblВредност на карактер што го означува списокот на библиотеки што ќе се користи за решавање на неквалификувани референци на датотеки. Наведете ги елементите на списокот на библиотеки разделени со празни места 'i5_libl'=>"MYLIB YOURLIB ANYLIB".
Вратени вредности
Враќа ресурс за рачка за поврзување ако обидот за поврзување е успешен. Ако обидот за поврзување не успее, db2_connect()
returns false.
Примери
Враќа ресурс за рачка за поврзување ако обидот за поврзување е успешен. Ако обидот за поврзување не успее,
Пример #1 Создавање каталогизирана врска
<?php
$database = 'SAMPLE';
$user = 'db2inst1';
$password = 'ibmdb2';
$conn = db2_connect($database, $user, $password);
if ($conn) {
echo "Connection succeeded.";
db2_close($conn);
}
else {
echo "Connection failed.";
}
?>Пример #1 Пример што покажува затворачка ознака што го опфаќа последниот нов ред
Connection succeeded.
Каталогизираните врски бараат претходно да сте го каталогизирале целниот податочен базен преку DB2 Command Line Processor (CLP) или DB2 Configuration Assistant.
Пример #2 Создавање некатализирана врска
<?php
$database = 'SAMPLE';
$user = 'db2inst1';
$password = 'ibmdb2';
$hostname = 'localhost';
$port = 50000;
$conn_string = "DRIVER={IBM DB2 ODBC DRIVER};DATABASE=$database;" .
"HOSTNAME=$hostname;PORT=$port;PROTOCOL=TCPIP;UID=$user;PWD=$password;";
$conn = db2_connect($conn_string, '', '');
if ($conn) {
echo "Connection succeeded.";
db2_close($conn);
}
else {
echo "Connection failed.";
}
?>Пример #1 Пример што покажува затворачка ознака што го опфаќа последниот нов ред
Connection succeeded.
Некатализираната врска ви овозможува динамички да се поврзете со податочен базен.
Пример #3 Создавање врска со авто-комит исклучен по дифолт db2_connect() Проследување на низа од опции до
<?php
$database = 'SAMPLE';
$user = 'db2inst1';
$password = 'ibmdb2';
$options = array('autocommit' => DB2_AUTOCOMMIT_OFF);
$conn = db2_connect($database, $user, $password, $options);
if ($conn) {
echo "Connection succeeded.\n";
if (db2_autocommit($conn)) {
echo "Autocommit is on.\n";
}
else {
echo "Autocommit is off.\n";
}
db2_close($conn);
}
else {
echo "Connection failed.";
}
?>Пример #1 Пример што покажува затворачка ознака што го опфаќа последниот нов ред
Connection succeeded. Autocommit is off.
ви овозможува да го промените стандардното однесување на рачката за поврзување.
Пример #4 i5/OS најдобра изведба db2_connect().
<?php
$library = "ADC";
$i5 = db2_connect("", "", "", array("i5_lib"=>"qsys2"));
$result = db2_exec($i5,
"select * from systables where table_schema = '$library'");
while ($row = db2_fetch_both($result)) {
echo $row['TABLE_NAME']."</br>";
}
db2_close($i5);
?>Пример #1 Пример што покажува затворачка ознака што го опфаќа последниот нов ред
ANIMALS NAMES PICTURES
За да постигнете најдобра изведба за вашата i5/OS ibm_db2 1.5.1 PHP апликација, користете го стандардниот хост, корисничко име и лозинка за вашиот
Пример #5 Користење доверлив контекст
<?php
$database = "SAMPLE";
$hostname = "localhost";
$port = 50000;
$authID = "db2inst1";
$auth_pass = "ibmdb2";
$tc_user = "tcuser";
$tc_pass = "tcpassword";
$dsn = "DATABASE=$database;HOSTNAME=$hostname;PORT=$port;
PROTOCOL=TCPIP;UID=$authID;PWD=$auth_pass;";
$options = array ("trustedcontext" => DB2_TRUSTED_CONTEXT_ENABLE);
$tc_conn = db2_connect($dsn, "", "", $options);
if($tc_conn) {
echo "Explicit trusted connection succeeded.\n";
if(db2_get_option($tc_conn, "trustedcontext")) {
$userBefore = db2_get_option($tc_conn, "trusted_user");
//Do some work as user 1.
//Switching to trusted user.
$parameters = array("trusted_user" => $tc_user,
"trusted_password" => $tcuser_pass);
$res = db2_set_option ($tc_conn, $parameters, 1);
$userAfter = db2_get_option($tc_conn, "trusted_user");
//Do more work as trusted user.
if($userBefore != $userAfter) {
echo "User has been switched." . "\n";
}
}
db2_close($tc_conn);
}
else {
echo "Explicit trusted connection failed.\n";
}
?>Пример #1 Пример што покажува затворачка ознака што го опфаќа последниот нов ред
Explicit trusted connection succeeded. User has been switched.
Види Исто така
- db2_close() - Затвора врска со база на податоци
- db2_pconnect() - Враќа постојана врска со база на податоци