我在 PHP 应用程序中使用 Oracle 数据库。
用户尝试连接到 PHP 应用程序。他的密码已过期,但他的用户配置文件的宽限期不为空,因此他仍然可以连接到应用程序。
我想做的是认识到这个用户应该更改他的密码并向他显示一条消息。
我已经尝试过oci_error()
,但它没有返回任何内容,因为与该用户连接到数据库没有失败。
我想抓住 ORA-28001(和 ORA-28002)
不幸的是,我无法对数据库本身的结构进行任何更改(添加额外的表或额外的字段)。
扩展 Narf 的答案,这对我适用于 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
尝试在执行时启用警告oci_connect()
,然后使用自定义错误处理程序捕获它们(确保在连接时没有忽略 @ 错误)。这可能需要您调整 php.ini 中的 oci 扩展设置。
见OCILogon 问题 - Oracle 密码过期一个非常相似的问题,有解决办法。应该在当前的 php 版本中工作。在宽限期内也非常类似于OCILogon - ORA-28002on SO