db2_connect () возвращает идентификатор ресурса, несмотря на ошибку

Я работаю на AS / 400 V7R2, используя драйвер ibm_db2 из сценария PHP.

Я заметил, что если я передам неверный список библиотек db2_connect() с i5_libl Если оставшаяся часть строки подключения верна, она все равно будет возвращать идентификатор ресурса, несмотря на сообщение об ошибке ini_set("display_errors", 1);, К тому же, db2_conn_error() а также db2_conn_errormsg() не содержат ничего С другой стороны, когда я предоставляю действительный список библиотек, мой IF операторы оценивают одинаково точно, единственное отличие — ошибка не выводится на экран ini_set("display_errors", 1);

Я понял, что вместо сбоя из-за неверного списка библиотек он вместо этого устанавливает соединение, используя список библиотек по умолчанию для предоставленного имени пользователя БД. Это может быть страшно для меня, потому что если по какой-то причине мой список библиотек будет недействительным, он по умолчанию будет неправильным списком (основной проблемой является сочетание среды разработки и производства).

Кто-нибудь еще может воспроизвести это поведение? Я не знаю, является ли это только моей системой, и мне нужен PTF, или это типично. Как вы проверяете, установлено ли соединение DB2 с заданными параметрами?

Код для воспроизведения (замените имя системы, имя пользователя и пароль соответственно):

<?php
ini_set("display_errors", 1);
$systemName = 'yourSystemName';
$userID = 'yourUserID';
$password = 'yourPassword';
$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);
//The error output to the screen at this point from `ini_set("display_errors", 1);` is:
//Warning: db2_connect(): Statement Execute Failed in /PATH/TO/FILE/test.php on line 58

echo "<br />|".db2_conn_error()." ||| ".db2_conn_errormsg()."|<br />"; //This displays as "| ||| |"print_r($conn); //This prints out a resource ID
echo "<br />";

if(isset($conn) && $conn === true){
//Expected to not pass since either false or a resource ID is supposed to be returned.
//Evaluated to false.
echo "Boolean true<br />";
}
if(isset($conn) && $conn == true){
//Despite the connection failing according to `ini_set("display_errors", 1)` and a resource ID being reportedly returned
//this evaluates to true and "Non-Boolean true 2" echos out to the screen.
echo "Non-Boolean true 2<br />";
}
if(isset($conn) && $conn == "true"){
//Evaluates to false. db2_connect() returns a resource ID on success, so I did not expect this to evaluate to true.
echo "String true";
}
if(isset($conn) && $conn === false){
//Expected for this to evaluate to true since an error was logged by ini_set("display_errors", 1)
//This did not evaluate to true.
echo "Boolean false<br />";
}
if(isset($conn) && $conn == false){
//Just checking to see if a non-Boolean false was returned.  Evaluates to false.
echo "Non-Boolean false 2<br />";
}
if(isset($conn) && $conn == "false"){
//Just checking to see if the string "false" was returned.  Evaluates to false.
echo "String false";
}
?>

0

Решение

Я закончил тем, что открыл билет с Zend, и оказывается, что это — предполагаемое поведение.

Как мы знаем i5_libl варианты звонков qsys2/qcmdexc('cmd',cmdlen) в соответствии с http://php.net/manual/en/function.db2-connect.php. Но логически соединение должно быть установлено, чтобы он знал, на какое задание QSQSRVR нужно изменить список библиотек. Вместо того, чтобы закрывать соединение при сбое, он просто выдает предупреждение и db_conn_error() а также db2_connerrormsg() сообщить все как обычно.

К счастью, это регистрируется как ошибка оператора, и это можно обнаружить с помощью следующего:

if (db2_stmt_error()) {
echo "error ID: " . (db2_stmt_error());
echo "<br>error message: " . (db2_stmt_errormsg());
}

Я предложил Zend закрыть соединение или вызвать ошибку соединения или что-то еще. Я не могу вспомнить ни одного экземпляра, в котором я хотел бы подключиться к БД с помощью списка библиотек, отличного от указанного, без какого-либо предупреждения или явного уведомления. Это может привести к катастрофе, если данные о разработке и производстве переплетаются друг с другом.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]