как поймать в PHP сообщение о льготном периоде oracle?
Я использую базу данных Oracle в приложении PHP.
Пользователь пытается подключиться к приложению PHP. Срок действия его пароля истек, но льготный период для профиля его пользователя не равен нулю, поэтому он все еще может подключиться к приложению.
Что я хотел бы сделать, так это признать, что этот пользователь должен изменить свой пароль и отобразить ему сообщение.
Я пробовал с oci_error()
, но он ничего не возвращает, так как не было сбоя при подключении к базе данных с помощью этого пользователь.
Я хотел бы поймать ORA-28001 (и ORA-28002)
К сожалению, я не могу изменить структуру самой базы данных (добавить дополнительную таблицу или дополнительное поле).
3 answers
Расширяя ответ Нарфа, это работает для меня с Oracle 11.2
<?php
function my_error_handler($errno, $errstr, $errfile, $errline) {
if (preg_match('/ORA-28002: [ a-zA-Z]*([0-9])+/', $errstr, $matches)) {
echo "Your password will expire within ${matches[1]} days\n";
}
}
set_error_handler("my_error_handler", E_WARNING);
$c = @oci_connect("hr", "welcome", "localhost/XE");
if (!$c) {
$m = oci_error();
echo "Connection failed: " . $m['message'] . "\n";
} else {
echo "Connected OK\n";
// Prove the connection is valid
$s = oci_parse($c, "select 'Query is OK' as c from dual");
oci_execute($s);
$r = oci_fetch_array($s, OCI_ASSOC);
echo $r['C'] . "\n";
}
restore_error_handler();
?>
Его вывод для пароля в льготный период:
Your password will expire within 1 days
Connected OK
Query is OK
См. Проблема Ocilogon - истечение срока действия пароля Oracle очень похожая проблема с решением. Должен работать в текущей версии php. Также очень похоже на Окилогон во время льготного периода - ORA-28002, ТАК ЧТО
Попробуйте включить предупреждения при выполнении oci_connect()
, а затем перехватывать их с помощью пользовательского обработчика ошибок (убедитесь, что вы не игнорируете ошибки с помощью @при подключении). Это может потребовать, чтобы вы также изменили настройки расширения oci в php.ini.