Я работаю на 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";
}
?>
Я закончил тем, что открыл билет с 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 закрыть соединение или вызвать ошибку соединения или что-то еще. Я не могу вспомнить ни одного экземпляра, в котором я хотел бы подключиться к БД с помощью списка библиотек, отличного от указанного, без какого-либо предупреждения или явного уведомления. Это может привести к катастрофе, если данные о разработке и производстве переплетаются друг с другом.
Других решений пока нет …